From: matz@... (Yukihiro Matsumoto) Date: 2003-08-21T02:35:06+09:00 Subject: [ruby-dev:21214] Re: scanf and block parameter まつもと ゆきひろです In message "[ruby-dev:21207] scanf and block parameter" on 03/08/17, Koji Arai writes: |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) 利用者は一引数の配列で受けるべき |(2) scanf が配列展開してパラメータを渡すべき "%s %s"を指定したということは複数の値を期待していると思うん です。それに対して一引数で受けると言うのも変な話ではないかと。 というわけで、この場合 |a,b| か |*v| で受け取るべきなんじゃ ないかなあと思います。 でも、後者の対応だと |v| のケースで [["a", "b"], "c"]になっ ちゃいますね。私の観点からは自然だけど、互換性が問題になるか なあ。 | 都合の良いことに配列展開の場合は一引数でも警告が出ないですね。 なんででしょう? 確かに都合が良いんですが。 |おまけ、scanf は警告がうるさいようです。 これも含めてdblackに連絡しておきます。