¿Alguien puede mostrarme un rubí manera de comprobar si una clave existe en un hash, y si no, a continuación, darle un valor predeterminado. Estoy suponiendo que no es un forro con menos de hacer esto, pero no estoy seguro de cuál utilizar.

InformationsquelleAutor Steve | 2012-02-02

5 Comentarios

  1. 48

    Si usted ya tiene un hash, usted puede hacer esto:

    h.fetch(key, "default value")

    O explotar el hecho de que un no-existente tecla volverá nil:

    h[key] || "default value"

    Para crear hashes con valores por defecto depende de lo que quieres hacer exactamente.

    • Independiente de la clave y no serán almacenados:

      h = Hash.new("foo")
      h[1] #=> "foo"
      h #=> {}
    • Depende de la clave y serán almacenados:

      h = Hash.new { |h, k| h[k] = k * k } 
      h[2] #=> 4
      h #=> {2=>4}
    • El uso de h[clave] || «valor predeterminado» no es ahorrar, si ya hay de falso en él, será anulado
    • Es por eso que la puse en una lista como una de varias posibilidades. En general la gente tiene una idea de lo que los valores de sus guiones van a ser igual, si sabes que no se va a guardar valores booleanos, es perfectamente correcto enfoque.
  2. 19

    Constructor de Hash clase aceptar un valor predeterminado, mismo que será devuelto si se encuentra una coincidencia clave no se encuentra.

    h = Hash.new("default")
    
    h.has_key?("jake")
    => false
    
    h["jake"]
    => "default"
    
    h["jake"] = "26"
    h.has_key?("jake")
    => true
  3. 13

    Si usted no necesita almacenar ese valor predeterminado en hash puede utilizar Hash#fetch método:

    hash = {}
    hash.fetch(:some_key, 'default-value') # => 'default-value'
    p hash
    # => {}

    Si usted necesita, además de almacenar su valor por defecto cada vez que se accede inexistente clave y usted es el uno inicializar el hash puede hacerlo usando Hash#nuevo con un bloque:

    hash = Hash.new { |hash, key| hash[key] = 'default-value' }
    hash[:a] = 'foo'
    p hash[:b]
    # => 'default-value'
    p hash
    # => { :a => 'foo', :b => 'default-value' }
  4. 7

    Puede utilizar el ||= operador:

    hash   = {some_key: 'some_value'}
    puts hash[:some_key] ||= 'default_value'         # prints 'some_value'
    puts hash[:non_existing_key] ||= 'default_value' # prints 'default_value'
    puts hash.inspect # {:some_key=>"some_value", :non_existing_key=>"default_value"}
  5. 5

    Si se va a almacenar un valor predeterminado que puede ser nulo y que usted necesita para calcular en tiempo de almacenamiento:

    hash = {}
    ...
    hash.fetch(key) {|k| hash[k] = calc_default()}

Dejar respuesta

Please enter your comment!
Please enter your name here