Feature #9025

Clarify the error message when calling a method with the wrong number of arguments

Added by Gonzalo Rodríguez 6 months ago. Updated 6 months ago.

[ruby-core:<unknown>]
Status:Open
Priority:Normal
Assignee:-
Category:-
Target version:-

Description

Currently when calling a method with the wrong number of arguments we get a confusing error message:

ArgumentError: wrong number of arguments (1 for 0)

That means that the method was meant to accept 0 arguments, but 1 was provided instead. This error message is confusing, and a large number of people had to search for its meaning. For example [1] has 11000 views.

I propose that we change the error message to something whose meaning is obvious. Examples:

  • ArgumentError: wrong number of arguments (expected: 1, provided: 0)
  • ArgumentError: wrong number of arguments (1 instead of 0)

This ticket originated from this pull request: https://github.com/ruby/ruby/pull/367

[1] http://stackoverflow.com/questions/7537450/what-does-wrong-number-of-arguments-1-for-0-mean-in-ruby

History

#1 Updated by Tsuyoshi Sawada 6 months ago

"instead of" is even worse than "for". It is ambiguous: "1 argument was given instead of the expected 0" or "1 argument should be given instead of 0 that was given". "for" at least does not have that ambiguity.

#2 Updated by Fuad Saud 6 months ago

I like the "expected" wording. Also, wouldn't help a little to print the method name? May help to identify what's wrong faster.

--

Fuad Saud
Sent with Sparrow (http://www.sparrowmailapp.com/?sig)

On Tuesday, October 15, 2013 at 11:34 PM, sawa (Tsuyoshi Sawada) wrote:

Issue #9025 has been updated by sawa (Tsuyoshi Sawada).

"instead of" is even worse than "for". It is ambiguous: "1 argument was given instead of the expected 0" or "1 argument should be given instead of 0 that was given". "for" at least does not have that ambiguity.

Feature #9025: Clarify the error message when calling a method with the wrong number of arguments
https://bugs.ruby-lang.org/issues/9025#change-42489

Author: Nerian (Gonzalo Rodríguez)
Status: Open
Priority: Normal
Assignee:

Category:

Target version:

Currently when calling a method with the wrong number of arguments we get a confusing error message:

ArgumentError: wrong number of arguments (1 for 0)

That means that the method was meant to accept 0 arguments, but 1 was provided instead. This error message is confusing, and a large number of people had to search for its meaning. For example [1] has 11000 views.

I propose that we change the error message to something whose meaning is obvious. Examples:

  • ArgumentError: wrong number of arguments (expected: 1, provided: 0)
  • ArgumentError: wrong number of arguments (1 instead of 0)

This ticket originated from this pull request: https://github.com/ruby/ruby/pull/367

[1] http://stackoverflow.com/questions/7537450/what-does-wrong-number-of-arguments-1-for-0-mean-in-ruby

http://bugs.ruby-lang.org/

#3 Updated by Matthew Kerwin 6 months ago

This is sort of a bike-shedding issue, and I'm always happy to throw paint at bike sheds!

In the past, in various languages and environments, I've tended to use:
"wrong number of arguments (given 1, expected 0)"

However, note that that StackOverflow question only has 9 upvotes. Other questions from the user are things like "What does the “+=” operator do in Java?", and a couple of spoon-feedy "please fix/explain this code" questions. While I agree that it would be nice to support ruby newbies with nice meaningful errors, I believe that the current message already conveys all the information required to comprehend it. Critically "wrong number of arguments" is pretty universal for programmers, even without relying on English per se, and the smallest amount of debugging will show that one of those numbers corresponds with the invocation causing the error, and therefore the other number must be the correct "number of arguments" for that method.

#4 Updated by Matthew Kerwin 6 months ago

fuadksd (Fuad Saud) wrote:

I like the "expected" wording. Also, wouldn't help a little to print the method name? May help to identify what's wrong faster.

The first line of the error's backtrace gives the filename and line number of the bad call. If that line has so many method calls that you can't work out which one is wrong, perhaps that is the true cause of the error.

#5 Updated by Fuad Saud 6 months ago

Maybe. Sometimes, if you do chain a couple of methods, you may get confused. I'm not saying there's no way you can figure out what's happening in the current situation, I just feel like the method name belongs here, as it belongs in NoMethodError messages.

#6 Updated by Martin Dürst 6 months ago

phluid61 (Matthew Kerwin) wrote:

This is sort of a bike-shedding issue, and I'm always happy to throw paint at bike sheds!

In the past, in various languages and environments, I've tended to use:
"wrong number of arguments (given 1, expected 0)"

That's a good way to put it, and very close to Nerian's
ArgumentError: wrong number of arguments (expected: 1, provided: 0)
(close enough to really just be bikeshedding)

While I agree that it would be nice to support ruby newbies with nice meaningful errors, I believe that the current message already conveys all the information required to comprehend it. Critically "wrong number of arguments" is pretty universal for programmers, even without relying on English per se, and the smallest amount of debugging will show that one of those numbers corresponds with the invocation causing the error, and therefore the other number must be the correct "number of arguments" for that method.

Ruby is all about making it easier for the programmer. Even the smallest amount of debugging is too much when it can be eliminated by tweaking the error message. This is definitely finetuning, but it's not bikeshedding.

#7 Updated by Matthew Kerwin 6 months ago

duerst (Martin Dürst) wrote:

phluid61 (Matthew Kerwin) wrote:

[...] I believe that the current message already conveys all the information required to comprehend it. [...] the smallest amount of debugging will show [...]

Ruby is all about making it easier for the programmer. Even the smallest amount of debugging is too much when it can be eliminated by tweaking the error message.

I think that statement accidentally reached a point of absurdity by using a very precise definition of "debugging" that I don't share.

My argument is that the programmer still has to visit the erroneous line of code, inspect it, and probably modify it to have the correct number of arguments. That amount of debugging is always required, and would be if the error message said "ArgumentError" or "ArgumentError: the method `freb' on a String object does not accept any arguments, however it was passed a Fixnum".

I agree that someone not familiar with more technical English writing might be confused by the "(1 for 0)" part, but only when reading it in isolation. If the programmer sees the message, they have to fix it, in which case they are already in the code and can understand the message using contextual information (e.g. how many arguments there are in the call, what the API docs say about the function's arity and semantics, etc.); if an end user sees the message, they don't have to understand it and couldn't do anything about it if they did, they just pass it on to the programmer verbatim as a bug report.

Also available in: Atom PDF