From: sto.mar@... Date: 2017-02-26T21:07:38+00:00 Subject: [ruby-core:79791] [Ruby trunk Bug#13196] Improve keyword argument errors when non-keyword arguments given Issue #13196 has been updated by Marcus Stollsteimer. Olivier Lacan wrote: > ```diff > + if (req_key_num > 0) { > + VALUE mesg = rb_attr_get(exc, idMesg); > + rb_str_resize(mesg, RSTRING_LEN(mesg)-1); > + rb_str_cat_cstr(mesg, "; required keyword"); > + if (req_key_num > 1) rb_str_cat_cstr(mesg, "s"); > + do { > + rb_str_cat_cstr(mesg, ": "); > + rb_str_append(mesg, rb_id2str(*keywords++)); > + rb_str_cat_cstr(mesg, ","); > + } while (--req_key_num); > ``` * I think `rb_str_cat_cstr(mesg, ": ");` in the while-loop doesn't work; ":" must be added before the loop, in the loop only " " to separate different entries * suggestion: s/keyword/keyword argument/, since "keyword" might be confused with language keywords like `def`, `end`, ... Regarding `code` vs. `:code`, IMHO for beginners it's much easier to understand without leading ":", similar to the usage in the call sequence, it's _not_ `explode(:code: 123)` but `explode(code: 123)`, and in the method body. ---------------------------------------- Bug #13196: Improve keyword argument errors when non-keyword arguments given https://bugs.ruby-lang.org/issues/13196#change-63217 * Author: Olivier Lacan * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- Given the following method definition: ```ruby def explode(code:) puts "Boom!" end ``` If a Ruby user doesn't provide any arguments when calling the `explode` method, the following helpful feedback is given: ```ruby explode ArgumentError: missing keyword: code ``` But when a Ruby user mistakenly provides a regular argument, the exception message is obtuse and unhelpful: ```ruby explode "1234" ArgumentError: wrong number of arguments (given 1, expected 0) ``` This does not provide information to properly recover from the error. Worse, it's incorrect. It is not true that the method expected 0 arguments. The method expected 1 keyword argument. Instead, Ruby should respond something like: ```ruby explode "1234" ArgumentError: missing keyword: code, given "1234" which is not a keyword argument. ``` One could argue that this situation would call for a different error class, perhaps a `KeywordArgumentError` that would inherit from `ArgumentError`, but that would extend the scope of this feature request a bit too far in my mind. ---Files-------------------------------- missing_kwargs.diff (1.2 KB) -- https://bugs.ruby-lang.org/ Unsubscribe: