[#38392] Enumerable#gather_each — Tanaka Akira <akr@...>

ときに、複数行をまとめて扱いたいことがあります。

47 messages 2009/05/09
[#38394] Re: Enumerable#gather_each — ujihisa <ujihisa@...> 2009/05/09

ujihisaと申します。

[#38400] Re: Enumerable#gather_each — Yukihiro Matsumoto <matz@...> 2009/05/09

まつもと ゆきひろです

[#38399] Re: Enumerable#gather_each — "Akinori MUSHA" <knu@...> 2009/05/09

At Sat, 9 May 2009 15:30:20 +0900,

[#38405] Re: Enumerable#gather_each — Tanaka Akira <akr@...> 2009/05/10

In article <86r5yy2nrg.knu@iDaemons.org>,

[#38417] Re: Enumerable#gather_each — "Akinori MUSHA" <knu@...> 2009/05/10

At Sun, 10 May 2009 10:08:47 +0900,

[#38524] [Bug #1503] -Kuをつけた時、/[#{s}]/n と Regexp.new("[#{s}]",nil,"n") で実行結果が異なる — sinnichi eguchi <redmine@...>

Bug #1503: -Kuをつけた時、/[#{s}]/n と Regexp.new("[#{s}]",nil,"n") で実行結果が異なる

8 messages 2009/05/22

[ruby-dev:38523] Re: [Bug:1.9] Enumerator.new { }.take(1).inject(&:+) causes stack overflow

From: Yusuke ENDOH <mame@...>
Date: 2009-05-22 00:59:48 UTC
List: ruby-dev #38523
遠藤です。

2009/05/22 5:39 SASADA Koichi <ko1@atdot.net>:
> Yusuke ENDOH wrote::
>> そこで、以下のように、yielder_new_i で proc メソッドを呼ぶことで
>> バグは直りました。
>
>  似たような話なんですが,そもそも rb_iterate を使う場面じゃなさそうな.


確かに。ささださんのパッチでも直ることを確認しました。


> 例えば,rb_iterate は obsolete にしてしまって(制限付きで存在),
> rb_block_call を使うようにして下さい,とドキュメントするのはどんなもんで
> しょうか.

なるほど、rb_block_call は必ずメソッドを呼び出すから大丈夫
なんですね。

ドキュメント修正案のパッチです。


Index: README.EXT
===================================================================
--- README.EXT	(revision 23508)
+++ README.EXT	(working copy)
@@ -1159,11 +1159,22 @@

 ** Control Structure

- VALUE rb_iterate(VALUE (*func1)(), void *arg1, VALUE (*func2)(), void *arg2)
+ VALUE rb_block_call(VALUE recv, ID mid, int argc, VALUE * argv,
+		     VALUE (*func) (ANYARGS), VALUE data2)

+Calls a method on the recv, with the method name specified by the
+symbol mid, supplying func as the block.  func will receive the
+value from yield as the first argument, data2 as the second, and
+argc/argv as the third/fourth arguments.
+
+ [OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), void *arg1, VALUE
(*func2)(), void *arg2)
+
 Calls the function func1, supplying func2 as the block.  func1 will be
 called with the argument arg1.  func2 receives the value from yield as
 the first argument, arg2 as the second argument.
+
+When rb_iterate is used in 1.9, func1 has to call some Ruby-level method.
+This function is obsolete since 1.9; use rb_block_call instead.

  VALUE rb_yield(VALUE val)

Index: README.EXT.ja
===================================================================
--- README.EXT.ja	(revision 23508)
+++ README.EXT.ja	(working copy)
@@ -1258,11 +1258,22 @@

 ** 制御構造

-VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE (*func2)(), VALUE arg2)
+VALUE rb_block_call(VALUE obj, ID mid, int argc, VALUE * argv,
+		    VALUE (*func) (ANYARGS), VALUE data2)

+  funcをブロックとして設定し, objをレシーバ, argcとargvを引
+  数としてmidメソッドを呼び出す. funcは第一引数にyieldされた
+  値, 第二引数にdata2, 第三, 第四引数にargcとargvを受け取る.
+
+[OBSOLETE] VALUE rb_iterate(VALUE (*func1)(), VALUE arg1, VALUE
(*func2)(), VALUE arg2)
+
   func2をブロックとして設定し, func1をイテレータとして呼ぶ.
   func1には arg1が引数として渡され, func2には第1引数にイテレー
   タから与えられた値, 第2引数にarg2が渡される.
+
+  1.9でrb_iterateを使う場合は, func1の中でRubyレベルのメソッド
+  を呼び出さなければならない.
+  1.9でobsoleteとなった. 代わりにrb_block_callが用意された.

 VALUE rb_yield(VALUE val)


-- 
Yusuke ENDOH <mame@tsg.ne.jp>

In This Thread