Bug #12121
closed異なる名前空間にある同名の定数により Module.constans の結果の並びが変わる
Description
Ruby 2.4.0-dev で、Ruby 2.3.0 以前と変わっている振る舞いについてです。
自身のモジュール定義の前に、異なる名前空間で同名の定数が定義されていると
Module.constants の結果の並びに影響を与える振る舞いに変わっているように見えます。
module M1
module A end
end
module M2
module B end
module A end
end
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin13] での実行結果です。
p M2.constants # => [:B, :A]
ruby 2.4.0dev (2016-02-27 trunk 53957) [x86_64-darwin13] での実行結果です。
p M2.constants # => [:A, :B]
依存する異なるライブラリで、自身が使おうとする定数と同名の定数が定義されていると、
Module.constants の結果が Ruby 2.3.0 以前と異なる順序で返って困るということがありました。
Updated by usa (Usaku NAKAMURA) almost 9 years ago
- Related to Bug #12089: Raise not stable NameError added
Updated by nobu (Nobuyoshi Nakada) almost 9 years ago
- Related to deleted (Bug #12089: Raise not stable NameError)
Updated by nobu (Nobuyoshi Nakada) almost 9 years ago
- Status changed from Open to Rejected
Module#constants
に順序の保証はありません。
Updated by nobu (Nobuyoshi Nakada) almost 9 years ago
- Status changed from Rejected to Feedback
ちなみにどういうライブラリでどういう問題が起きたのでしょうか。
Updated by koic (Koichi ITO) almost 9 years ago
問題が起きたライブラリは dotenv というライブラリです。
https://github.com/bkeepers/dotenv
Module.constants の戻り値として [Substitutions::Variable, Substitutions::Command]
だった
並び順が [Substitutions::Command, Substitutions::Variable]
に変わっておりました。
https://github.com/bkeepers/dotenv/blob/v2.1.0/lib/dotenv/parser.rb#L12
dotenv では、Module.constants が返す定数の並び順に、処理の実行順序が依存した実装になっているため
Ruby の HEAD を使うとこれまでと異なる処理順序になって期待する動きになりませんでした。
dotenv の依存ライブラリとなる pry に Pry::Command
という、名前空間が異なる同名の
Command
という定数が定義されており、先に読み込んだ依存ライブラリに同名の定数が
有るか無いかで、振る舞いが変わるという問題が起きました。
https://github.com/pry/pry/blob/v0.10.3/lib/pry/code_object.rb#L38
Updated by shyouhei (Shyouhei Urabe) almost 9 years ago
これは、ドキュメントの問題だと思います。Module#constantsの戻り順を保障したことはないし、これからも保障されないと思います。今回は高速化の一環として順序が変わりましたが、今後も同様のことは起き得ます。なのでそのようにドキュメントを書くべきだと思います。
dotenvでの利用は確認させていただきましたが、これまでも動いていたのはたまたま、という感じがしました。
Updated by hsbt (Hiroshi SHIBATA) almost 9 years ago
- Status changed from Feedback to Closed
Applied in changeset r54231.
- variable.c: Added documentation about order of
Module#constants
[ci skip][Bug #12121][ruby-dev:49505][fix GH-1301]
Updated by usa (Usaku NAKAMURA) almost 9 years ago
- Backport changed from 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN to 2.1: REQUIRED, 2.2: REQUIRED, 2.3: REQUIRED
Updated by usa (Usaku NAKAMURA) almost 9 years ago
- Backport changed from 2.1: REQUIRED, 2.2: REQUIRED, 2.3: REQUIRED to 2.1: DONE, 2.2: REQUIRED, 2.3: REQUIRED
ruby_2_1 r54285 merged revision(s) 54231.
Updated by nagachika (Tomoyuki Chikanaga) over 8 years ago
- Backport changed from 2.1: DONE, 2.2: REQUIRED, 2.3: REQUIRED to 2.1: DONE, 2.2: DONE, 2.3: REQUIRED
Backported into ruby_2_2
branch at r54329.
Updated by naruse (Yui NARUSE) over 8 years ago
- Backport changed from 2.1: DONE, 2.2: DONE, 2.3: REQUIRED to 2.1: DONE, 2.2: DONE, 2.3: DONE
ruby_2_3 r54376 merged revision(s) 54231.