2009-11-15 5 views
5

Ich bin mir bewusst, wie funktioniert include?, aber nicht wirklich klar mit multidimensionalen Array oder ein Hash (ist dies mit einem Hash möglich?)mit `include?` In Ruby zu überprüfen, ob etwas in einem Hash ist

Zum Beispiel gegeben ich einen Hash haben, die wie folgt aussieht:

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

Kann ich sehen, ob es ein Objekt mit der ID von 1 in es so ist?

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

Es scheint nicht zu funktionieren, wie kann ich diese Methode richtig schreiben?

Antwort

13

Das ist nicht gültig Ruby-Syntax. Sie möchten:

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

Dank bob! Ich denke, es war Wunschdenken, dass ich jeden Hash als Array behandeln könnte. –

+1

Nun, die von Ihnen verwendete Syntax war aus zwei Gründen falsch. Erstes '(: id => 1)' wird nicht zu einem Ausdruck (oder irgendetwas anderem) aufgelöst. Und zweitens hast du 'Array # include?' Genannt, anstatt 'Hash # include?'. Und schließlich ist 'Hash # include?' Nur ein Alias ​​für 'Hash # has_key?' –

+1

Tatsächlich ist der (: id => 1) Teil syntaktisch gültig. Ruby erkennt dies als Abkürzung für ({: id => 1}), wie Sie sehen können, wenn Sie 'badges.include? (: Id => 1,: name => 'blahh',: description => 'blah bla bla ') ', die' wahr 'zurückgibt. Also das Problem hier, genauer gesagt, war, dass "Array # include?" Nur die exakte Übereinstimmung der Elemente, und Sie versuchten, eine teilweise Übereinstimmung zu tun. Also 'any?', Weil Sie einen Block statt nur einen Wert übergeben können. Wenn Sie den passenden Hash zurückgeben müssen, anstatt nur zu prüfen, ob einer existiert, ersetzen Sie 'any' durch' find'. –

Verwandte Themen