From: SASADA Koichi Date: 2007-06-19T19:39:24+09:00 Subject: [ruby-dev:31023] Re: ("a".."f").step(2) {|x| p x}  ささだです。 NARUSE, Yui wrote: >>  rb_iterate が何をするのか、その定義はよくわからなかったので >> すが、リファレンスマニュアルをみると次のようになっています。 >> >>> まず call_proc(data1) を実行します。そしてその関数かその直下のメソッドで yield が発生すると以下が実行されます。 >>  (1)「その関数か」(2)「その直下のメソッド」という定義を、私は >> (2) だけ、というように実装したということになります。これは、 >> NODE_ITER の使い方、および enum.c での利用法を見てそのように判 >> 断しました(てっきり、(2) の使い方だけかと思っていた)。(1) に >> 依存したプログラムってどれくらいあるでしょうか。直すのは結構大 >> 変そうです。 >> >>  なので、現在の rb_iterate() の仕様による解決方法は >> str_step() で rb_funcall() で何らかのメソッドを呼べばよいとい >> うことになります。 > > これって、一度 Ruby の層まで上らない bl_proc が呼ばれないということです > よね。it_proc ほどではないにしても、bl_proc のように何度も呼ばれる部分が > 必ず Ruby 層経由というのは少し気になります。  「Ruby層」の定義がないのでわかりませんが、とりあえず VM のス タックフレームを積んでね、という感じです。 > rb_define_method(rb_cString, "upto_excl", rb_str_upto, 2); > とでも定義して、str_step から > return rb_funcall(args[0], rb_intern("upto_excl"), 2, args[1], > EXCL(args[2])); > と呼べばいいのですかね。 > なんか冗長な気はしますが。  解決策は、まぁそんな感じです。 -- // SASADA Koichi at atdot dot net