如何在Ruby中从哈希表中弹出一个元素?

8

你有什么问题? - Cary Swoveland
有没有更好的方法从哈希表中删除一个元素?我是否应该担心这个问题?(我不熟悉Ruby的编译方式,所以不知道缺少单一方法是否像在Python中那样重要)。 - user3467349
1
您正在引用一个 pop() 方法,这通常意味着从集合中删除(并返回)最后一个元素。但是,您的示例代码似乎并没有这样做。您具体想要执行什么操作? - Michael Berkowski
1
@user3467349 好的 - 你的代码实现了 Python 中 pop 的功能,而不是 Ruby 中 Array#pop 或者典型有序结构中 pop() 的功能,后者是弹出栈顶元素。Ruby 中对应 Python 功能的方法名是 Hash#delete - Michael Berkowski
我明白了... delete 方法返回值,这不是很直观。但我想这回答了我的问题。 - user3467349
显示剩余2条评论
1个回答

14
如果您知道键,则可以直接使用delete命令。 如果哈希表中不包含该键,则返回nil,否则将返回存储在其中的内容。
从您提供的文档中:
h = { "a" => 100, "b" => 200 }
h.delete("a")                              #=> 100
h.delete("z")                              #=> nil
h.delete("z") { |el| "#{el} not found" }   #=> "z not found"

还有一个 shift 操作,可以删除并返回键值对:

hsh = Hash.new

hsh['bb'] = 42
hsh['aa'] = 23
hsh['cc'] = 65

p hsh.shift

=> ["bb", 42]

如您所见,哈希的顺序是插入顺序而不是键或值的顺序。来自文档

哈希枚举它们的值,按照相应键的插入顺序。


你在问题中的代码与d.delete('a')完全相同,所以我不确定你想要做什么。 - Björn Nilsson
是的,我之前没有意识到 delete 会返回一个值。 - user3467349
从方法名称上并不完全明显。还有一个类似于数组上的pop的shift,它会删除并返回一个键值对。 - Björn Nilsson
shiftfirst的行为是怎样的?它只返回它遇到的第一个key-val对,还是哈希表实际上以某种方式被排序了? - user3467349
简短的回答是哈希表的行为类似于数组,即first/shift返回第一个插入的元素,但编写依赖它的代码是不好的。哈希表的顺序是实现细节。您的代码变得不太清晰,甚至在某些Ruby实现中可能会有不同的行为。如果您想按特定顺序获取项目,请使用数组或显式排序。有关更多详细信息,请参见https://dev59.com/Z10Z5IYBdhLWcg3wdQPT#31425274。 - Björn Nilsson

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