validar update metodos example create array arrays ruby hash

arrays - update - ¿Cómo uso `Array#dig` y` Hash#dig` introdujo en Ruby 2.3?



update hash ruby (2)

En nuestro caso, las NoMethodError s nil son, con mucho, los errores más comunes que vemos en nuestros entornos de producción.

El nuevo Hash#dig permite omitir las comprobaciones nil cuando se accede a elementos anidados. Como los hashes se usan mejor cuando la estructura de los datos es desconocida o volátil, contar con soporte oficial para esto tiene mucho sentido.

Tomemos su ejemplo. El seguimiento:

user.dig(:user, :address, :street1)

No es equivalente a:

user[:user][:address][:street1]

En el caso donde el user[:user] o el user[:user][:address] es nil , esto dará como resultado un error de tiempo de ejecución.

Más bien, es equivalente a lo siguiente, que es el idioma actual:

user[:user] && user[:user][:address] && user[:user][:address][:street1]

Observe cómo es trivial pasar una lista de símbolos que se creó en otro lugar en Hash#dig , mientras que no es muy sencillo recrear el último constructo a partir de dicha lista. Hash#dig permite hacer acceso dinámico sin tener que preocuparse por referencias nil .

Clearly Hash#dig también es mucho más corto.

Un punto importante a tener en cuenta es que Hash#dig sí mismo devuelve nil si alguna de las claves resulta ser, lo que puede conducir a la misma clase de errores un paso más abajo, por lo que puede ser una buena idea proporcionar un por defecto sensato (Esta forma de proporcionar un objeto que siempre responde a los métodos esperados se denomina Patrón de objeto nulo ).

Nuevamente, en su ejemplo, una cadena vacía o algo así como "N / A", dependiendo de lo que tenga sentido:

user.dig(:user, :address, :street1) || ""

Ruby 2.3 introduce un nuevo método en Array y Hash llamado dig . Los ejemplos que he visto en las publicaciones de blog sobre la nueva versión son artificiales y complicados:

# Hash#dig user = { user: { address: { street1: ''123 Main street'' } } } user.dig(:user, :address, :street1) # => ''123 Main street'' # Array#dig results = [[[1, 2, 3]]] results.dig(0, 0, 0) # => 1

No estoy utilizando matrices planas de triple anidación. ¿Cuál es un ejemplo realista de cómo esto sería útil?

ACTUALIZAR

Resulta que estos métodos resuelven una de las preguntas más frecuentes de Ruby. Las preguntas a continuación tienen algo así como 20 duplicados, todos los cuales se resuelven usando dig :

¿Cómo evitar NoMethodError para elementos faltantes en hash anidados, sin repetidos controles nulos?

Ruby Style: cómo verificar si existe un elemento hash anidado


Una forma sería en conjunción con la lectura del operador splat de algún modelo de documento desconocido.

some_json = JSON.parse( ''{"people": {"me": 6, ... } ...}'' ) # => "{"people" => {"me" => 6, ... }, ... } a_bunch_of_args = response.data[:query] # => ["people", "me"] some_json.dig(*a_bunch_of_args) # => 6