[#21225] Re: [ruby-cvs] ruby: * enum.c (inject_i): use rb_yield_values. — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

14 messages 2003/08/22
[#21227] Re: [ruby-cvs] ruby: * enum.c (inject_i): use rb_yield_values. — nobu.nakada@... 2003/08/22

なかだです。

[#21228] Re: [ruby-cvs] ruby: * enum.c (inject_i): use rb_yield_values. — matz@... (Yukihiro Matsumoto) 2003/08/22

まつもと ゆきひろです

[#21281] 大量メモリ消費攻撃に対する対応 — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

16 messages 2003/08/29
[#21285] Re: 大量メモリ消費攻撃に対する対応 — matz@... (Yukihiro Matsumoto) 2003/08/29

まつもと ゆきひろです

[#21288] Re: 大量メモリ消費攻撃に対する対応 — Hidetoshi NAGAI <nagai@...> 2003/08/29

永井@知能.九工大です.

[#21306] Re: 大量メモリ消費攻撃に対する対応 — matz@... (Yukihiro Matsumoto) 2003/09/03

まつもと ゆきひろです

[ruby-dev:21207] scanf and block parameter

From: Koji Arai <JCA02266@...>
Date: 2003-08-17 08:27:36 UTC
List: ruby-dev #21207
新井です。

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)

In This Thread

Prev Next