[ruby-dev:49508] [Ruby trunk Bug#12121] 異なる名前空間にある同名の定数により Module.constans の結果の並びが変わる

From: koic.ito@...
Date: 2016-02-28 11:41:16 UTC
List: ruby-dev #49508
Issue #12121 has been updated by Koichi ITO.


問題が起きたライブラリは 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

----------------------------------------
Bug #12121: 異なる名前空間にある同名の定数により Module.constans の結果の並びが変わる
https://bugs.ruby-lang.org/issues/12121#change-57190

* Author: Koichi ITO
* Status: Feedback
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.4.0dev (2016-02-27 trunk 53957) [x86_64-darwin13]
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
Ruby 2.4.0-dev で、Ruby 2.3.0 以前と変わっている振る舞いについてです。

自身のモジュール定義の前に、異なる名前空間で同名の定数が定義されていると
Module.constants の結果の並びに影響を与える振る舞いに変わっているように見えます。

```ruby
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] での実行結果です。

```ruby
p M2.constants # => [:B, :A]
```

ruby 2.4.0dev (2016-02-27 trunk 53957) [x86_64-darwin13] での実行結果です。

```ruby
p M2.constants # => [:A, :B]
```

依存する異なるライブラリで、自身が使おうとする定数と同名の定数が定義されていると、
Module.constants の結果が Ruby 2.3.0 以前と異なる順序で返って困るということがありました。



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next