de Hash no lo hace trabaja como lo esperas. Cuando usted dice h[k]
, el proceso es así:
- Si tenemos una clave
k
, devolver su valor.
- Si tenemos un valor predeterminado para el Hash, devuelva ese valor predeterminado.
- Si tenemos un bloque para proporcionar valores predeterminados, ejecute el bloque y devuelva su valor de retorno.
Tenga en cuenta que (2) y (3) no dicen nada sobre la inserción de k
en el hash. El valor por defecto se convierte esencialmente en h[k]
esto:
h.has_key?(k) ? h[k] : the_default_value
Así que simplemente accediendo a una clave inexistente, y obtener el valor por defecto de atrás no se agregará la clave que falta a la Hash.
Por otra parte, nada de la forma:
Hash.new([ ... ])
# or
Hash.new({ ... })
es casi siempre un error, ya que va a compartir exactamente la misma matriz por defecto o por Hash para todos los valores por defecto. Por ejemplo, si usted hace esto:
h = Hash.new(['a'])
h[:k].push('b')
Entonces h[:i]
, h[:j]
, ... todos volveremos ['a', 'b']
y que rara vez es lo que quiere.
Creo que estás en busca de la block form of the default value:
h = Hash.new { |h, k| h[k] = [ 'alright' ] }
que va a hacer dos cosas:
- Acceso a una clave inexistente va a añadir que la clave para el hash y que tendrá la matriz proporcionada como su valor.
- Todos los valores predeterminados serán objetos distintos, por lo que alterar uno no alterará el resto.
Pregunta legítima, pero es probable que sea un duplicado. –