It's got nothing to do with mixins:
class TestClass
def x=(arg)
@x = arg
end
def x
@x
end
def monkey(arg)
x = arg
end
end
irb(main):012:0> a = TestClass.new
=> #<TestClass:0x2ac6e48>
irb(main):013:0> a.monkey('aa')
=> "aa"
irb(main):014:0> a.x
=> nil
In the monkey method, x = arg is assigning to the local variable x, not
calling the method x=().
Refer to the x variable either as self.x or @x.
···
-----Original Message-----
From: Johannes Friestad [mailto:johannes.friestad@gmail.com]
Sent: Wednesday, 7 December 2005 4:07 PM
To: ruby-talk ML
Subject: Mixins and variables
Hi,
I'm new to Ruby, and trying to figure out how the
inheritance/mixin works:
I can't figure out how to set an instance variable with a mixin method
from the object's initialize().
Example:
-----------------
module TestMod
def x
@x
end
def x=(arg)
@x=arg
end
end
class TestClass
include TestMod
def initialize
x=('alpha')
printf("x=%s\n", x)
end
end
irb(main)..>tmp=TestClass.new
x=alpha # x is set inside constructor
=> #<TestClass:0x37d9520>
irb(main)..>tmp.x
=> nil # x is unset on the returned object
-----------------
Does anyone know why it doesn't work? What can I do instead?
--
Johannes Friestad
johannes.friestad@gmail.com
#####################################################################################
This email has been scanned by MailMarshal, an email content filter.
#####################################################################################
OK, thanks. Can I force "x=(whatever)" to mean a method call instead
of an assignment?
I thought the parantheses were supposed to do that?
jf
···
On 12/6/05, Daniel Sheppard <daniels@pronto.com.au> wrote:
It's got nothing to do with mixins:
class TestClass
def x=(arg)
@x = arg
end
def x
@x
end
def monkey(arg)
x = arg
end
end
irb(main):012:0> a = TestClass.new
=> #<TestClass:0x2ac6e48>
irb(main):013:0> a.monkey('aa')
=> "aa"
irb(main):014:0> a.x
=> nil
In the monkey method, x = arg is assigning to the local variable x, not
calling the method x=().
Refer to the x variable either as self.x or @x.
It is a parsing problem. Because ruby supports zero argument methods
the parser when it sees:
x = 4
can't decide from the syntax alone if this is a local variable assignment
or if this is a method call to the x= method for the object (with 0 arguments).
This decision needs to be made when the method is *parsed* long before
the method has actually been executed.
So the goal is to convince the parser of what you want. If you want this
to be a method call then you have the following options:
self.x = 4 # explicit method call
x() = 4 # also explicit but not 'rubyish'
Putting arguments around right-hand-side expression doesn't help the parser:
x = (4) # no help here
Neither does getting rid of spaces
x=(4) # still no help
The parser also learns as it goes along to help disambiguate other
uses of the variable. See http://dev.rubycentral.com/faq/rubyfaq-4.html
for more details (section 4.3)
···
On Dec 7, 2005, at 12:29 AM, Johannes Friestad wrote:
OK, thanks. Can I force "x=(whatever)" to mean a method call instead
of an assignment?
I thought the parantheses were supposed to do that?
gwtmp01@mac.com wrote:
self.x = 4 # explicit method call
x() = 4 # also explicit but not 'rubyish'
Hm, and a syntax error as well, if I'm not wrong.
My bad. I really should cut and paste into irb...
···
On Dec 7, 2005, at 9:09 AM, Florian Groß wrote:
gwtmp01@mac.com wrote:
self.x = 4 # explicit method call
x() = 4 # also explicit but not 'rubyish'
Hm, and a syntax error as well, if I'm not wrong.