Feature #5454
closedkeyword arguments
Description
遠藤です。
キーワード引数を実装してみました。
$ 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
 )
- 
他いろいろ 
benchmark results:
name    ruby 1.9.4dev (2011-10-16 trunk 33471) [i686-linux]     ruby 1.9.4dev (2011-10-16 trunk 33471) [i686-linux]     average difference
app_answer      0.259   0.131   -0.127
app_erb 2.699   2.681   -0.018
app_factorial   5.236   5.320   0.084
app_fib 1.576   1.731   0.154
app_mandelbrot  4.324   3.911   -0.413
app_pentomino   40.882  40.768  -0.114
app_raise       0.966   0.982   0.017
app_strconcat   3.143   3.102   -0.041
app_tak 2.192   2.140   -0.052
app_tarai       1.682   1.748   0.066
app_uri 1.870   1.767   -0.103
io_file_create  2.589   2.570   -0.019
io_file_read    6.169   5.838   -0.330
io_file_write   1.966   1.976   0.010
io_select       3.066   3.111   0.044
io_select2      3.647   3.623   -0.025
io_select3      0.051   0.051   0.000
loop_for        3.302   3.219   -0.082
loop_generator  1.111   1.102   -0.009
loop_times      2.959   2.960   0.001
loop_whileloop  1.437   1.422   -0.016
loop_whileloop2 0.298   0.297   -0.001
so_ackermann    1.862   1.816   -0.046
so_array        3.317   3.473   0.155
so_binary_trees 0.891   0.900   0.009
so_concatenate  9.538   8.696   -0.842
so_count_words  0.412   0.407   -0.005
so_exception    2.185   2.177   -0.008
so_fannkuch     3.338   3.334   -0.004
so_fasta        5.182   5.061   -0.121
so_k_nucleotide 3.425   3.324   -0.101
so_lists        2.239   2.312   0.073
so_mandelbrot   11.479  10.660  -0.820
so_matrix       2.206   2.177   -0.030
so_meteor_contest       11.479  11.634  0.155
so_nbody        8.006   7.925   -0.081
so_nested_loop  2.768   2.614   -0.154
so_nsieve       6.163   6.184   0.021
so_nsieve_bits  6.618   6.850   0.231
so_object       1.807   1.899   0.091
so_partial_sums 11.057  10.537  -0.520
so_pidigits     2.944   3.011   0.066
so_random       1.962   1.992   0.031
so_reverse_complement   3.136   3.036   -0.099
so_sieve        2.224   2.203   -0.021
so_spectralnorm 7.981   7.591   -0.390
vm1_block*      3.790   5.112   1.306
vm1_const*      0.756   0.757   -0.015
vm1_ensure*     0.487   0.601   0.099
vm1_ivar*       1.634   1.863   0.213
vm1_ivar_set*   1.625   1.661   0.021
vm1_length*     1.312   1.366   0.038
vm1_neq*        1.152   0.979   -0.189
vm1_not*        0.589   0.589   -0.015
vm1_rescue*     0.133   0.750   0.601
vm1_simplereturn*       2.467   3.601   1.119
vm1_swap*       1.199   1.716   0.502
vm2_array*      1.644   1.643   -0.001
vm2_case*       0.324   0.348   0.023
vm2_defined_method*     8.829   9.003   0.173
vm2_eval*       39.557  37.726  -1.832
vm2_method*     5.255   4.113   -1.142
vm2_mutex*      3.043   3.175   0.131
vm2_poly_method*        6.044   5.340   -0.705
vm2_poly_method_ov*     0.493   0.675   0.181
vm2_proc*       1.297   1.391   0.093
vm2_regexp*     2.419   2.557   0.137
vm2_send*       0.662   0.903   0.241
vm2_super*      1.107   1.016   -0.093
vm2_unif1*      0.688   0.816   0.127
vm2_zsuper*     1.210   1.068   -0.143
vm3_clearmethodcache    0.785   0.770   -0.014
vm3_gc  2.487   2.453   -0.033
vm_thread_alive_check1  0.389   0.422   0.033
vm_thread_create_join   6.064   6.181   0.118
vm_thread_mutex1        2.349   2.546   0.197
vm_thread_mutex2        10.123  7.755   -2.368
vm_thread_mutex3        4.428   5.390   0.962
vm_thread_pass  0.692   0.754   0.063
vm_thread_pass_flood    0.167   0.170   0.003
vm_thread_pipe  2.437   2.540   0.103¶
average total difference is -3.4518661499023438
--
Yusuke Endoh mame@tsg.ne.jp
Files
 Updated by Anonymous
          Updated by Anonymous