Project

General

Profile

Actions

Feature #5474

closed

keyword argument

Added by mame (Yusuke Endoh) over 12 years ago. Updated over 11 years ago.

Status:
Closed
Target version:
[ruby-core:40290]

Description

Hello,

I'm sending a patch for keyword arguments.

(This feature had been discussed in #5454, but I'm re-creating
a new ticket because the old ticket was resigtered in ruby-dev)

Matz himself proposed this feature. It is also basically
promised to include the feature in 2.0. [ruby-core:39837]
I'm planning to commit the patch after it is reviewed by koichi.

But the detail of the spec is not fixed yet, and may be changed
drastically.
We would like to hear your comments and suggestions, especially,
with a use case and/or an actual experience.

The background of this proposal is that, in the recent Ruby,
the last argument (as a Hash) is often used to pass optional
information. This feature is intended to aid the style.

Look an example:

def create_point(x, y, color: "white", size: 1)
  # keyword arguments  ^^^^^^^^^^^^^^^^^^^^^^^ here!

  p [x, y, color, size]
end

create_point(2, 3, color: "red")
  #=> [2, 3, "red", 1]

The caller size is a traditional hash argument notation.
This feature is Hash parsing in the callee side.

(So it is more suitable to call it "keyword parameter."
But I use "keyword argument" because everyone calls so.)

We can implement the similar behavior in pure Ruby. However,
this feature is easier to read/write, and richer in the some
aspects:

  • it raises an TypeError when unknown keyword is given

    create_point(2, 3, style: "solid")
    #=> unknown keyword (TypeError)

  • you can use ** argument to suppress the TypeError and/or
    to get the given hash itself:

    def create_point(x, y, color: "white", size: 1, **h)
    p [x, y, color, size, h]
    end
    create_point(2, 3, style: "solid")
    #=> [2, 3, "red", 1, {:style=>"solid"}]

  • it is easily used even when there is a rest argument

    def create_point(x, y, *r, color: "solid", size: 1)
    ...
    end

    (a complex and non-essential code is required to
    implement the same behavior in pure Ruby)

  • there is room for optimizing the speed (though I have
    not done any optimization yet)

An alternative design is to treat all parameters as keyword
arguments (as Evan said in [ruby-core:40195]).

def create_point(x, y, color = "white", size = 1)
p [x, y, color, size]
end
create_point(color: "red", x: 2, y: 3)
#=> [2, 3, "red", 1]

Actually I also like this, but I'm afraid if it is too flexible
and seems difficult to implement and optimize.

Thanks,

--
Yusuke Endoh


Files

keyword-argument-patch-20111023.zip (12.2 KB) keyword-argument-patch-20111023.zip mame (Yusuke Endoh), 10/23/2011 09:53 PM

Related issues 2 (0 open2 closed)

Related to Ruby master - Bug #6086: Number of arguments and named parametersRejectedmatz (Yukihiro Matsumoto)02/25/2012Actions
Related to Ruby master - Feature #6414: Destructuring Assignment ClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0