gpt4 book ai didi

ruby - Hash#keys 方法的错误输出

转载 作者:数据小太阳 更新时间:2023-10-29 06:46:49 25 4
gpt4 key购买 nike

在某些情况下 Hash#keys 在 2.4 之前的 Ruby 中不能正常工作

演示代码:

h = { a: 1, b: 2, c: 3 }
h.each do |k, v|
h.delete(:a)
p h
p h.keys
break
end

Ruby 2.3.8 输出:

{:b=>2, :c=>3}
[:b]

Ruby 2.5.1 输出:

{:b=>2, :c=>3}
[:b, :c]

我同意在迭代时修改散列是不好的。但是我没有看到修改hash和work keys方法之间的关系。

为什么会这样?

最佳答案

有趣的问题。这还不是答案,但对于评论来说太长了,它可以帮助其他人回答问题。

哪些 ruby 受到影响?

我创建了一个 GitHub repository有一个非常简单的规范:

describe Hash do
it "should always know which keys are left" do
h = { a: 1, b: 2, c: 3 }
h.each do |k, v|
h.delete :a
expect(h.keys).to eq [:b, :c]
end
end
end

enter image description here感谢Travis ,很容易看出哪些Ruby版本有这个bug:

  • ruby 2.1
  • ruby 2.2
  • ruby 2.3

bug是什么时候出现的?

bug 是什么时候修复的?

我刚刚花了一个小时使用 git bisectmake install 以发现错误已在此 commit (75775157) 中修复.

Introduce table improvement by Vladimir Makarov .

[Feature #12142] See header of st.c for improvment details.

You can see all of code history here: https://github.com/vnmakarov/ruby/tree/hash_tables_with_open_addressing

This improvement is discussed at https://bugs.ruby-lang.org/issues/12142 with many people, especially with Yura Sokolov.

  • st.c: improve st_table.

  • include/ruby/st.h: ditto.

  • internal.h, numeric.c, hash.c (rb_dbl_long_hash): extract a function.

  • ext/-test-/st/foreach/foreach.c: catch up this change.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56650 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

@Vovan 已经确认,他比我早 1 分钟发现了这个提交。

关于ruby - Hash#keys 方法的错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56899599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com