From: Akinori MUSHA Date: 2009-02-23T13:06:56+09:00 Subject: [ruby-dev:38068] Re: Add option hash support to rb_scan_args() --pgp-sign-Multipart_Mon_Feb_23_13:08:01_2009-1 Content-Type: text/plain; charset=ISO-2022-JP At Sun, 22 Feb 2009 00:36:27 +0900, matz wrote: > > まつもと ゆきひろです > > In message "Re: [ruby-dev:38057] Re: Add option hash support to rb_scan_args()" > on Fri, 20 Feb 2009 22:31:25 +0900, Yusuke ENDOH writes: > > |キーワード引数らしい引数の受け取り方というと、C API より > |Ruby レベルの方が気になります。 > |近い将来、新しい文法を導入する予定や構想はあるのでしょうか。 > > 予定や構想はあります。が、時期はなんとも。2.0になりそうです > し、その時期は完全に未定です。 [ruby-dev:23533] に提案がありますね。構文もさりながら、C APIの 設計もなかなか大変そうです。argc/argvで表せないと多くのAPIを直す 必要が出てくるとか、受け渡しはfirst classなHashでいいのかとか、 引数解析のパフォーマンスはどうかとか。 > |例えば、こんな感じに書けるとか。 > | > | def foo(x, y, z, a: "a", b: "b", c: "c") > | p [x, y, z, a, b, c] > | end > | > | foo(1, 2, 3, c: "X") #=> [1, 2, 3, "a", "b", "X"] > > という風に書けるようにしたいと思っています。  順序なし名前引数というのもあった方がいいんじゃないでしょうか。 でないと、順序に依存した用法が広まって引数を廃止することが難しく なりそうです。  あとは、 - 必須引数にも名前を付けたい - 実装上仮引数名は短くしたいがAPIとしての名前(キーワード)は長く わかりやすくしたい という要求も考慮し、名前に加えて仮引数名も指定できるように考えて みたのが以下の構文です。 # Ruby def meth(mand1: var1, # leading mandatory argument(s) opt1: var2=val, # ordered optional argument(s) *varlen: var3, # variable length arguments mand2: var4 # ordered mandatory argument(s) opt2:: var5=val # unordered argument(s) **var6, # all arguments in hash &block) # .. end # The var1, var2, var3, var4, var5 parts (formal parameter names) # above are omittable. methodname(x, y) # := meth(mand1: x, mand2: y) methodname(x, z, y) # := meth(mand1: x, opt1: z, mand2: y) methodname(x, y, varlen: l) # := meth(mand1: x, varlen: l, mand2: y) methodname(x, y, :varlen => l) # ditto #methodname(x, y, h) # not allowed anymore methodname(x, y, **h) # but hash splat is instead a = [x, y] h = { opt1: m, opt2: n } methodname(*a, **h) # := meth(mand1: x, opt1: m, mand2: y, opt2: n) h1 = { mand1: x, mand2: y, opt1: r } h2 = { opt1: p, opt2: q } methodname(**h1, **h2) # := meth(**(h1.merge(h2))) -- Akinori MUSHA / http://akinori.org/ --pgp-sign-Multipart_Mon_Feb_23_13:08:01_2009-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkmiISEACgkQkgvvx5/Z4e4mvQCfR5PSR6dAFOgp0IdPFmhVQjr9 AmUAoJHWxSRywJQ6sK4lwdRggnXK2HDQ =8rDw -----END PGP SIGNATURE----- --pgp-sign-Multipart_Mon_Feb_23_13:08:01_2009-1--