Project

General

Profile

Actions

Bug #12121

closed

異なる名前空間にある同名の定数により Module.constans の結果の並びが変わる

Added by koic (Koichi ITO) about 8 years ago. Updated about 8 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.0dev (2016-02-27 trunk 53957) [x86_64-darwin13]
[ruby-dev:49505]

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 以前と異なる順序で返って困るということがありました。

Actions #1

Updated by usa (Usaku NAKAMURA) about 8 years ago

  • Related to Bug #12089: Raise not stable NameError added
Actions #2

Updated by nobu (Nobuyoshi Nakada) about 8 years ago

  • Related to deleted (Bug #12089: Raise not stable NameError)

Updated by nobu (Nobuyoshi Nakada) about 8 years ago

  • Status changed from Open to Rejected

Module#constantsに順序の保証はありません。

Updated by nobu (Nobuyoshi Nakada) about 8 years ago

  • Status changed from Rejected to Feedback

ちなみにどういうライブラリでどういう問題が起きたのでしょうか。

Updated by koic (Koichi ITO) about 8 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) about 8 years ago

これは、ドキュメントの問題だと思います。Module#constantsの戻り順を保障したことはないし、これからも保障されないと思います。今回は高速化の一環として順序が変わりましたが、今後も同様のことは起き得ます。なのでそのようにドキュメントを書くべきだと思います。

dotenvでの利用は確認させていただきましたが、これまでも動いていたのはたまたま、という感じがしました。

Actions #7

Updated by hsbt (Hiroshi SHIBATA) about 8 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) about 8 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) about 8 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.

Actions #10

Updated by nagachika (Tomoyuki Chikanaga) about 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) about 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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0