[#29469] エラーを捕まえたいのですが ... — Sakae Kobayashi <sakae@...>
困った時に出てくる、小林榮です。
まつもと ゆきひろです
In message <988708753.422219.10637.nullmailer@ev.netlab.zetabits.com>
[#29471] rd2man について — "NAITOH Jun" <naitoh@...>
こんにちは、内藤と申します。
[#29480] xpstore — akira yamada / やまだあきら <akira@...>
[#29490] Re: [ruby-talk:14555] Ruby as a Mac OS/X scripting language — maili31s@... (SugHimsi == SUGIHARA Hiroshi)
すぎむし速報。↓だそうです。
古暮でございます。MacOS X をいじり始めて一週間程度なのですが,
始めて投稿します。福田と申します。メインにはMacを使っていますので、Rubyを直
古暮でございます。
こんにちは、近藤と申します。
古暮でございます。
[#29504] クラスブラウザ with ReFe — kadu <kadu3@...16.alpha-net.ne.jp>
こんにちは。kadu です。
[#29513] drb-1.3.2 — Masatoshi SEKI <m_seki@...>
[#29521] A problem with the latest irb — "Akinori MUSHA" <knu@...>
IRB 最新版(0.7.3)ですが、どういうわけか、定義したメソッドを
[#29524] tr range? — kiri@...
桐山です。
新井です。
桐山です。
新井です。
[#29544] enriching standard extention libraries: syslog, zlib, etc. — "Akinori MUSHA" <knu@...>
Syslog モジュールを標準添付にするというのはどうでしょうか。
[#29547] strftime.c でのエラー — "Kazuaki Miyauchi" <miyauchk@...>
宮内といいます。
[#29550] UDP でバイナリデータを送りたいのですが? — "Kenji Takahashi" <kenji4553@...>
はじめまして。
[#29587] duplicate fragment identifiers in ruby-refm.html — Tanaka Akira <akr@...17n.org>
ふと気がついたのですが、
[#29597] media watch 2001.05.08 — Noritsugu Nakamura <nnakamur@...>
[#29603] Importing shell.rb — "Akinori MUSHA" <knu@...>
At Mon, 7 May 2001 14:50:32 +0900,
[#29604] Importing eachdelegator.rb — "Akinori MUSHA" <knu@...>
少し前に登場した、岡田さん作の EachDelegator:
まつもと ゆきひろです
At Wed, 9 May 2001 17:58:34 +0900,
原です。
[#29644] rwiki.rb でエラー — norio goto <goto@...>
お世話になります、後藤@横河工事です。
後藤@横河工事です。
後藤@横河工事です。
In <20010514192948A.goto@yokogawa-kouji.co.jp>
後藤@横河工事です。
後藤@横河工事です。
後藤@横河工事です。
[#29647] String#index — OHARA Shigeki <os@...>
大原です。
[#29665] frozen string in a |= b — kiri@...
桐山です。
[#29675] with(obj){ } が欲しい。 — Take_tk <ggb03124@...>
例によって、ワタシ好みののりクエストですみません。
さくです。
Take_tkさんの<20010515205133.DFBA.GGB03124@nifty.ne.jp>から
たけ(tk)です。
まつもと ゆきひろです
たけ(tk)です。
まつもと ゆきひろです
たけ(tk)です。
[#29707] OBJECT DAY2001 — "K.Kosako" <kosako@...>
OBJECT DAY2001から帰ってきました。
まつもと ゆきひろです
渡辺哲也です。
YARPC関連で動いてお騒がせしている(_o_)高橋征義です。
あおきです。
なひです。
なひです。
いがらしです。
なひです。
あおきです。
[#29720] rand(1<<32) — TAKEUCHI Hideki <take@...>
竹内です。
[#29721] Cygwin で Ruby をコンパイルするとエラーがでます。 — "Inoue" <inoue@...>
はじめまして、最近Rubyをはじめました井上と申します。
[#29759] WinNT Ruby CGI KILL? — "Inoue" <inoue@...>
井上です。
[#29766] インストールができません。 — Jun-ichi Murakoshi <murakosi@...>
長沢@新大OB です。
[#29788] marshaled time format differ — IWATSUKI Hiroyuki <don@...>
岩月と申します。
まつもと ゆきひろです
岩月と申します。
岩月と申します。
From: IWATSUKI Hiroyuki <don@na.rim.or.jp>
岩月と申します。
岩月と申します。
At Tue, 29 May 2001 00:23:31 +0900,
岩月と申します。
At Tue, 29 May 2001 09:10:26 +0900,
[#29812] A request to RAA (was Re: YARPC 19101) — Takahiro Kambe <taca@...>
In message <20010527174810.632346.eban@os.rim.or.jp>
[#29824] Windows 版 Ruby — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#29853] "" で行われる展開を eval 無しで… — ABE Shigeru <shiger-a@...>
みなさま、はじめまして。阿部といいます。
From: ABE Shigeru <shiger-a@nifty.com>
阿部です。
From: ABE Shigeru <shiger-a@nifty.com>
こんにちは、阿部です。
[#29864] ActiveScriptRuby について質問です — たくみ <taku3@...>
原 忠司と申します。
[#29880] autoconf.rb — nobu.nakada@...
なかだです。
[#29886] mod_ruby and eruby — norio goto <goto@...>
後藤@横河工事です。
始めまして,田代と申します.
前田です。
In message <87hey3pg1w.wl@studly.priv.netlab.zetabits.co.jp>
[#29911] w3m のコンパイルエラーが起きました — "Inoue" <inoue@...>
井上です。
[#29941] Ruby ライセンスについて — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
In message <991297854.779223.23013.nullmailer@ev.netlab.zetabits.com>
At Thu, 31 May 2001 18:00:18 +0900,
有馬@横浜、忙しいはず..です。
[ruby-list:29624] Enumerator
At Wed, 9 May 2001 17:58:34 +0900,
matz wrote:
> | 少し前に登場した、岡田さん作の EachDelegator:
> |
> | http://www.ruby-lang.org/en/raa-list.rhtml?name=EachDelegator
> |
> |ですが、これをどうやって標準仕様に取り入れようかという話です。
>
> 標準って組み込み? ちょっとトリッキーでは?
> 「だめ」とまでは言いませんが。
その後、ちょっと頭をひねり、メソッドの再定義はやはり邪悪な
感じが拭えないと思い直し、トリック抜きの新しいものを考えました。
既存のものや今後登場するクラス・モジュールに一切変更を強いず、
また each/each_*/*_each 等のメソッドの再定義も行わない方法です。
============================================================
Enumerable クラス
- インスタンス・メソッド
enum_with(method, *args)
each の代わりに method というメソッドを使ってイテレートする
ための Enumerator オブジェクトを返します。args を指定すると、
イテレータの呼び出し時の引数として渡されます。
使用例)
"foobar".enum_with(:each_byte).collect {|x| "%02x" % x}
#=> ["66", "6f", "6f", "62", "61", "72"]
============================================================
名称の enum_with は、「普通は each で enumerate するが、ここは
each_byte で」というニュアンスです。ほかにも、単に「with」という
案も出ており、ぶつからないようならこちらの方が短くていいかも。
============================================================
Enumerator クラス
Enumerator は、 Enumerable#enum_with の返り値としても得られる。
each メソッドを提供し、 Enumerable なオブジェクトとして利用
される。
- インクルードしているモジュール
Enumerable
- クラス・メソッド
Enumerator::new(obj, method, *arg)
オブジェクトの生成。obj オブジェクトの method メソッドに
args で列挙された引数を与えてイテレートする Enumerable な
オブジェクトを生成する。
使用例)
Enumerator.new(ObjectSpace, :each_object, Class).sort {
|a,b| a.name <=> b.name
}
#=> ["ArgumentError", "Array", "Bignum", ...,
"UnboundMethod", "ZeroDivisionError", "fatal"]
- インスタンス・メソッド
each
渡されたブロックを与えてイテレートする。
============================================================
実装は、 Ruby で書くと次のようなとてもシンプルなものです。
class Enumerator
include Enumerable
def initialize(enumobj, method, *args)
@enumobj = enumobj
@method = method
@args = args
end
def each(&block)
@enumobj.send(@method, *@args, &block)
end
end
module Enumerable
def enum_with(method, *args)
Enumerator.new(self, method, *args)
end
end
C による実装は末尾に添付します。
これがあると何がうれしいかというと、例えば従来:
ary = []
"hogehoge".each_byte {|b| ary << b}
と書かざるを得ないときなどは違和感を感じていましたが、これが:
ary = "hogehoge".enum_with(:each_byte).to_a
と素直に1ステップでできるようになります。(文字数は増えてますが)
もちろん、 to_a の代わりに collect, select, each_with_index
などの Enumerable モジュールのメソッドが自由に使えます。
Enumerator の方は、上の例にもある通り、 ObjectSpace::each_object
など、 Enumerable でないものを Enumerable として扱うことを可能に
してくれます。
Enumerator.new(ObjectSpace, :each_object, Class).sort {
|a, b| a.name <=> b.name
}
どうでしょうか?
P.S.
fatal はクラスなのに小文字で始まるんですね。
--
/
/__ __ Akinori.org / MUSHA.org
/ ) ) ) ) / FreeBSD.org / Ruby-lang.org
Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp
"Freeze this moment a little bit longer, make each impression
a little bit stronger.. Experience slips away -- Time stand still"
Index: enum.c
===================================================================
RCS file: /src/ruby/enum.c,v
retrieving revision 1.14
diff -u -r1.14 enum.c
--- enum.c 2001/03/13 05:45:08 1.14
+++ enum.c 2001/05/10 06:03:59
@@ -13,8 +13,8 @@
#include "ruby.h"
#include "node.h"
-VALUE rb_mEnumerable;
-static ID id_each, id_eqq, id_cmp;
+VALUE rb_mEnumerable, rb_cEnumerator;
+static ID id_each, id_eqq, id_cmp, id_enumobj, id_method, id_args, id_new;
VALUE
rb_each(obj)
@@ -388,6 +388,48 @@
return Qnil;
}
+static VALUE
+enum_enum_with(obj, args)
+ VALUE obj, args;
+{
+ rb_ary_unshift(args, obj);
+
+ return rb_apply(rb_cEnumerator, id_new, args);
+}
+
+static VALUE
+enumerator_initialize(argc, argv, obj)
+ int argc;
+ VALUE *argv;
+ VALUE obj;
+{
+ VALUE enumobj, method, args;
+
+ rb_scan_args(argc, argv, "2*", &enumobj, &method, &args);
+
+ rb_ivar_set(obj, id_enumobj, enumobj);
+ rb_ivar_set(obj, id_method, rb_String(method));
+ rb_ivar_set(obj, id_args, args);
+
+ return Qnil;
+}
+
+static VALUE
+enumerator_iter(obj)
+ VALUE obj;
+{
+ return rb_apply(rb_ivar_get(obj, id_enumobj),
+ rb_to_id(rb_ivar_get(obj, id_method)),
+ rb_ivar_get(obj, id_args));
+}
+
+static VALUE
+enumerator_each(obj)
+ VALUE obj;
+{
+ return rb_iterate(enumerator_iter, obj, rb_yield, 0);
+}
+
void
Init_Enumerable()
{
@@ -413,8 +455,20 @@
rb_define_method(rb_mEnumerable,"member?", enum_member, 1);
rb_define_method(rb_mEnumerable,"include?", enum_member, 1);
rb_define_method(rb_mEnumerable,"each_with_index", enum_each_with_index, 0);
+ rb_define_method(rb_mEnumerable,"enum_with", enum_enum_with, -2);
id_eqq = rb_intern("===");
id_each = rb_intern("each");
id_cmp = rb_intern("<=>");
+
+ rb_cEnumerator = rb_define_class("Enumerator", rb_cObject);
+ rb_include_module(rb_cEnumerator, rb_mEnumerable);
+
+ rb_define_method(rb_cEnumerator, "initialize", enumerator_initialize, -1);
+ rb_define_method(rb_cEnumerator, "each", enumerator_each, 0);
+
+ id_enumobj = rb_intern("enumobj");
+ id_method = rb_intern("method");
+ id_args = rb_intern("args");
+ id_new = rb_intern("new");
}
Index: ruby.h
===================================================================
RCS file: /src/ruby/ruby.h,v
retrieving revision 1.45
diff -u -r1.45 ruby.h
--- ruby.h 2001/05/02 04:22:11 1.45
+++ ruby.h 2001/05/10 06:03:59
@@ -519,6 +519,7 @@
EXTERN VALUE rb_cClass;
EXTERN VALUE rb_cDir;
EXTERN VALUE rb_cData;
+EXTERN VALUE rb_cEnumerator;
EXTERN VALUE rb_cFalseClass;
EXTERN VALUE rb_cFile;
EXTERN VALUE rb_cFixnum;