[ruby-trunk - Bug #7300][Open] Hash#[] の挙動が 1.9.3 と異なっている

Issue #7300 has been reported by hsbt (Hiroshi SHIBATA).


Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では dupricate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by knu (Akinori MUSHA).

これ、元のコードは何でしょうか。
もし文字通りnilなんて埋めてあったらコーディングミスなので、警告を出すくらいなら例外を出して直させるべきだと思います。

問題は、
Hash[enum.map {|x| x > 0 ? [x, x*x] : nil }]
のように動的にハッシュを作るときに意図的にnil(あるいは配列化できない任意の値)を使ってペアの生成をスキップする場合でしょうか。
これにしてもそんな仕様は最初から示されていないので、これを機に直してもらうのがいい気がします。「Hash[」で検索可能だし。

Hash[enum.map {|x| x > 0 ? [x, xx] : nil }.compat] # minimum change
Hash[enum.flat_map {|x| x > 0 ? [x, x
x] : [] }] # 1.9+ only
{}.tap { |h| enum.each {|x| x > 0 and h[x] = x*x } }


Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では dupricate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by knu (Akinori MUSHA).

なんかいろいろ微妙にミスった。

Hash[enum.map {|x| x > 0 ? [x, xx] : nil }.compact] # minimum change
Hash[enum.flat_map {|x| x > 0 ? [x, xx] : [] }] # 1.9+ only
{}.tap { |h| enum.each {|x| x > 0 and h[x] = x
x } }

です。

Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では dupricate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by hsbt (Hiroshi SHIBATA).

元のコードは以下の行になります。

https://github.com/apotonick/cells/blob/master/lib/cell/test_case.rb#L78

テストケースによっては Hash[[nil, nil, nil,…]] というような状態になるようです。
ライブラリ本体を直すべきであるということであれば、異論はありませんのでそのように動くつもりです。

Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では dupricate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by mame (Yusuke E.).

Status changed from Open to Assigned
Assignee set to nobu (Nobuyoshi N.)

柴田さん、またまたありがとうございます。

hsbt (Hiroshi SHIBATA) wrote:

元のコードは以下の行になります。

compact 足してよ、という感じで微妙なところですが、今回は警告に一票投じます (コードがすごく汚くなるとかでなければ)
。なかださん再検討お願いします。

余談ですが、「特に実用上困ったわけじゃないけど気がついた非互換 (RubySpec
みたいな)」の報告もありがたいですが、「実コードに影響があった非互換」は心理的な優先度がだいぶ上がるので、その旨書いてもらえるととても嬉しいです。


Yusuke E. [email protected]

Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では dupricate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by hsbt (Hiroshi SHIBATA).

遠藤さん、了解です。

2.0.0 互換報告は手元の Rails アプリケーションでチェックした結果なので、ほとんどが実運用に影響のある問題です。
今後はそのことを詳しく書くことにします。


Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では dupricate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by nobu (Nobuyoshi N.).

Description updated


Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では duplicate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by nobu (Nobuyoshi N.).

全面的に無視するのはなんとなく気がすすまないんですが、nilだけ警告にするというのはどうでしょうか。

Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では duplicate の警告だけにして、
次のリリースで消すという方が良さそうに思います。

Issue #7300 has been updated by hsbt (Hiroshi SHIBATA).

redis-rb という ruby から redis を扱うライブラリにも同じコードがありました。

redis-rb では [nil, [“redis_version”, “2.6.4”], …] というような配列を Hash[]
に渡して初期化しようとして落ちています。
配列が nil だけの時の [nil, nil, …] に加えて [nil, [“valid”, “valid”], …]
みたいな一部だけ nil というような配列の時でも警告をして通すような変更だと助かります。

Bug #7300: Hash#[] の挙動が 1.9.3 と異なっている

Author: hsbt (Hiroshi SHIBATA)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-07) [x86_64-darwin12.2.0]

Hash[[nil]] を実行すると 1.9.3 では {} となるものが 2.0.0 では ArgumentError となります。

なかださんに相談してみたら、2.0.0 の動きが不正なものをチェックしてて正しい挙動と
いうことを教えてもらいましたが、2.0.0 では duplicate の警告だけにして、
次のリリースで消すという方が良さそうに思います。