Bug #2995
closedTestHash#test_recursive_check fails
Description
=begin
前田です。
以下の変更(r26961)で、TestHash#test_recursive_checkが失敗するようになっている
のですが、この変更は意図的でしょうか。
Wed Mar 17 16:25:53 2010 Nobuyoshi Nakada nobu@ruby-lang.org
* hash.c (rb_hash_aset): allow recursive key. [ruby-core:24648]
[ruby-core:24648]を見ると、
h={}
=> {}
h[:key] = h
=> {:key=>{....}}
h.hash
ArgumentError: recursive key for hash
のように値に自分自身を含むHashのhashメソッド呼び出しで例外が起こるという話で、
h[h] = :foo
のようにキーに自分自身を与えるというのとは違う話のように読めます。
また、test_recursive_checkにあるように
h = {}
h[h] = :foo
のようなコードを実行しても、h[h]で:fooは取得できません。
r26961はどういう意図の変更なのでしょうか。
=end
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
=begin
なかだです。
At Tue, 23 Mar 2010 19:15:10 +0900,
Shugo Maeda wrote in [ruby-dev:40735]:
以下の変更(r26961)で、TestHash#test_recursive_checkが失敗するようになっている
のですが、この変更は意図的でしょうか。
一応意図的ですが、検討不足でした。
また、test_recursive_checkにあるように
h = {}
h[h] = :fooのようなコードを実行しても、h[h]で:fooは取得できません。
rehashすれば取得できるようですが、キーで再帰するHashはreplaceや
updateでも作れるので、エラーにするなら以下のようにするべきでしょ
うか。
r26961はどういう意図の変更なのでしょうか。
http://twitter.com/lchin/status/10610389214
http://twitter.com/lchin/status/10610640493
あたりです。r24943での変更漏れかと思ったのですが。
diff --git i/hash.c w/hash.c
index 0b863bd..0e4e3dc 100644
--- i/hash.c
+++ w/hash.c
@@ -276,4 +276,7 @@ hash_update(VALUE hash, VALUE key)
rb_raise(rb_eRuntimeError, "can't add a new key into hash during iteration");
}
- if (hash == key) {
- rb_raise(rb_eArgError, "recursive key for hash");
- }
}
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by shugo (Shugo Maeda) over 14 years ago
=begin
前田です。
2010年3月24日17:08 Nobuyoshi Nakada nobu@ruby-lang.org:
以下の変更(r26961)で、TestHash#test_recursive_checkが失敗するようになっている
のですが、この変更は意図的でしょうか。一応意図的ですが、検討不足でした。
また、test_recursive_checkにあるように
h = {}
h[h] = :fooのようなコードを実行しても、h[h]で:fooは取得できません。
rehashすれば取得できるようですが、キーで再帰するHashはreplaceや
updateでも作れるので、エラーにするなら以下のようにするべきでしょ
うか。
なるほど、[]=の中でselfとキーが同じオブジェクトだった時は、[]=の内部で
rehashするといいんですかね。
r26961はどういう意図の変更なのでしょうか。
http://twitter.com/lchin/status/10610389214
http://twitter.com/lchin/status/10610640493
あたりです。r24943での変更漏れかと思ったのですが。
Hashのキーにすると危ないものは他にもあるので、このケースだけエラーに
する必要もないかなと思います。
1.8との互換性という意味でもエラーにしない方がいいかもしれないですね。
とくに異論がなければ、テストの方を修正するということでどうでしょうか。
--
Shugo Maeda
=end
Updated by shugo (Shugo Maeda) over 14 years ago
=begin
前田です。
2010年3月25日12:17 Shugo Maeda shugo@ruby-lang.org:
Hashのキーにすると危ないものは他にもあるので、このケースだけエラーに
する必要もないかなと思います。
1.8との互換性という意味でもエラーにしない方がいいかもしれないですね。とくに異論がなければ、テストの方を修正するということでどうでしょうか。
とりあえずテストの方を修正しておきました。
--
Shugo Maeda
=end
Updated by shugo (Shugo Maeda) over 14 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
This issue was solved with changeset r27062.
Shugo, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end