Tim Hunter
12/17/2006 3:31:00 PM
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.