Bug #256
defined?(Gem::RubyGemsVersion) behaves strange
| Status: | Rejected | Start date: | 07/11/2008 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | - | % Done: | 0% |
|
| Category: | core | |||
| Target version: | 1.9.1 Release Candidate | |||
| ruby -v: |
Description
% ruby-trunk -ve 'p defined?(Gem::RubyGemsVersion) p Gem::RubyGemsVersion p defined?(Gem::RubyGemsVersion)' ruby 1.9.0 (2008-07-11 revision 18024) [i686-linux] nil "1.2.0.1824" "constant" %
History
Updated by ko1 (Koichi Sasada) almost 4 years ago
- Assignee set to drbrain (Eric Hodel)
Updated by Anonymous almost 4 years ago
ワナベと申します。 # 英語ができないので ruby-dev に引っ張ってきてしまいました。 2008/7/11 Kazuhiro NISHIYAMA <redmine@ruby-lang.org>: > Bug #256: defined?(Gem::RubyGemsVersion) behaves strange (中略) > % ruby-trunk -ve 'p defined?(Gem::RubyGemsVersion) > p Gem::RubyGemsVersion > p defined?(Gem::RubyGemsVersion)' > ruby 1.9.0 (2008-07-11 revision 18024) [i686-linux] > nil > "1.2.0.1824" > "constant" RubyGems は const_missing 等で遅延ロードされるようなので defined? 実行時にロードされないのは正常だと思います。 チケットの例文でいえば、 defined? の代わりに実際に値を参照して 適宜 NameError を拾うといった感じの対応ではどうでしょうか。 あるいは defined? で const_missing が呼ばれない挙動自体を 変更するべきだという意見もあるかもしれません。 どちらにせよ RubyGems(及び gem_prelude) に罪はなさそうです。 -- ワナベ
Updated by znz (Kazuhiro NISHIYAMA) almost 4 years ago
西山和広です。
At Mon, 14 Jul 2008 23:14:42 +0900,
wanabe wrote:
>
> RubyGems は const_missing 等で遅延ロードされるようなので
> defined? 実行時にロードされないのは正常だと思います。
>
> チケットの例文でいえば、 defined? の代わりに実際に値を参照して
> 適宜 NameError を拾うといった感じの対応ではどうでしょうか。
>
> あるいは defined? で const_missing が呼ばれない挙動自体を
> 変更するべきだという意見もあるかもしれません。
> どちらにせよ RubyGems(及び gem_prelude) に罪はなさそうです。
#256には書き忘れてしまったのですが、require 'rubygems'しても
同じなので、rubygemsの方が悪いのではないかと思います。
% ruby-trunk -v -rubygems -e 'p defined?(Gem::RubyGemsVersion)
p Gem::RubyGemsVersion
p defined?(Gem::RubyGemsVersion)'
ruby 1.9.0 (2008-07-11 revision 18024) [i686-linux]
nil
"1.2.0.1824"
"constant"
% ruby18 -v -rubygems -e 'p defined?(Gem::RubyGemsVersion)
p Gem::RubyGemsVersion
p defined?(Gem::RubyGemsVersion)'
ruby 1.8.7 (2008-07-09 revision 0) [i686-linux]
"constant"
"1.2.0"
"constant"
%
問題が起きたのはrailsのconfig/boot.rbで
% cd /tmp
% rails hoge
(略)
% cd hoge
% ruby-trunk -vd script/about
ruby 1.9.0 (2008-07-14 revision 18060) [i686-linux]
Exception `NoMethodError' at /tmp/hoge/config/boot.rb:86 - undefined method `>=' for nil:NilClass
Exception `NoMethodError' at script/about:2 - undefined method `>=' for nil:NilClass
/tmp/hoge/config/boot.rb:86:in `load_rubygems': undefined method `>=' for nil:NilClass (NoMethodError)
from /tmp/hoge/config/boot.rb:52:in `load_initializer'
from /tmp/hoge/config/boot.rb:38:in `run'
from /tmp/hoge/config/boot.rb:11:in `boot!'
from /tmp/hoge/config/boot.rb:109:in `<top (required)>'
from script/about:2:in `require'
from script/about:2:in `<main>'
%
のようになります。
load_rubygemsとrubygems_versionは以下のようになっていて、
require 'rubygems'しているのにもかかわらずlib/rubygems.rbの
require 'rubygems/rubygems_version'が実行されず、
Gem::RubyGemsVersionが定義されていないというのが原因です。
def rubygems_version
Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
end
def load_rubygems
require 'rubygems'
unless rubygems_version >= '0.9.4'
$stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_v
ersion}). Please `gem update --system` and try again.)
exit 1
end
--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)Updated by Anonymous almost 4 years ago
斎藤と申します。 On Mon, 14 Jul 2008 23:31:13 +0900 Kazuhiro NISHIYAMA <zn@mbf.nifty.com> wrote: > #256には書き忘れてしまったのですが、require 'rubygems'しても > 同じなので、rubygemsの方が悪いのではないかと思います。 どこが悪いのでしょうか。 defined? の後ろの式は、評価されません。 $ ruby1.8 -e 'p super' -e:1: super called outside of method (NoMethodError) $ ruby1.8 -e 'p defined? super' nil 2度目の実行で、例外は上がっていません。 このように、初めて評価されてから定義(ロード)されるのが On Mon, 14 Jul 2008 23:14:42 +0900 wanabe <s.wanabe@gmail.com> wrote: > RubyGems は const_missing 等で遅延ロードされるようなので ということではないでしょうか。 -- 斎藤ただし
Updated by Anonymous almost 4 years ago
ワナベです。 2008/07/15 0:14 Tadashi Saito <shiba@mail2.accsnet.ne.jp>: > On Mon, 14 Jul 2008 23:31:13 +0900 > Kazuhiro NISHIYAMA <zn@mbf.nifty.com> wrote: > >> #256には書き忘れてしまったのですが、require 'rubygems'しても >> 同じなので、rubygemsの方が悪いのではないかと思います。 > > どこが悪いのでしょうか。 明示的にロードし終えているのに定数が定義されていないということですと 私もそれはおかしいように思います。少なくとも戸惑います。 gem_prelude で $" に rubygems.rb を追加しているせいでしょうか。 なぜこうなっているんでしょう? 結局、 require 'rubygems' された時には即座にロードし そうでないなら遅延ロード、というのが適切だろうと思い直しました。 そうするとやはり gem_prelude にも問題があると言えるかもしれません。 -- ワナベ
Updated by znz (Kazuhiro NISHIYAMA) almost 4 years ago
西山和広です。 At Tue, 15 Jul 2008 00:14:50 +0900, Tadashi Saito wrote: > > > #256には書き忘れてしまったのですが、require 'rubygems'しても > > 同じなので、rubygemsの方が悪いのではないかと思います。 > > どこが悪いのでしょうか。 require 'rubygems'してもrubygems.rbが読み込まれないところです。 -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)
Updated by Anonymous almost 4 years ago
斎藤です。 On Tue, 15 Jul 2008 00:35:41 +0900 Kazuhiro NISHIYAMA <zn@mbf.nifty.com> wrote: > require 'rubygems'してもrubygems.rbが読み込まれないところです。 なるほど、問題を読み違えていたようです。 On Tue, 15 Jul 2008 00:34:45 +0900 wanabe <s.wanabe@gmail.com> wrote: > 結局、 require 'rubygems' された時には即座にロードし > そうでないなら遅延ロード、というのが適切だろうと思い直しました。 > そうするとやはり gem_prelude にも問題があると言えるかもしれません。 自分には適切なタイミングは分かり兼ねるので、どなたかこちらに フォローいただけるとありがたいです。 -- 斎藤ただし
Updated by yugui (Yuki Sonoda) over 3 years ago
- Category set to core
- Assignee deleted (
drbrain (Eric Hodel)) - Target version set to 1.9.1 Release Candidate
Updated by matz (Yukihiro Matsumoto) over 3 years ago
- Status changed from Open to Rejected
As far as I understand, this issue is three fold: (a) defined?(Const) does not call const_missing (b) require 'rubygems' does not load 'rubygems' (c) require 'rubygems' does not provide Gem::RubyGemsVersion We reject (a). I think (b) is a spec. If (c) makes Rails to run correctly, re-submit a new issue.
Updated by bitsweat (Jeremy Kemper) over 3 years ago
Rails changed its code for compatibility with the new behavior.
Updated by rogerdpack (Roger Pack) over 3 years ago
That should be fine. Perhaps document it somewhere? [if someone else disagrees feel free to mention it]. -=R