从Ruby 1.9开始,哈希表保留了插入顺序,这非常好。我想知道访问最后一个键值对的最佳方式。
我已经编写了一些代码来实现此操作:
hash.values.last
这个方法有效且易于理解,不过也许可以直接访问最后一个值,而不是通过中介(值数组)来访问。 有这种可能吗?
Hash有一个"first"方法,但它返回的是数组模式中的第一对键值对,如果你想获取最后一对,可以尝试:
Hash有一个"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>'
没有内置的方法可以实现,但是如果你愿意的话,你可以进行猴子补丁来实现(当然通常不建议这样做):
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倍。 - Janosch#reverse_each
只适用于数组。对于哈希和其他枚举类型,在调用 #reverse_each
时首先会创建一个中间数组,在哈希的情况下是包含所有键和值的数组。 - Janosch
hash.values.last
。 - Edgar Ortegahash[hash.keys.last] = 'bar'
,但是你不能执行hash.values.last = 'bar'
。 - sjagr