Li Chen wrote:
> Hi all,
>
> I try to understand the concept of variable scopes. I define two classes
> with very similar structures. But Ruby complains class Y only. Any
> comments?
>
> Thanks,
>
> Li
>
>
> class X
>   def initialize(name,artist,duration)
>     @name=name
>     @artist=artist
>     @duration=duration
>   end
>   puts "This is the name"" #{name}"
> end
>
> test_x=X.new(1,2,3)
> puts test_x.inspect
>
>   
>> ruby variables1.rb
>>     
> This is the name X
> #<X:0x28ae894 @artist=2, @name=1, @duration=3>
>   
>> Exit code: 0
>>     
>
>
> class Y
>   def initialize(arg1,arg2,arg3)
>     @arg1=arg1
>     @arg2=arg2
>     @arg3=arg3
>   end
>    puts "This is arg1"" #{arg1}"
> end
>
>     test_y=Y.new(1,2,3)
>     puts test_y.inspect
>
>   
>> ruby variables2.rb
>>     
> variables2.rb:15: undefined local variable or method `arg1' for Y:Class
> (NameError)
>   
>> Exit code: 1
>>     
>
>   
Code in class definitions, such as your "puts" statement, is executed 
when the class is defined, in the context of the class being defined.
Observe that in your first example, the value of "name" that is printed 
is not the value of the "name" argument to initialize. It is actually 
the name of the class. That is because the puts statement is in the 
context of the class and when you print #{name} you're printing the 
result of calling the name method on the class object. You can simplify 
your example to this:

class X
   puts name
end

Check out ri Module.name.