Hi Guys,
I have been wondering what does this statement do and what does it set.
It interferes with my methods_missing handler:
{code}
class MyClass
something = “something else”
end
{code}
Hi Guys,
I have been wondering what does this statement do and what does it set.
It interferes with my methods_missing handler:
{code}
class MyClass
something = “something else”
end
{code}
Stanislaw W. wrote:
Hi Guys,
I have been wondering what does this statement do and what does it set.
It interferes with my methods_missing handler:{code}
class MyClasssomething = “something else”
end
{code}
I guess this is assigning a string to a variable that is created in the
MyClass scope. But my problem is that I have some setter methods that
I’m using through method_missing, but method_missing is never triggered
because it is assigning stuff just like in the example above.
Stanislaw W. wrote:
end
{code}I guess this is assigning a string to a variable that is created in the
MyClass scope. But my problem is that I have some setter methods that
I’m using through method_missing, but method_missing is never triggered
because it is assigning stuff just like in the example above.
You’re saying that “something” is supposed to be treated like a method
instead of like a variable? Try
self.something = “something else”
On Mon, Mar 2, 2009 at 9:18 AM, Stanislaw W. [email protected]
wrote:
That statement is the same as calling MyClass.something=(“something
else”)
If you want method_missing to catch it, you need to define a
method_missing on the class itself, like this:
class MyClass
def self.method_missing(name, *args)
end
end
Jason
On Mon, Mar 2, 2009 at 9:31 AM, Stanislaw W. [email protected]
wrote:
self.class.method(name).call args
set_field = value
endend
B.my_method
Yes this is a well-known ruby newbie gotcha.
Because the Ruby syntax allows simple names to refer to either a local
variable or a method invocation, there are some times when things get
ambiguous.
In the case of a name on the right hand side of an assignment, or
equivalent
settings, the ruby compiler treats the name as a local variable if the
name
has already been assigned a value, and as a method call with an implied
receiver of self otherwise.
In the case of a name on the right hand side, it treats the name as a
local
variable, and assigns it a value.
You HAVE to explicitly give a receiver of self when invoking an
attribute
setter method in ruby. So in my_method you have to use self.set_field =
value.
And this is why, for those who like to mark methods as private.
class Foo
private
def a=(value)
…
end
def b
…
end
Rick DeNatale
Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
Thanks Rick,
This is clear explanation. Makes sense…
Ok, this is the example I want to get to work. Method set_field is never
triggered because local variable set_field is being set.
class A
def self.set_field=(value)
puts “Trying to set field value”
end
def method_missing(name, *args)
self.class.method(name).call args
end
def self.method_missing(name, *args)
new.method(name).call args
end
end
class B < A
def my_method(value)
set_field = value
end
end
B.my_method
On 02.03.2009 15:27, Jason R. wrote:
something = “something else”
That statement is the same as calling MyClass.something=(“something else”)
Actually, no. See Rick’s excellent explanation. For test addicts:
[oracle@ora01 ~]$ ruby y.rb
test 1
foo called with 123
test 2
[oracle@ora01 ~]$ cat y.rb
class X
def self.foo=(a)
printf “foo called with %p\n”, a
end
end
puts “test 1”
X.foo = 123
class X
puts “test 2”
foo = 987
end
[oracle@ora01 ~]$
If you want method_missing to catch it, you need to define a
method_missing on the class itself, like this:class MyClass
def self.method_missing(name, *args)
endend
Won’t help here, because the statement is interpreted as a local
variable assignment.
Kind regards
robert
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs