【问题标题】:Ruby pop an element from a hash table?Ruby 从哈希表中弹出一个元素?
【发布时间】:2015-05-15 02:43:15
【问题描述】:

我正在查看http://ruby-doc.org/core-1.9.3/Hash.html,但似乎没有pop 方法?我想我错过了一些东西......

if (x = d['a']) != nil
  d.delete('a') 
end

【问题讨论】:

  • 你有什么问题?
  • 真的没有更好的方法来pop 哈希中的项目吗?我有理由不担心吗? (我不熟悉 Ruby 是如何编译的,所以我不知道缺少一个单一的方法是否像在 Python 中那样重要)。
  • 您指的是pop() 方法,它通常意味着从集合中删除(并返回)最后一个元素。您的示例代码似乎没有这样做。您具体想采取什么行动?
  • @MichaelBerkowski 我的代码与pop 完全一样。欢迎您试用。
  • @user3467349 好的 - 您的代码执行 python 的 pop 所做的事情,而不是 Ruby 的 Array#pop 所做的事情,或者 pop() 在典型的有序结构中所做的事情,即从堆栈中弹出顶部元素。 Python 的 Ruby 名称是 Hash#delete。

标签: ruby


【解决方案1】:

如果知道key,直接用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') 完全相同,所以我不确定您要做什么。
  • 是的,我没有意识到 delete 返回了一个值。
  • 从方法名上看不完全清楚。还有一个 shift ,它的行为有点像数组上的 pop ,它删除并返回一个键值对
  • shift 和 first 的行为是什么样的,它只是返回遇到的第一个 key-val 对,还是哈希表实际上以某种方式排序?
  • 简短的回答是哈希的行为类似于数组,因为 first/shift 返回第一次插入的元素,但是编写依赖于它的代码是不好的。哈希的顺序是一个实现细节。您的代码变得不那么清晰,甚至在某些 Ruby 实现中可能表现不同。如果您想要按特定顺序排列的项目,请使用数组或显式排序。有关详细信息,请参阅stackoverflow.com/a/31425274/813125。
猜你喜欢
  • 2019-02-03
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多