From: "prijutme4ty (Ilya Vorontsov)" Date: 2013-03-12T21:35:39+09:00 Subject: [ruby-core:53333] [CommonRuby - Feature #7701] Non-optional (required) keyword args Issue #7701 has been updated by prijutme4ty (Ilya Vorontsov). trans (Thomas Sawyer) wrote: > =begin > Is it really a good idea to support required keyword arguments? If it is ((*required*)) shouldn't it really be a regular argument? I worry it would encourage API designers to put extraneous labels on things that arn't necessary, creating more difficult APIs to recollect w/o any advantage. > > At face, why do this: > > def foo(a, b:) > > when you can just do this: > > def foo(a, b) > > =end If one use several required keyword arguments like in def foo(a:, b:) the developer needn't remember order of arguments, he can use args in any order with names clearing his intentions. For example you will never be looking at some file hidden far in a thirdparty gem, trying to understand, who is sender and who is recipient, if you have a method Message.send(text, from:, to:) ---------------------------------------- Feature #7701: Non-optional (required) keyword args https://bugs.ruby-lang.org/issues/7701#change-37529 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/