Como de Ruby 1.9, los hashes de conservar el orden de inserción, que es muy cool. Quiero saber la mejor manera de acceder al último par clave–valor.

He escrito algún código que hace esto:

hash.values.last

Esto funciona y es muy fácil de comprender, pero tal vez no es posible acceder al último valor directamente, más bien que a través de un intermediario (la matriz de valores). Es?

4 Comentarios

  1. 10

    Nada construido en, no. Pero usted podría mono-parche si usted fuera tan inclinado (por lo general no se recomienda, por supuesto):

    class Hash
      def last_value
        values.last
      end
    end

    Y luego:

    hash.last_value
  2. 22

    Hash tener un «primer» método, pero que devolver el primer par en el modo de matriz, por último, usted puede probar:

    my_hash.to_a.last

    este retorno último par en el modo de matriz como «primer método»

  3. 19

    Una alternativa más, que estoy usando yo:

    hash[hash.keys.last]

    que funciona mejor cuando se desea asignar directamente un valor en el último elemento de la hash:

    2.4.1 :001 > hash = {foo: 'bar'}
     => {:foo=>"bar"} 
    2.4.1 :002 > hash[hash.keys.last] = 'baz'
     => "baz" 
    2.4.1 :003 > hash.values.last = 'bar'
    NoMethodError: undefined method `last=' for ["baz"]:Array
    Did you mean?  last
        from (irb):3
        from /home/schuylr/.rvm/rubies/ruby-2.4.1/bin/irb:11:in `<main>'
    • Esta es una estupenda solución!
    • En las nuevas versiones de Ruby también podría hacer hash.values.last
    • eso es exactamente lo que davidchambers estaba usando y les llevó a plantearse esta pregunta.
    • Yo estaba apuntado a esta pregunta específica, pero sí, tienes razón!
    • el poder de mi respuesta es que usted puede hacer esto fácilmente hash[hash.keys.last] = 'bar' mientras que usted no puede hacer esto hash.values.last = 'bar'
  4. 3

    Yo solo hice esto para un hash muy grande:

    hash.reverse_each.with_index do |(_, value), index|
      break value if (index == 0)
    end
    • Este es de unas 2-3 veces más rápido: v = hash.each_value.reverse_each.next rescue StopIteration. Todavía 2-3 veces más lento que hash.values.last por 100 metros de las entradas, sin embargo.
    • Buscando por qué esto es tan lento, me encontré con que #reverse_each sólo tiene sentido en las Matrices. Hash y otros Enumerables primer crear un intermedio de la Matriz cuando #reverse_each se llama, en el caso de Hash uno con todas las claves y valores.

Dejar respuesta

Please enter your comment!
Please enter your name here