【问题标题】:Accessing the last key–value pair in a Ruby (1.9) hash访问 Ruby (1.9) 哈希中的最后一个键值对
【发布时间】:2011-10-13 03:26:15
【问题描述】:

从 Ruby 1.9 开始,哈希保留插入顺序,这非常酷。我想知道访问最后一个键值对的最佳方式。

我已经写了一些代码来做到这一点:

hash.values.last

这很有效并且很容易理解,但也许可以直接访问最后一个值,而不是通过中介(值数组)。是吗?

【问题讨论】:

    标签: ruby hash key-value


    【解决方案1】:

    哈希有一个“第一个”方法,但它以数组模式返回第一对,最后,你可以尝试:

    my_hash.to_a.last
    

    这会返回数组模式中的最后一对,如“第一种方法”

    【讨论】:

      【解决方案2】:

      我自己使用的另一种选择:

      hash[hash.keys.last]
      

      当您想直接将值分配给散列的最后一个元素时效果更好:

      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>'
      

      【讨论】:

      • 这是一个很棒的解决方案!
      • 在新的 Ruby 版本中你也可以这样做 hash.values.last
      • @EdgarOrtega 这正是 davidchambers 所使用的,并导致他们提出了这个问题。
      • @sjagr ?,我指的是这个具体问题,但是是的,你是对的!
      • @EdgarOrtega 我的答案的强大之处在于您可以轻松地做到这一点hash[hash.keys.last] = 'bar' 而你不能做到这一点hash.values.last = 'bar'
      【解决方案3】:

      没有内置的,没有。但是如果你愿意的话,你可以给一个猴子打补丁(当然通常不推荐):

      class Hash
        def last_value
          values.last
        end
      end
      

      然后:

      hash.last_value
      

      【讨论】:

        【解决方案4】:

        我只是为一个非常大的哈希这样做:

        hash.reverse_each.with_index do |(_, value), index|
          break value if (index == 0)
        end
        

        【讨论】:

        • 这大约快 2-3 倍:v = hash.each_value.reverse_each.next rescue StopIteration。不过,对于 1 亿个条目,仍然比 hash.values.last 慢 2-3 倍。
        • 查看为什么这么慢,我发现#reverse_each 只对数组有意义。在调用 #reverse_each 时,首先使用 Hash 和其他 Enumerables create an intermediate Array,对于具有所有键和值的 Hash one。
        猜你喜欢
        • 2011-10-25
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 2014-04-09
        • 2021-01-26
        • 2013-03-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多