Project

General

Profile

Bug #2995

TestHash#test_recursive_check fails

Added by shugo (Shugo Maeda) almost 10 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
ruby 1.9.2dev (2010-03-23 trunk 27020) [i686-linux]
Backport:
[ruby-dev:40735]

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

History

#1

Updated by nobu (Nobuyoshi Nakada) almost 10 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

#2

Updated by shugo (Shugo Maeda) almost 10 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

#3

Updated by shugo (Shugo Maeda) almost 10 years ago

=begin
前田です。

2010年3月25日12:17 Shugo Maeda shugo@ruby-lang.org:

Hashのキーにすると危ないものは他にもあるので、このケースだけエラーに
する必要もないかなと思います。
1.8との互換性という意味でもエラーにしない方がいいかもしれないですね。

とくに異論がなければ、テストの方を修正するということでどうでしょうか。

とりあえずテストの方を修正しておきました。

--
Shugo Maeda

=end

#4

Updated by shugo (Shugo Maeda) almost 10 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

Also available in: Atom PDF