Bug #2995
TestHash#test_recursive_check fails
| Status: | Closed | Start date: | 03/23/2010 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % Done: | 100% |
||
| Category: | core | |||
| Target version: | 1.9.2 | |||
| ruby -v: | ruby 1.9.2dev (2010-03-23 trunk 27020) [i686-linux] |
Description
前田です。
以下の変更(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はどういう意図の変更なのでしょうか。
Associated revisions
* test/ruby/test_hash.rb (test_recursive_key): recursive keys are
permitted now. [ruby-dev:40735]
History
Updated by nobu (Nobuyoshi Nakada) about 2 years ago
なかだです。 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はできる。 中田 伸悦
Updated by shugo (Shugo Maeda) about 2 years ago
前田です。
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
Updated by shugo (Shugo Maeda) about 2 years ago
前田です。 2010年3月25日12:17 Shugo Maeda <shugo@ruby-lang.org>: > Hashのキーにすると危ないものは他にもあるので、このケースだけエラーに > する必要もないかなと思います。 > 1.8との互換性という意味でもエラーにしない方がいいかもしれないですね。 > > とくに異論がなければ、テストの方を修正するということでどうでしょうか。 とりあえずテストの方を修正しておきました。 -- Shugo Maeda
Updated by shugo (Shugo Maeda) about 2 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
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.