遠藤です。
# redmine の 2.0 tracker にチケットを登録したのですが、メールが
# 流れないようです。パッチはチケットを見てください。
# http://redmine.ruby-lang.org/issues/5454
キーワード引数を実装してみました。
$ cat t.rb
def foo(str: "foo", num: 424242)
p [str, num]
end
foo(str: "bar")
$ ./ruby t.rb
["bar", 424242]
細かいことはまだ気にしていませんが、キーワード引数が 2.0 に入る
ことはかなり確定的なので、とりあえず trunk に入れて考えるという
のはどうでしょうか。
一応私の環境では make check は通ります (キーワード引数のテスト
は書いてないですが) 。パーサに conflict はないです。
既存のベンチマークを見ると、一部気になる項目もありますが (vm1_
rescue とか) 、全体的には特に速度劣化しないようです。
以下は未実装・懸案です。
- 残りのキーワード引数を受け取る方法が必要か
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")
- rest なしで知らないキーワードが来たら例外・警告を発して
欲しい?
def foo(str: "foo", num: 424242)
end
foo(check: true) #=> ArgumentError?
- Hash のように振る舞うオブジェクトもキーワード引数として
解釈すべき? (現在は速度重視で T_HASH だけ見ている)
- 引数の順番はよいか
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
)
- 他いろいろ
--
Yusuke Endoh <mame / tsg.ne.jp>