[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Why the resutls are different

Li Chen

12/17/2006 3:17:00 PM

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

--
Posted via http://www.ruby-....

4 Answers

Tim Hunter

12/17/2006 3:31:00 PM

0

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.


Daniel Finnie

12/17/2006 4:58:00 PM

0

Also, before you get into the habit of doing that (see the quote), it's
kind of considered bad form and Ruby automatically concatenating strings
like that might not happen in future versions.

You can eliminate the double quotations so it is:
puts "This is the name #{name}"

Or use direct concatenation with the two strings:
puts "This is the name" + " #{name}"

But that would be silly when you can just move the space over and not
have the whole #{} thing:
puts "This is the name " + #{name}

Most people, I think, would use the first version.

Dan

Timothy Hunter wrote:
> Li Chen wrote:
>> puts "This is the name"" #{name}"

Li Chen

12/17/2006 6:53:00 PM

0

Daniel Finnie wrote:

> You can eliminate the double quotations so it is:
> puts "This is the name #{name}"
>
> Or use direct concatenation with the two strings:
> puts "This is the name" + " #{name}"
>
> But that would be silly when you can just move the space over and not
> have the whole #{} thing:
> puts "This is the name " + #{name}


Thanks,

Li

--
Posted via http://www.ruby-....

dblack

12/17/2006 7:26:00 PM

0