Method missing and arrays as arguments..

K

Kyle Schmitt

How do you go about passing arrays as arguments to something like
method_missing? I've got a method that takes an array as an argument,
but calling it via method_missing is proving problematic. How do you
deal with arrays in these situations?

def table_row(values)
# values is the list of items in the table row
#....
end

def method_missing(method,*args)
if respond_to?method.to_s[/^add_([^$]+)/,1]
@data<<method(method.to_s[/^add_([^$]+)/,1]).call(*args)
else
super method_missing(method,*args)
end
end


--Kyle
 
G

Gary Wright

How do you go about passing arrays as arguments to something like
method_missing? I've got a method that takes an array as an argument,
but calling it via method_missing is proving problematic. How do you
deal with arrays in these situations?

def method_missing(method,*args)
if respond_to?method.to_s[/^add_([^$]+)/,1]
@data<<method(method.to_s[/^add_([^$]+)/,1]).call(*args)
else
super method_missing(method,*args)
end
end


I think your problem is in the else clause. It should be:

else
super
end

You don't want to call method_missing explicitly, you'll create an
infinite recursion.
 
R

Rick DeNatale

[Note: parts of this message were removed to make it a legal post.]

How do you go about passing arrays as arguments to something like
method_missing? I've got a method that takes an array as an argument,
but calling it via method_missing is proving problematic. How do you
deal with arrays in these situations?

def table_row(values)
# values is the list of items in the table row
#....
end

def method_missing(method,*args)
if respond_to?method.to_s[/^add_([^$]+)/,1]
@data<<method(method.to_s[/^add_([^$]+)/,1]).call(*args)
else
super method_missing(method,*args)
end
end



I'm not sure exactly what you are trying to do, I'm guessing that if you
send add_table_row(some_array) to an instance, the method_missing will call
table_row and add the result to @data.

The problem isn't the array argument, it's what you are doing in the true
leg of the if.

The first argument to method_missing is not a method, but a symbol. You are
converting this symbol to a string, stripping off add_ from the beginning
and they trying to call the string, which ain't gonna work.

Instead you want to use send:

class SomeClass
attr_reader :data

def table_row(values)
# values is the list of items in the table row
#....
values
end

def method_missing(symbol,*args)
without_add = symbol.to_s[/^add_([^$]+)/,1]
if respond_to? without_add
@data ||= []
@data<< send(without_add, *args)
else
super method_missing(method,*args)
end
end
end

sc = SomeClass.new
sc.add_table_row([1,2,3])
sc.data # => [[1, 2, 3]]

I used lazy initialization to initialize @data, assuming that this is
vaguely what you are after.

--
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
 
R

Rick DeNatale

[Note: parts of this message were removed to make it a legal post.]

On Apr 6, 2009, at 4:35 PM, Kyle Schmitt wrote:

How do you go about passing arrays as arguments to something like
method_missing? I've got a method that takes an array as an argument,
but calling it via method_missing is proving problematic. How do you
deal with arrays in these situations?

def method_missing(method,*args)
if respond_to?method.to_s[/^add_([^$]+)/,1]
@data<<method(method.to_s[/^add_([^$]+)/,1]).call(*args)
else
super method_missing(method,*args)
end
end


I think your problem is in the else clause. It should be:

else
super
end

You don't want to call method_missing explicitly, you'll create an infinite
recursion.
Well, that's another problem, which I overlooked in MY response.

--
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
 
K

Kyle Schmitt

Ok, I found my issue, it was rather dense of me to be honest, it had
to do with how I was calling it.

That said, this is what I came up with


def method_missing(method,*args)
without_add=method.to_s[/^add_([^$]+)/,1]
if not(without_add.empty?) and respond_to?without_add
#calling the string worked (I'm guessing it tries a .to_sym)
#@data<<method(without_add).call(*args)
# Still, this is prettier
@data<<send(without_add,*args)
else
super
end
end
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,576
Members
45,054
Latest member
LucyCarper

Latest Threads

Top