ruby-on-rails - que - ruby on rails tutorial
Navegación segura equivalente a los rieles que intentan los hashes. (4)
Pre Ruby 2.3
Usualmente pongo algo como esto en mi intializador:
Class Hash
def deep_fetch *args
x = self
args.each do |arg|
x = x[arg]
return nil if x.nil?
end
x
end
end
y entonces
response.deep_fetch ''PaReqCreationResponse'', ''ThreeDSecureVERes'', ''Message'', ''VERes'', ''CH'', ''enrolled''
en un caso loco
El consenso general en la comunidad parece ser evitar tanto el intento como el operador solitario &.
Ruby 2.3 y posteriores
Hay un método de Hash#dig
ahora que hace eso:
Recupera el objeto de valor correspondiente a cada objeto clave repetidamente.
h = { foo: {bar: {baz: 1}}}
h.dig(:foo, :bar, :baz) #=> 1
h.dig(:foo, :zot) #=> nil
http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig
En Rails, puedes hacer hash.try(:[], :key)
que ayuda si el hash
es potencialmente nil
. ¿Existe una versión equivalente para usar el nuevo operador de navegación segura Ruby 2.3 &.
con []
?
La respuesta aceptada no se tendrá en cuenta cuando el hash
sea nulo ...
Puede volver a escribir lo que tiene utilizando el operador de navegación segura antes de .try
y eso funcionará
hash&.try(:[], :key)
pero también puedes usar:
http://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig
Una forma de hacer esto en un hash es haciendo ...
hash&.dig(:key1, :key2 ...)
que devolverá nulo si no está presente ninguna extracción de clave.
{ key1: { key2: ''info'' } }
devolvería ''info''
{ key1: { wrong_key: ''info'' } }
volvería a nil
Mientras que hash&.[](:key)
es elegante para el rubyista entrenado, solo uso hash && hash[:key]
porque se lee mejor y de forma más intuitiva para el programador que viene después de mí, que puede que no esté tan familiarizado con el complejidades de rubí. Algunos caracteres adicionales en el código base a veces pueden ahorrar mucho googlear para otra persona.
(Dado el contexto en el que desea usar esto está en una declaración condicional, por supuesto).
&.
no es equivalente al try
Rails, pero puedes usar &.
Para hashes. Solo úsalo, nada especial.
hash[:key1]&.[](:key2)&.[](:key3)
Aunque no haría eso.