From: "trans (Thomas Sawyer)" Date: 2013-03-13T22:32:49+09:00 Subject: [ruby-core:53372] [CommonRuby - Feature #7701] Non-optional (required) keyword args Issue #7701 has been updated by trans (Thomas Sawyer). > Because the format of #parameters has very little to do with providing a required keyword argument feature. It does not move the discussion about required keyword arguments forward when we discuss new data formats for #parameters. Please stay on topic :-) Wait. You are the one who brought it up in #16. I was just responding to that. > It seems a little early to claim that API designers "shouldn't" be doing something with keyword args (like requiring they be passed in) given that Ruby's only had keyword arguments for a couple weeks. I agree for the opposite reason! Why the rush to add required keyword arguments when Ruby took, jeez, how many years, to get keyword arguments? Wouldn't it be prudent to give it some time first? > It seems your only justification for rejecting required kwargs is because you believe it will be harder to remember required keywords than required positional arguments. Is that correct? Really? That's what you got from what I wrote? Well, try reading what I wrote again. If you want a summary, I suppose the closest common description is YAGNI. > def foo(a:, b:) .... end > foo(1) => ArgumentError("Method `foo' requires arguments `a', `b'") > Bad thing? Yes. What Ruby *really needs* is to improve it's current argument errors. def foo(a, b) .... end foo(1) => ArgumentError("Method `foo' requires 2 arguments: `a', `b'") ---------------------------------------- Feature #7701: Non-optional (required) keyword args https://bugs.ruby-lang.org/issues/7701#change-37570 Author: headius (Charles Nutter) Status: Assigned Priority: Normal Assignee: nobu (Nobuyoshi Nakada) Category: Target version: =begin I would like to see keyword args expanded to include a non-optional form, to force callers to pass in keyword arguments. Currently, we have required, optional, and rest positional args but only optional and rest keyword args. Consistency is one small reason to add required keyword args. They would likely take the form of keyword with no default value: def foo(a:, b:) ... end foo(a: 1, b: 2) # ok foo(a: 1) # ArgumentError Justifications: * Consistency with positional args. A weak justification, I know. * Avoiding a lot of boilerplate code by users wishing to enforce keywords being passed in. Example from tenderlove: def foo(a: raise('pass a'), b: raise('pass b')) * Building a rich API atop keyword args would be easier (i.e. require fewer manual checks) if you could force some keywords to be passed in. Having to check everywhere when you require a keyword argument is unpleasant. * Keyword args already enforces that no *additional* keyword args can be passed (without **), and it seems lopsided to have no way to enforce a minimum set of keyword args. =end -- http://bugs.ruby-lang.org/