[#49193] [ANN] Ruby 2.0.0-p0 released — Yusuke Endoh <mame@...>

こんにちは。Ruby 2.0.0-p0 をリリースします。

14 messages 2013/02/24
[#49196] [ANN]Ruby-2.0.0-p0 mswin32版 MSI was Re: [ANN] Ruby 2.0.0-p0 released — arton <artonx@...> 2013/02/24

artonです。

[#49216] Windows用 インストーラ無しパッケージの需要について (Re: [ANN]Ruby-2.0.0-p0 mswin32版 MSI was Re: [ANN] Ruby 2.0.0-p0 released) — Takeshi Iogawa <alpha@246.ne.jp> 2013/02/27

いおがわと申します。 Ruby2.0の正式リリースおめでとうございます。

[ruby-list:49171] Re: Enumerator#+

From: Tomoyuki Chikanaga <nagachika00@...>
Date: 2013-02-01 02:17:00 UTC
List: ruby-list #49171
近永と申します。

横から揚げ足取りですみません、

> Enumerator を使う人は、Array を意識しているのではないかと思っています。
>
>  [0,1,2,3,4,5].each {|i| puts i}
>
> とするのを意識しながら
>
>  (0..5).each {|i| puts i}
>
> と書いているじゃないかと。(違いは遅延評価ですね)
というところですが、Range オブジェクト (0..5) は Enumerator ではありません。
Range クラスは Eunmerable を include していますので Enumerable の一種ではあります。
またこれをもって遅延評価とはあまり言わないのではないかと思います。
(ただ配列リテラルでは事前に要素が評価されているのに対して Range オブジェクトは
 each メソッド内で yield される値は procedural に作られているから...、
 というニュアンスは感じとれましたが)

>   ((0..2).each+(4..5).each).each {|i| puts i}
Enumerator を得るのは to_enum か enum_for メソッドを用いるほうが意図が明確で良いかと思います。

Enumerator#+ についてですが Enumerator を連結するメソッドはあってもいいのかなという気はします。
しかし演算子メソッドとして定義するかどうかは慎重になるべきだと思います。

メソッド追加の要望は Redmine に Feature Request としてチケットを作って頂くのがよいと思います。
http://bugs.ruby-lang.org/projects/ruby-trunk/issues/new

以上、失礼しました。

2013年2月1日 2:25 小田 利通 <oda@alato.ne.jp>:
>
>
> あらきさん、メールありがとうございます。
>
> 》Enumeratorは列挙自体を表すクラス(だと思う)なので、「列挙を合成する」よりは
> 》「列挙するものを予め合成してから列挙」の方が自然なのではないかと思います。
>
> Enumerator は、ヘルプにあるように
>      Enumerable の機能を提供するためのラッパークラス
>   と 外部イテレータ
> の2つの役割をするクラスです。
>
> Enumerator を使う人は、Array を意識しているのではないかと思っています。
> つまり、
>
>  [0,1,2,3,4,5].each {|i| puts i}
>
> とするのを意識しながら
>
>  (0..5).each {|i| puts i}
>
> と書いているじゃないかと。(違いは遅延評価ですね)
>
> であれば、
>
>   ([0,1,2]+[4,5]).each {|i| puts i}
>
> に対応する
>
>   ((0..2).each+(4..5).each).each {|i| puts i}
>
> という表記があってもよいのではないかと思います。
>
>  Rangeオブジェクトの + もあっても良いとも思うのですが、
>
>   class Range
>     def +(other)
>       other=other.each unless other.kind_of?(Enumerator)
>       self.each + other
>     end
>   end
>
> Rangeオブジェクト同士の加算の結果が Rangeオブジェクトでないというのは、
> 違和感があるので議論の余地があると思います。
>
> 》またEnumeratorに合成の機能を付けてしまうと、型を無視した合成が可能になってしまうのであまりよくないのではないでしょうか?
>
> each メソッドがブロックに渡すのは、同じクラスのオブジェクトとは限りません。
> つまり
>
>   [0, 1, "A", :foo].each {|i| puts i}
>
> であっても問題ありません。
> これは Array だけでなく Enumerator についても同様です。
>
> 小田 http://www.alato.ne.jp/oda
>

In This Thread