2013-06-29 6 views
6

Ich versuche, eine Fehlermeldung zu vermeiden, wenn Sie von einem Hash-Wert ziehen, der einen Wert haben kann oder nicht. Ich möchte entweder den Wert zurückgeben oder null zurückgeben.`try` Methode beim Versuch, Hash-Wert zu holen

Ich dachte, die try Methode würde es tun, aber ich bekomme immer noch einen Fehler.

key not found: "en" 

Mein Hash ist eine hstore Spalte content ... content['en'] usw. genannt

content = {"es"=>"This is an amazing event!!!!!", "pl"=>"Gonna be crap!"} 

Try Methode

@object.content.try(:fetch, 'en') # should return nil, but errors even with try method 

Ich dachte, das funktionieren würde, aber es funktioniert nicht. Wie kann ich sonst einen nil anstelle eines Fehlers zurückgeben?

Auch das Inhaltsfeld selbst auch sein könnte nil so nennen content['en'] wirft:

undefined method `content' for nil:NilClass 

Antwort

17

Wenn Sie object.content.nil? erlauben müssen, dann würden Sie try verwenden. Wenn Sie einen fehlenden Schlüssel zulassen wollen, dann wollen Sie nicht fetch (wie Priti notes), wollen Sie die normale [] Methode. Die Kombination der beiden ergibt:

object.content.try(:[], 'en') 

beachten:

> h = { :a => :b } 
=> {:a=>:b} 
> h.try(:[], :a) 
=> :b 
> h.try(:[], :c) 
=> nil 
> h = nil 
=> nil 
> h.try(:[], :a) 
=> nil 

Sie auch object.content.try(:fetch, 'en', nil) wenn :[] sieht aus wie es Sie verhöhnt nutzen könnten.

+2

) * Sie könnten auch 'object.content.try (: fetch, 'en', nil)' 'if': [] 'sieht so aus, als würde es Sie verspotten. * - Ich mag Ihre This-Anweisung .. 'Hash # fetch', meine Lieblingsmethode .. :)) –

3

Verwenden Sie einfach normale Indizierung:

content['en'] #=> nil 
+0

wops, ich habe ein wichtiges Detail in meiner Frage vergessen. Wenn der Inhalt selbst kein Inhalt ist, wirft [en] einen nicht definierten Methodenfehler. – holden

+0

@Holden: Oh ich verstehe. Es tut uns leid. – Linuxios

+0

gar nicht, Ihre Antwort half, meine Frage zu verbessern und die Antwort zu bekommen, die ich brauchte! Danke – holden

8

Siehe Hash#fetch

Gibt einen Wert zurück aus dem Hash für den angegebenen Schlüssel. Wenn der Schlüssel nicht gefunden werden kann, gibt es mehrere Optionen: Ohne weitere Argumente wird eine KeyError-Ausnahme auslösen; Wenn der Standardwert angegeben ist, wird dieser zurückgegeben. Wenn der optionale Codeblock angegeben ist, wird dieser ausgeführt und sein Ergebnis zurückgegeben.

h = { "a" => 100, "b" => 200 } 
h.fetch("z") 
# ~> -:17:in `fetch': key not found: "z" (KeyError) 

So verwenden:

h = { "a" => 100, "b" => 200 } 
h.fetch("z",nil) 
# => nil 
h.fetch("a",nil) 
# => 100 
+1

+1' h.fetch ('z', nil) 'wäre die nicht-Ausnahme werfen Version dann. –

+0

@JoachimIsaksson Ich war spät zu aktualisieren, dass hier .. als mein Editor hanged ..: (( –

2

Ab Ruby 2.0, mit try auf einem möglicherweise nil Hash ist nicht sauber. Sie können NilClass#to_h verwenden. Und für die Rückgabe nil, wenn es keinen Schlüssel gibt, ist genau das, was [] ist, im Gegensatz zu was fetch ist für.

@object.content.to_h["en"] 
Verwandte Themen