Ruby per impostazione predefinita non include il metodo []
per NilClass
Ad esempio, per verificare se foo["bar"]
esiste quando foo
può essere nullo, devo fare:
foo = something_that_may_or_may_not_return_nil
if foo && foo["bar"]
# do something with foo["bar"] here
end
Se definisco questo metodo:
class NilClass
def [](arg)
nil
end
end
Qualcosa del genere lo renderebbe possibile, anche se foo
è nullo:
if foo["bar"]
# do something with foo["bar"]
end
O anche:
if foo["bar"]["baz"]
# do something with foo["bar"]["baz"] here
end
Domanda: È una buona idea o c'è qualche ragione per cui ruby non include questa funzionalità di default?
EDIT di luglio 2017: il mio reclamo principale è stato l'ingombrante% di idioma% di carattere necessario per accedere ai valori annidati quando in qualsiasi momento il valore potrebbe essere foo && foo["bar"] && foo ["bar"]["baz"]
. A partire da Ruby 2.3, Matrice # array e Hash#dig esiste , che risolve la mia preoccupazione. Ora posso usare il seguente idioma!
if foo && foo.dig("bar", "baz")
# do something
end
# Note that errors will still occur if a value isn't what you expect. e.g.
foo = { "a" => { "b" => "c" } }
foo && foo.dig("a", "b", "c") # raises TypeError: String does not have #dig method