2009-11-15 16 views
5

Sono a conoscenza di come funziona include?, tuttavia non è davvero chiaro utilizzarlo con un array multidimensionale o un hash (è possibile con un hash?)utilizzando `include?` In ruby ​​per verificare se qualcosa è in un hash

Ad esempio, dato che ho un hash che assomiglia:

@user.badges => [{:id => 1, :name => 'blahh', :description => 'blah blah blah'}, {:id => 2, :name => 'blahh', :description => 'blah blah blah'}]

Posso vedere se ha un oggetto con l'id di 1 in esso come questo?

if @user.badges.include?(:id => 1) 
    # do something 
end 

Non sembra funzionare, come posso scrivere correttamente questo metodo?

risposta

13

Questo non è valido Sintassi di Ruby. Volete:

@user.badges.any? { |b| b[:id] == 1 } 
+0

Grazie bob! Immagino sia stato un pio desiderio poter trattare qualsiasi hash come un array. –

+1

Beh, la sintassi che hai usato era sbagliata per due ragioni. Prima '(: id => 1)' non risolve un'espressione (o qualsiasi altra cosa per quella materia). E in secondo luogo, hai chiamato "Array # include?", Piuttosto che "Hash # include?". E infine, "Hash # include?" È semplicemente un alias per "Hash # has_key?" –

+1

In realtà, la parte (: id => 1) è sintatticamente valida. Ruby riconosce questo come una scorciatoia per ({: id => 1}), come puoi vedere se fai 'badges.include? (: Id => 1,: name => 'blahh',: description => 'blah blah blah ') ', che restituirà' true'. Quindi il problema qui, più precisamente, era che "Array # include?" Esegue solo la corrispondenza esatta degli elementi e si stava tentando di eseguire una corrispondenza parziale. Quindi 'any?', Perché si passa a passarlo un blocco invece di un valore. Se è necessario restituire l'hash di corrispondenza, invece di controllare se ne esiste uno, si sostituirà "any?" Con 'find'. –

Problemi correlati