2013-06-29 4 views
6

Sto cercando di evitare un messaggio di errore quando si estrae da un hash che può avere o meno un valore. O voglio che restituisca il valore o restituisca nil.Metodo `try` quando si cerca di recuperare il valore hash

Ho pensato che il metodo try avrebbe funzionato, ma sto ancora ricevendo un errore.

key not found: "en" 

mio hash è una colonna hstore chiamato content ... content['en'], ecc

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

metodo Prova

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

Ho pensato che questo avrebbe funzionato, ma non è così. In quale altro modo posso restituire un nil invece di un errore?

Inoltre, il campo contenuto stesso potrebbe anche essere nil così chiamando content['en'] tiri:

undefined method `content' for nil:NilClass 

risposta

17

Se è necessario per consentire la object.content.nil?, allora devi usare try. Se si desidera consentire una chiave mancante, non si desidera fetch (come Priti notes), si desidera il normale metodo []. Combinando i due rendimenti:

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

Rispettare:

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

Si potrebbe anche usare object.content.try(:fetch, 'en', nil) se :[] sembra che si sta prendendo in giro.

+2

* Si potrebbe anche usare 'object.content.try (: fetch, 'en', nil)' se ': []' sembra che ti stia prendendo in giro. * - Mi piace questa tua affermazione .. 'Hash # fetch', il mio metodo preferito .. :)) –

3

Proprio uso normale indicizzazione:

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

woops, ho dimenticato un dettaglio importante nella mia domanda. se il contenuto stesso è un contenuto nullo ['en'] genererà un errore del metodo non definito. – holden

+0

@Holden: oh capisco. Scusate. – Linuxios

+0

no, la tua risposta ha aiutato a migliorare la mia domanda e ottenere la risposta di cui avevo bisogno! Grazie – holden

8

Vedi l'Hash#fetch

Restituisce un valore dall'hash per la chiave data. Se la chiave non può essere trovata, ci sono diverse opzioni: Senza altri argomenti, solleverà un'eccezione KeyError; se viene fornito un valore predefinito, verrà restituito; se viene specificato il blocco di codice opzionale, verrà eseguito e verrà restituito il risultato.

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

in modo da utilizzare:

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

+1' h.fetch ('z', nil) 'sarebbe la versione di lancio non eccezionale quindi. –

+0

@JoachimIsaksson Sono stato in ritardo per aggiornarlo qui .. come il mio editore impiccato ..: (( –

2

A partire da Ruby 2.0, l'utilizzo di try su un eventuale nil hash non è accurato. È possibile utilizzare NilClass#to_h. E per la restituzione di nil in assenza di chiave, è esattamente ciò che è per [], a differenza di ciò che è fetch.

@object.content.to_h["en"]