忍者ブログ

ぢみへんプログラミング日誌

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Enumerator がなんで必要なのかようやく分かった(2)

以前のエントリ「Enumerator がなんで必要なのかようやく分かった」でEnumratorクラスの存在意義について書いたが、少し補足をば。
以前の内容では本来enumerableモジュールをincludeしていないクラスでも、その代替となるメソッドを指定し、eachメソッドを持つかのように見せかけるラッパークラスとしてEnumerator の存在意義を紹介した。
irbを使って具体的に示すと以下のようになる。

irb(main):036:0> class Abc
irb(main):037:1> def initialize
irb(main):038:2> @arr = [1,2,3,4,5,6]
irb(main):039:2> end
irb(main):040:1>
irb(main):041:1* def my_each
irb(main):042:2> @arr.each{|n| yield n}
irb(main):043:2> end
irb(main):044:1> end
=> nil
irb(main):045:0>
irb(main):046:0* abc = Abc.new
=> #
irb(main):047:0> enum = Enumerator.new(abc, :my_each)
=> #:my_each>
irb(main):048:0> sum = enum.inject(0, :+)
=> 21


見ての通り、クラスAbcはenumerable をinclude してないが、my_eachメソッドを指定してEnumerator オブジェクトを生成すると、そのEnumeratorオブジェクトを通じてmapやinject等の、enumerableモジュールをinclude しなければ使えないメソッドが使えるようになる。
ここまでが以前のエントリ内容であった。

しかし現在、Object#to_enum, Object#enum_for というメソッドの存在により(enum_for はto_enum の別名メソッドで機能は同じ)、直接Enumeratorをnewメソッドで呼び出すことは滅多にない、と「プログラミング言語Ruby」(David Flanagan/まつもとゆきひろ著)には記されている。
「プログラミング言語Ruby」の「5.3.4 Enumerator」の章ではこれらのメソッドを引数無しで呼び出すと、呼び出し主体であるオブジェクトのeachメソッドを呼び出すだけのeachメソッドを持ったEnumeratorオブジェクトを返す。つまり a.to_enum と記述すると、Enumerator.new(a, :each) を実行するということだ。Object#to_enum に引数をつけると、Enumerator.new の第二引数の部分に任意のメソッド名を指定できる。その場合、to_enum よりも enum_for を使う方が名前として適しているかもしれないとも記されている。

実際にやってみるとこういうことだ。

irb(main):049:0> enum = "1234".enum_for(:each_char)
=> #<Enumerator: "1234":each_char>
irb(main):050:0> enum.map{|c| c.to_i * 2}
=> [2, 4, 6, 8]



さらにRuby 1.9からは、引数無で呼び出された場合にEnumeratorオブジェクトを返すイテレータメソッド(あるいはイテレータ的なメソッド)が増えた。特にEnumerableモジュールをミックスインした場合、each, map 等は引数無しだと全てEnumeratorオブジェクトを返す。そうした場合では、to_numもenum_for も記述不要となる場合も多くなった。

irb(main):051:0> "1234".each_char.select{|c| c.to_i.even?}
=> ["2", "4"]


これはまぁ、便利っちゃー便利な機能だと思う。
PR

COMMENT

NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
  

カレンダー

04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

フリーエリア

最新CM

バーコード

ブログ内検索

Copyright ©  -- ぢみへんプログラミング日誌 --  All Rights Reserved

Design by CriCri / Material by petit sozai emi / powered by NINJA TOOLS / 忍者ブログ / [PR]