Bug #256
closeddefined?(Gem::RubyGemsVersion) behaves strange
Description
=begin
% 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"
%
=end
Updated by Anonymous over 16 years ago
=begin
ワナベと申します。
英語ができないので 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) に罪はなさそうです。
--
ワナベ
=end
Updated by znz (Kazuhiro NISHIYAMA) over 16 years ago
=begin
西山和広です。
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
'
%
のようになります。
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)
=end
Updated by Anonymous over 16 years ago
=begin
斎藤と申します。
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 等で遅延ロードされるようなので
ということではないでしょうか。
--
斎藤ただし
=end
Updated by Anonymous over 16 years ago
=begin
ワナベです。
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 にも問題があると言えるかもしれません。
--
ワナベ
=end
Updated by znz (Kazuhiro NISHIYAMA) over 16 years ago
=begin
西山和広です。
At Tue, 15 Jul 2008 00:14:50 +0900,
Tadashi Saito wrote:
#256には書き忘れてしまったのですが、require 'rubygems'しても
同じなので、rubygemsの方が悪いのではないかと思います。どこが悪いのでしょうか。
require 'rubygems'してもrubygems.rbが読み込まれないところです。
--
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)
=end
Updated by Anonymous over 16 years ago
=begin
斎藤です。
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 にも問題があると言えるかもしれません。
自分には適切なタイミングは分かり兼ねるので、どなたかこちらに
フォローいただけるとありがたいです。
--
斎藤ただし
=end
Updated by yugui (Yuki Sonoda) about 16 years ago
- Category set to core
- Assignee deleted (
drbrain (Eric Hodel)) - Target version set to 1.9.1 Release Candidate
=begin
=end
Updated by matz (Yukihiro Matsumoto) about 16 years ago
- Status changed from Open to Rejected
=begin
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.
=end
Updated by bitsweat (Jeremy Daer) about 16 years ago
=begin
Rails changed its code for compatibility with the new behavior.
=end
Updated by rogerdpack (Roger Pack) about 16 years ago
=begin
That should be fine. Perhaps document it somewhere? [if someone else disagrees feel free to mention it].
-=R
=end