Bug #256

defined?(Gem::RubyGemsVersion) behaves strange

Added by Kazuhiro NISHIYAMA almost 6 years ago. Updated almost 3 years ago.

[ruby-core:17739]
Status:Rejected
Priority:Normal
Assignee:-
Category:core
Target version:1.9.1 Release Candidate
ruby -v: Backport:

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

Associated revisions

Revision 39649
Added by Marc-Andre Lafortune about 1 year ago

  • io.c: Fix rdoc typo [Github fixes #256]

History

#1 Updated by Koichi Sasada almost 6 years ago

  • Assignee set to Eric Hodel

=begin

=end

#2 Updated by Anonymous almost 6 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? で constmissing が呼ばれない挙動自体を
変更するべきだという意見もあるかもしれません。
どちらにせよ RubyGems(及び gem
prelude) に罪はなさそうです。

--
ワナベ

=end

#3 Updated by Kazuhiro NISHIYAMA almost 6 years ago

=begin
西山和広です。

At Mon, 14 Jul 2008 23:14:42 +0900,
wanabe wrote:

RubyGems は const_missing 等で遅延ロードされるようなので
defined? 実行時にロードされないのは正常だと思います。

チケットの例文でいえば、 defined? の代わりに実際に値を参照して
適宜 NameError を拾うといった感じの対応ではどうでしょうか。

あるいは defined? で constmissing が呼ばれない挙動自体を
変更するべきだという意見もあるかもしれません。
どちらにせよ 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
'
from script/about:2:in require'
from script/about:2:in
'
%

のようになります。

loadrubygemsとrubygemsversionは以下のようになっていて、
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

#4 Updated by Anonymous almost 6 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

#5 Updated by Anonymous almost 6 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

#6 Updated by Kazuhiro NISHIYAMA almost 6 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

#7 Updated by Anonymous almost 6 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

#8 Updated by Yuki Sonoda over 5 years ago

  • Category set to core
  • Assignee deleted (Eric Hodel)
  • Target version set to 1.9.1 Release Candidate

=begin

=end

#9 Updated by Yukihiro Matsumoto over 5 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

#10 Updated by Jeremy Kemper over 5 years ago

=begin
Rails changed its code for compatibility with the new behavior.
=end

#11 Updated by Roger Pack over 5 years ago

=begin
That should be fine. Perhaps document it somewhere? [if someone else disagrees feel free to mention it].
-=R
=end

Also available in: Atom PDF