【发布时间】:2011-10-13 03:26:15
【问题描述】:
从 Ruby 1.9 开始,哈希保留插入顺序,这非常酷。我想知道访问最后一个键值对的最佳方式。
我已经写了一些代码来做到这一点:
hash.values.last
这很有效并且很容易理解,但也许可以直接访问最后一个值,而不是通过中介(值数组)。是吗?
【问题讨论】:
从 Ruby 1.9 开始,哈希保留插入顺序,这非常酷。我想知道访问最后一个键值对的最佳方式。
我已经写了一些代码来做到这一点:
hash.values.last
这很有效并且很容易理解,但也许可以直接访问最后一个值,而不是通过中介(值数组)。是吗?
【问题讨论】:
哈希有一个“第一个”方法,但它以数组模式返回第一对,最后,你可以尝试:
my_hash.to_a.last
这会返回数组模式中的最后一对,如“第一种方法”
【讨论】:
我自己使用的另一种选择:
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>'
【讨论】:
hash.values.last
hash[hash.keys.last] = 'bar' 而你不能做到这一点hash.values.last = 'bar'
没有内置的,没有。但是如果你愿意的话,你可以给一个猴子打补丁(当然通常不推荐):
class Hash
def last_value
values.last
end
end
然后:
hash.last_value
【讨论】:
我只是为一个非常大的哈希这样做:
hash.reverse_each.with_index do |(_, value), index|
break value if (index == 0)
end
【讨论】:
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。