From: Yusuke Endoh Date: 2011-10-23T19:25:04+09:00 Subject: [ruby-dev:44685] [ruby-trunk - Feature #5454][Rejected] keyword arguments Issue #5454 has been updated by Yusuke Endoh. Status changed from Assigned to Rejected すみません、メールがあちこちに言って議論が混乱しそうですね。 一度 close して立て直します。 Sorry for scattering the mails and confusing the discussion. I close this once and I'll create a new ticket. -- Yusuke Endoh ---------------------------------------- Feature #5454: keyword arguments http://redmine.ruby-lang.org/issues/5454 Author: Yusuke Endoh Status: Rejected Priority: Normal Assignee: Koichi Sasada Category: Target version: 遠藤です。 キーワード引数を実装してみました。 $ 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 -- http://redmine.ruby-lang.org