# Method missing and arrays as arguments

**URL:** <https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873>\
**Category:** Ruby\
**Created:** [April 6, 2009, 10:36pm UTC](https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873 "2009-04-06T22:36:38Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![kyle\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f6c823/32.png) [@kyle\_s](https://www.ruby-forum.com/u/kyle_s)\
**Post date:** [April 6, 2009, 10:36pm UTC](https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873/1 "2009-04-06T22:36:38Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kyle\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f6c823/32.png) [@kyle\_s](https://www.ruby-forum.com/u/kyle_s)\
**Post date:** [April 6, 2009, 11:02pm UTC](https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873/2 "2009-04-06T23:02:26Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![kyle\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f6c823/32.png) [@kyle\_s](https://www.ruby-forum.com/u/kyle_s)\
**Post date:** [April 6, 2009, 11:14pm UTC](https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873/3 "2009-04-06T23:14:08Z")

</div>

On Mon, Apr 6, 2009 at 4:35 PM, Kyle S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> 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/](http://talklikeaduck.denhaven2.com/)  
Twitter: [http://twitter.com/RickDeNatale](http://twitter.com/RickDeNatale)  
WWR: [http://www.workingwithrails.com/person/9021-rick-denatale](http://www.workingwithrails.com/person/9021-rick-denatale)  
LinkedIn: [http://www.linkedin.com/in/rickdenatale](http://www.linkedin.com/in/rickdenatale)

---

<div class="post-metadata">

**Author:** ![kyle\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f6c823/32.png) [@kyle\_s](https://www.ruby-forum.com/u/kyle_s)\
**Post date:** [April 7, 2009, 12:06am UTC](https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873/4 "2009-04-07T00:06:50Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![kyle\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f6c823/32.png) [@kyle\_s](https://www.ruby-forum.com/u/kyle_s)\
**Post date:** [April 6, 2009, 11:15pm UTC](https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873/5 "2009-04-06T23:15:19Z")

</div>

On Mon, Apr 6, 2009 at 5:00 PM, Gary W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > ```
> > @data<<method(method.to_s[/^add_([^$]+)/,1]).call(*args)
> > 
> > ```
> 
> ```
> 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/](http://talklikeaduck.denhaven2.com/)  
Twitter: [http://twitter.com/RickDeNatale](http://twitter.com/RickDeNatale)  
WWR: [http://www.workingwithrails.com/person/9021-rick-denatale](http://www.workingwithrails.com/person/9021-rick-denatale)  
LinkedIn: [http://www.linkedin.com/in/rickdenatale](http://www.linkedin.com/in/rickdenatale)

---

<div class="post-metadata">

**Author:** ![kyle\_s](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/f6c823/32.png) [@kyle\_s](https://www.ruby-forum.com/u/kyle_s)\
**Post date:** [April 7, 2009, 7:39pm UTC](https://www.ruby-forum.com/t/method-missing-and-arrays-as-arguments/164873/6 "2009-04-07T19:39:17Z")

</div>

Oh, and I forgot to say, thanks, it did help a ton.
