2010-09-16 9 views

risposta

11

grep è definito in Enumerable, vale a dire è un metodo generico che non sa nulla di Hash es. Funziona su qualunque siano gli elementi dello Enumerable. Ruby non ha un tipo per coppie chiave-valore, rappresenta semplicemente le voci Hash come matrici a due elementi in cui il primo elemento è la chiave e il secondo elemento è il valore.

grep utilizza il metodo === per filtrare gli elementi. E dal momento che né

/a/ === ['a', 'b'] 

/b/ === ['a', 'b'] 

sono vere, si ottiene sempre un array vuoto come risposta.

Prova questo:

def (t = Object.new).===(other) 
    true 
end 

{'a' => 'b'}.grep t 
# => [['a', 'b']] 

Qui si può vedere come grep opere con Hash es.

+0

Grazie, vedo che === è definito per Object, ma non sovrascritto per Hash, quindi non è davvero significativo. Ma almeno ora vedo che: {'a' => 'b'}. Grep Array ... => [["a", "b"]] – user258980

+3

@ user258980: Il fatto che 'Hash # === 'non è definito è completamente irrilevante, dal momento che non stai chiamando' Hash # === ', stai chiamando' Hash # grep'. 'Hash # grep' chiama quindi il metodo' === 'di qualunque oggetto vi sia passato. Nel tuo esempio, quell'oggetto è '/ a /', quindi 'Hash # grep' finisce per chiamare' Regexp # === 'passando ogni elemento a turno. Poiché questi elementi sono matrici a due elementi e un 'Regexp' ovviamente non può mai corrispondere a un array, solo stringhe, il risultato sarà sempre vuoto. –

+0

Grazie per il chiarimento. – user258980