From: Koji Arai Date: 2003-08-17T17:27:36+09:00 Subject: [ruby-dev:21207] scanf and block parameter 新井です。 scanf.rb を試していたのですが require 'scanf' p "a b c".scanf("%s %s") {|*v| v} ruby 1.8.0 (2003-08-10) [i586-linux] [["a", "b"], [["c"]]] のように最後の要素が配列の配列になってしまいます。これは def foo yield([:foo]) end foo {|*v| p v} ruby 1.8.0 (2003-08-10) [i586-linux] [[:foo]] となってしまうためです。どのようにするのが望ましいでしょう? (1) 利用者は一引数の配列で受けるべき require 'scanf' p "a b c".scanf("%s %s") {|v| v} => ruby 1.8.0 (2003-08-10) [i586-linux] [["a", "b"], ["c"]] (2) scanf が配列展開してパラメータを渡すべき def foo yield(*[:foo]) end foo {|*v| p v} foo {|v| p v} => ruby 1.8.0 (2003-08-10) [i586-linux] [:foo] # 結果望ましい動作 :foo # これも期待通り 都合の良いことに配列展開の場合は一引数でも警告が出ないですね。 def foo yield(*[:foo,:bar]) # <- これと yield(:foo, :bar) # <- これは違う end foo {|v| p v} ruby 1.8.0 (2003-08-10) [i586-linux] [:foo, :bar] -:5: warning: multiple values for a block parameter (2 for 1) from -:3 [:foo, :bar] なんらかのまとめをしておかないと何度も議論してしまいますね。 # 私の理解が遅いだけかも ^^; 結果は FAQ にでも書こうと思いますので、御指導よろしくお願い します。 おまけ、scanf は警告がうるさいようです。 require 'scanf' p "a b c".scanf("%s %s") {|*v| v} /usr/local/lib/ruby/1.8/scanf.rb:464: warning: instance variable @matched_item not initialized /usr/local/lib/ruby/1.8/scanf.rb:464: warning: instance variable @matched_item not initialized /usr/local/lib/ruby/1.8/scanf.rb:464: warning: instance variable @matched_item not initialized ruby 1.8.0 (2003-08-10) [i586-linux] [["a", "b"], [["c"]]] -- 新井康司 (Koji Arai)