From: Robert Klemme Date: 2004-02-01T20:19:53+09:00 Subject: Re: Constant visibility "Gavin Sinclair" schrieb im Newsbeitrag news:1631699911313.20040201160309@soyabean.com.au... > Folks, > > I know this sort of thing has been talked about before, but that's not > going to stop me :) > > module M > X = 5 > class C > def foo > puts "X = #{X}" > end > end > end > > class M::C > def bar > puts "X = #{X}" > end > end > > M::C.new.foo # X = 5 > M::C.new.bar # NameError: uninitialized constant M::C::X > > > The problem is that when you use 'class M::C' to open a class, you > can't access constants declared in M, whereas if you use 'module M; > class C', you can. > > 1) Why is this? Because when doing "class M::C" you're still in another scope while defining class C. So you have to explicitely scope constants from module M. (see below) > 2) Is is an intentional behaviour of Ruby? I think so. > I feel fairly confident that the new constant resolution rules will > sort this out, but I'm wondering why it can't be made to work now. > > ruby 1.8.1 (2004-01-08) [i386-cygwin] > > Gavin irb(main):014:0> module M irb(main):015:1> X = 5 irb(main):016:1> class C irb(main):017:2> def foo irb(main):018:3> puts "X = #{X}" irb(main):019:3> end irb(main):020:2> end irb(main):021:1> end => nil irb(main):022:0> irb(main):023:0* class M::C irb(main):024:1> def bar irb(main):025:2> puts "X = #{M::X}" irb(main):026:2> end irb(main):027:1> end => nil irb(main):028:0> irb(main):029:0* M::C.new.foo X = 5 => nil irb(main):030:0> M::C.new.bar X = 5 => nil irb(main):031:0> $ ruby --version ruby 1.8.1 (2003-12-25) [i386-cygwin] Regards robert