# True arity

**URL:** <https://www.ruby-forum.com/t/true-arity/105374>\
**Category:** Ruby\
**Created:** [May 29, 2007, 1:13pm UTC](https://www.ruby-forum.com/t/true-arity/105374 "2007-05-29T13:13:38Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 29, 2007, 1:13pm UTC](https://www.ruby-forum.com/t/true-arity/105374/1 "2007-05-29T13:13:38Z")

</div>

Is there a way to get the _maximum_ number of arguments that a method  
can receive? Method#arity only gives the lower bound…

Daniel

---

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 29, 2007, 1:44pm UTC](https://www.ruby-forum.com/t/true-arity/105374/2 "2007-05-29T13:44:43Z")

</div>

On 5/29/07, Daniel DeLorme [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> Is there a way to get the _maximum_ number of arguments that a method  
> can receive? Method#arity only gives the lower bound…

I am afraid I fail to understand, what would you define as the maximum?

def a(a)… I would say the maximum is 1 which is the arity  
def b(\*b) arity is -1 but what would the maximum of parameters be?  
def c(c,\*d) arity = -2 but some question as above.

The question is, what would you like to achieve?

Cheers  
Robert

---

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 30, 2007, 12:27am UTC](https://www.ruby-forum.com/t/true-arity/105374/3 "2007-05-30T00:27:55Z")

</div>

Robert D. wrote:

> The question is, what would you like to achieve?  
> In the last 2 cases you give the maximum would be Infinity. But in a  
> case like this:  
> def foo(a, b=nil, c=nil)  
> the maximum would be 3 but arity only gives me -2 which means “this  
> method has 1 required argument”. If I invoke the method like:  
> foo(\*args)  
> I want to know for what size of args is this valid? It would be nice if  
> arity returned a Range object (1…3)

Daniel

---

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 30, 2007, 4:23am UTC](https://www.ruby-forum.com/t/true-arity/105374/4 "2007-05-30T04:23:12Z")

</div>

arity is not able to show you all the information you need, default  
parameter are a curse in this regard (or the format arity uses - a  
simple integer is not enough to show all cases… even a range  
wouldn’t, since  
(1…(1.0/0.0))

# 1…Infinity

won’t tell you that much (i think)  
I don’t know of a really simple programmatic way to determine the  
arity, ruby2ruby and manual parsing might help you there if you  
_really_ really need it. Best would be to just raise and tell the user  
he used the wrong arity. Or you could do a rundown, passing as many  
parameters as possible and going down until it doesn’t raise any more.

Please note that this post is full of bad practice and evil hacks 🙂

^ manveru

---

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 30, 2007, 8:23am UTC](https://www.ruby-forum.com/t/true-arity/105374/5 "2007-05-30T08:23:29Z")

</div>

On 5/29/07, Daniel DeLorme [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > The question is, what would you like to achieve?
> 
> In the last 2 cases you give the maximum would be Infinity. But in a  
> case like this:  
> def foo(a, b=nil, c=nil)  
> I know I missed something :(, indeed a good question, thx for  
> explaining to a dummy ;).  
> the maximum would be 3 but arity only gives me -2 which means “this  
> method has 1 required argument”. If I invoke the method like:  
> foo(\*args)  
> I want to know for what size of args is this valid? It would be nice if  
> arity returned a Range object (1…3)
> 
> Daniel

Cheers  
Robert

---

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 30, 2007, 10:57am UTC](https://www.ruby-forum.com/t/true-arity/105374/6 "2007-05-30T10:57:49Z")

</div>

Daniel DeLorme wrote:

> In the last 2 cases you give the maximum would be Infinity. But in a  
> case like this:  
> def foo(a, b=nil, c=nil)  
> the maximum would be 3 but arity only gives me -2 which means “this  
> method has 1 required argument”. If I invoke the method like:  
> foo(\*args)  
> I want to know for what size of args is this valid? It would be nice if  
> arity returned a Range object (1…3)

It could be done, but the current Ruby implementations don’t provide  
this information. Of course, all of them could…we know how many  
required arguments there are, we know how many optional arguments there  
are, and we know if there’s a “rest” arg or not.

Maximum =

…base arity if no optional args or rest arg  
…base arity plus optional arg count if no rest arg  
…infinity if rest arg in any case

Minimum = …well you know it, because we have this today.

I guess the question would be whether this is useful enough information  
to warrant a semantic change in “arity” representation.

- Charlie

---

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 30, 2007, 1:55pm UTC](https://www.ruby-forum.com/t/true-arity/105374/7 "2007-05-30T13:55:40Z")

</div>

On 5/30/07, Daniel DeLorme [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> IMHO, Range objects are underused. MatchData#offset would be so much  
> nicer if it returned (a…b) instead of [a,b]
> 
> just my 2¥  
> that is clever Daniel 😉

but seriously I just wanted to backup your idea which seems pretty  
good, what about an RCR?  
And yes, by all means, use a range, look at this pretty idiom which  
would result

raise ArgumentError unless method.arityrange === n

Cheers  
Robert

---

<div class="post-metadata">

**Author:** ![Daniel\_DeLorme](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/9d8465/32.png) [@Daniel\_DeLorme](https://www.ruby-forum.com/u/Daniel_DeLorme)\
**Post date:** [May 30, 2007, 11:52am UTC](https://www.ruby-forum.com/t/true-arity/105374/8 "2007-05-30T11:52:24Z")

</div>

Charles Oliver N. wrote:

> I guess the question would be whether this is useful enough information  
> to warrant a semantic change in “arity” representation.

It can be useful in some cases and it is _certainly_ cleaner than the  
wondrous hack that is a negative arity, but I’m never very fond of  
backwards compatibility breakage. I’d be more in favor of introducing a  
new method (e.g. ‘arityrange’) that would return a Range object. (please  
pretty please mr. core developpers)

IMHO, Range objects are underused. MatchData#offset would be so much  
nicer if it returned (a…b) instead of [a,b]

just my 2¥

Daniel
