まつもと ゆきひろです

In message "Re: [ruby-dev:44602] keyword arguments"
    on Tue, 18 Oct 2011 01:36:58 +0900, Yusuke Endoh <mame / tsg.ne.jp> writes:

|キーワード引数を実装してみました。

ありがとうございます。

| $ cat t.rb
| def foo(str: "foo", num: 424242)
|   p [str, num]
| end
| foo(str: "bar")
|
| $ ./ruby t.rb
| ["bar", 424242]
|
|細かいことはまだ気にしていませんが、キーワード引数が 2.0 に入る
|ことはかなり確定的なので、とりあえず trunk に入れて考えるという
|のはどうでしょうか。

賛成です。trunkに入れちゃっていいのかな。そういう機能の入っ
ていない1.9ブランチが欲しい人は急いで切ったほうがいいと思い
ますよ。

|以下は未実装・懸案です。
|
| - 残りのキーワード引数を受け取る方法が必要か
|
|   def foo(str: "foo", num: 424242, **h)
|     p h
|   end
|   foo(str: "bar", check: true)  #=> { :check => true }

メソッドの移譲のために必要だと思います。

| - nil が渡されたらやはり nil になるべき?
|
|   def foo(str: "foo")
|     p str
|   end
|   foo(str: nil) #=> nil ? (今は手抜きで "foo")

nilになるべきでしょう。

| - rest なしで知らないキーワードが来たら例外・警告を発して
|   欲しい?
|
|   def foo(str: "foo", num: 424242)
|   end
|   foo(check: true) #=> ArgumentError?

ここは議論の余地があるところですね。現時点では、**で受け取ら
ない限り例外にするべきだと考えていますが、実際にいろいろな局
面で使ってみると意見が変わるかもしれません。

| - Hash のように振る舞うオブジェクトもキーワード引数として
|   解釈すべき? (現在は速度重視で T_HASH だけ見ている)

とりあえずto_hashを使ってください。新設のto_kwのようなメソッ
ドを使うべきなのかもしれませんが。

| - 引数の順番はよいか
|
|   def foo(
|     a, b, c,     # mandatory arguments
|     opt = 1,     # optional arguments
|     *rest,       # rest argument
|     x, y, z,     # post mandatory arguments
|     k1: 1, k2:2, # keyword arguments
|     **kh,        # keyword rest argument
|     &blk         # block argument
|   )

これで良いと思います。

                                まつもと ゆきひろ /:|)