[#29469] エラーを捕まえたいのですが ... — Sakae Kobayashi <sakae@...>

困った時に出てくる、小林榮です。

12 messages 2001/05/01

[#29490] Re: [ruby-talk:14555] Ruby as a Mac OS/X scripting language — maili31s@... (SugHimsi == SUGIHARA Hiroshi)

すぎむし速報。↓だそうです。

12 messages 2001/05/02

[#29524] tr range? — kiri@...

桐山です。

17 messages 2001/05/06
[#29526] Re: tr range? — Koji Arai <JCA02266@...> 2001/05/06

新井です。

[#29644] rwiki.rb でエラー — norio goto <goto@...>

お世話になります、後藤@横河工事です。

18 messages 2001/05/14
[#29645] Re: rwiki.rb でエラー — m_seki@... 2001/05/14

[#29646] Re: rwiki.rb でエラー — norio goto <goto@...> 2001/05/14

後藤@横河工事です。

[#29675] with(obj){ } が欲しい。 — Take_tk <ggb03124@...>

例によって、ワタシ好みののりクエストですみません。

24 messages 2001/05/15
[#29694] Re: with(obj){ } が欲しい。 — "K.Kosako" <kosako@...> 2001/05/17

Take_tkさんの<20010515205133.DFBA.GGB03124@nifty.ne.jp>から

[#29707] OBJECT DAY2001 — "K.Kosako" <kosako@...>

OBJECT DAY2001から帰ってきました。

71 messages 2001/05/18
[#29712] Re: OBJECT DAY2001 — matz@... (Yukihiro Matsumoto) 2001/05/18

まつもと ゆきひろです

[#29719] Re: OBJECT DAY2001 — WATANABE Tetsuya <tetsu@...> 2001/05/21

渡辺哲也です。

[#29731] YARPC 19101 (Re: OBJECT DAY2001) — TAKAHASHI Masayoshi <maki@...> 2001/05/21

YARPC関連で動いてお騒がせしている(_o_)高橋征義です。

[#29792] Re: YARPC 19101 — akira yamada / やまだあきら <akira@...> 2001/05/27

[#29794] Re: YARPC 19101 — Minero Aoki <aamine@...> 2001/05/27

あおきです。

[#29803] Re: YARPC 19101 — Hiroshi IGARASHI <iga@...> 2001/05/27

いがらしです。

[#29721] Cygwin で Ruby をコンパイルするとエラーがでます。 — "Inoue" <inoue@...>

はじめまして、最近Rubyをはじめました井上と申します。

10 messages 2001/05/21

[#29788] marshaled time format differ — IWATSUKI Hiroyuki <don@...>

岩月と申します。

19 messages 2001/05/25
[#29789] Re: marshaled time format differ — matz@... (Yukihiro Matsumoto) 2001/05/25

まつもと ゆきひろです

[#29790] Re: marshaled time format differ — IWATSUKI Hiroyuki <don@...> 2001/05/26

岩月と申します。

[#29823] Re: marshaled time format differ — IWATSUKI Hiroyuki <don@...> 2001/05/27

岩月と申します。

[#29853] "" で行われる展開を eval 無しで… — ABE Shigeru <shiger-a@...>

 みなさま、はじめまして。阿部といいます。

17 messages 2001/05/28
[#29854] Re: "" で行われる展開を eval 無しで… — rubikitch <rubikitch@...> 2001/05/28

From: ABE Shigeru <shiger-a@nifty.com>

[#29941] Ruby ライセンスについて — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

38 messages 2001/05/31
[#29942] Re: Ruby ライセンスについて — Takahiro Kambe <taca@...> 2001/05/31

In message <991297854.779223.23013.nullmailer@ev.netlab.zetabits.com>

[#29944] Re: Ruby ライセンスについて — "Akinori MUSHA" <knu@...> 2001/05/31

At Thu, 31 May 2001 18:00:18 +0900,

[ruby-list:29604] Importing eachdelegator.rb

From: "Akinori MUSHA" <knu@...>
Date: 2001-05-08 23:43:30 UTC
List: ruby-list #29604
 少し前に登場した、岡田さん作の EachDelegator:

	http://www.ruby-lang.org/en/raa-list.rhtml?name=EachDelegator

ですが、これをどうやって標準仕様に取り入れようかという話です。


 前の議論を反映して巧妙に実現されており、ぜひとも洗練した形で
標準機能として取り込みたいところです。

(添付ドキュメントより)
============================================================

- EachDelegatorとは?

EachDelegatorとは、ブロックを引数に取る既存のメソッドにEnumerable能力を
あとから追加するためのライブラリです。

rubyには、ひとつのクラスにeach_*と名前のついたメソッドがいくつかあるケー
スが見られます。Stringに対するeach_lineとeach_byteなどがその例です。

こうした複数のeach_*メソッドを持つクラスについて、eachに対してしか 
Enumerableなメソッドを適用できないのはいかにも不便です。こうしたジレンマ
を解消するためにこのライブラリが生まれました。

- 簡単な使い方

eachdelegator.rbをrequireすると、each_*、または*_eachと名前のついたあら
ゆるメソッドが、自動的にEnumerableなメソッドを呼び出せるようになります。

eachdelegator.rbは本来ブロックと共に呼び出さなければいけないこれらのメソッ
ドを、ブロック無しで呼び出した場合にEachDelegatorオブジェクトを返すよう
に再定義します。

EachDelegatorは、eachメソッドを元のオブジェクトの元のメソッドに転送する
Enumerableなクラスです。このクラスのオブジェクトに対して collect、grepな
どのEnumerableモジュールの各種の操作を実行すると、それらを元のメソッドに
対して適用したのと同じ結果が得られます。

例えばString#each_byteをindex付きで呼び出し、その結果をcollect するとい
うような処理を、次のようなシンプルな形で記述できます。

  p "hoge".each_byte.each_with_index.collect{|a, i| [ i, a ]}
   => [[0, 104], [1, 111], [2, 103], [3, 101]]

- 高度な使い方

自動的に再定義されるのは、each_*または*_eachという名前で定義されているメ
ソッドのみです。それ以外のメソッドについては手動で
Module#each_delegatorを使って、メソッドの再定義をしてやる必要があります。

例えば、 Arrayに隣あった要素のペアをiterateするall_pairメソッドを追加し
て、それぞれの要素の差を配列に出力したいといった場合は、次のように書きま
す。
  
  require 'eachdelegator'

  class Array
    def all_pair
      for i in 0...(size - 1) 
        yield at(i), at(i + 1)
      end 
      self
    end


    each_delegator :all_pair
  end
  

  p [1, 3, 5, 7, 13].all_pair.collect{|a, b| b - a}
   => [ 2, 2, 2, 6]

============================================================

と、 Enumerable が本来備えていてもいいような素晴らしい仕様拡張
なのですが、全モジュールを検索して each_*/*_each を自動的に登録
するところと、 method_added を乗っ取って each_*/*_each が追加
されたときに自動的に登録するところが標準に入れるにはちょっと
トリッキー過ぎるきらいがあります。


 そこで考えた案です。

1. 原則的に each_*/*_each のようなメソッドはモジュール(の作者)が
自分で登録することとする。ただし、未対応のモジュールを対応させる
救済用モジュールという位置付けで、自動登録機能のみを独立させた
lib/eachdelegator.rb を提供する。(名称は別途検討)

2. 一方、 each_delegator メソッドや EachDelegator クラスは標準
組み込みとし、標準添付のクラス・モジュールが持つ each_*/*_each
メソッド群はみな最初から each_delegator で登録しておくようにする。
(標準クラス・モジュールを使うだけなら require 'eachdelegator' は
不要)

 さて、これで「ふつー each_*.collect 可能」となるわけですが、
標準組み込みの際に考えた方がいいと思うことを二つ。

3. each_delegator メソッドは、 class Module ではなく module
Enumerable に持たせた方がよいのではないか?階層的にその方が断然
しっくりきて標準採用しやすいと思う。困るのは each_delegator に
登録したいメソッドがあるが each がなく include Enumerable して
いない、という特異なケースだが、 その場合は each と alias して
include Enumerable するのが自然だろう。

4. 名称については、 delegate/delegator というのはちょっとものもの
しい感じがするので、より簡単に:

	EachDelegator -> Enumerable::Enumerator
	each_delegate -> enumerator_method

とするのはどうか?クラス名の方は、ただ each のみを提供する
Enumerable なクラスだから、 Enumerator 以上でも以下でもないという
感じ。外で使うものではないので、 Enumerable の内部クラスとするのが
適当と思われる。登録メソッド名の方は、はっきりと enumerate する
メソッドだと宣言しているように見えるのでこの方がよさそう。


 どんなもんでしょうか? (早く現実に実装してみたい。:)

-- 
                     /
                    /__  __            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"

In This Thread

Prev Next