新井です。

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)