访问 Ruby (1.9) 哈希表中的最后一个键值对

28

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

我已经编写了一些代码来实现此操作:

hash.values.last

这个方法有效且易于理解,不过也许可以直接访问最后一个值,而不是通过中介(值数组)来访问。 有这种可能吗?

4个回答

31

Hash有一个"first"方法,但它返回的是数组模式中的第一对键值对,如果你想获取最后一对,可以尝试:

Hash有一个"last"方法,它返回的是数组模式中的最后一对键值对。

my_hash.to_a.last

这个方法返回数组中的最后一对,就像“第一个方法”。


29

我自己正在使用的另一个选择:

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

3
这是一个很棒的解决方案! - Constant Meiring
在新的 Ruby 版本中,您也可以执行 hash.values.last - Edgar Ortega
@EdgarOrtega 这正是davidchambers使用的,导致他们提出了这个问题。 - sjagr
@sjagr ,我指的是这个具体的问题,但没错,你说得对! - Edgar Ortega
@EdgarOrtega 我这个答案的优势在于你可以很容易地执行 hash[hash.keys.last] = 'bar',但是你不能执行 hash.values.last = 'bar' - sjagr

14

没有内置的方法可以实现,但是如果你愿意的话,你可以进行猴子补丁来实现(当然通常不建议这样做):

class Hash
  def last_value
    values.last
  end
end

然后:

hash.last_value

3

我刚刚为一个非常大的哈希表执行了以下操作:

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倍。 - Janosch
1
查找为什么这个操作如此缓慢时,我发现 #reverse_each 只适用于数组。对于哈希和其他枚举类型,在调用 #reverse_each 时首先会创建一个中间数组,在哈希的情况下是包含所有键和值的数组。 - Janosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接