[#3747] constants (or class vriable?) — Wakou Aoyama <wakou@...>

青山です。

20 messages 1998/12/06
[#3751] Re: constants (or class vriable?) — Shin-ichro Hara <sinara@...> 1998/12/07

原です。

[#3763] Re: constants (or class vriable?) — Wakou Aoyama <wakou@...> 1998/12/07

青山です。

[#3764] Re: constants (or class vriable?) — matz@... (Yukihiro Matsumoto) 1998/12/08

まつもと ゆきひろです

[#3767] Re: constants (or class vriable?) — kjana@... (YANAGAWA Kazuhisa) 1998/12/08

In message <199812080034.JAA05946@picachu.netlab.co.jp>

[#3826] ruby 1.1d0 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

35 messages 1998/12/16

[#3873] (?: ) does not work? — shugo@... (MAEDA Shugo)

前田です。

15 messages 1998/12/19

[#3881] I want to catch all jump — shugo@... (Shugo Maeda)

前田です。

17 messages 1998/12/21
[#3895] Re: I want to catch all jump — matz@... (Yukihiro Matsumoto) 1998/12/22

まつもと ゆきひろです

[#3894] ruby 1.1d1 released — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

25 messages 1998/12/22

[#3899] interpreter reinitialization — shugo@... (Shugo Maeda)

前田です。

22 messages 1998/12/22
[#3923] Re: interpreter reinitialization — matz@... (Yukihiro Matsumoto) 1998/12/23

まつもと ゆきひろです

[#3926] Re: interpreter reinitialization — shugo@... (Shugo Maeda) 1998/12/23

前田です。

[#3931] Re: interpreter reinitialization — matz@... (Yukihiro Matsumoto) 1998/12/24

まつもと ゆきひろです

[#3956] Re: interpreter reinitialization — shugo@... (Shugo Maeda) 1998/12/24

前田です。

[#3960] Re: interpreter reinitialization — matz@... (Yukihiro Matsumoto) 1998/12/24

まつもと ゆきひろです

[#4002] config.guess — Koji Arai <JCA02266@...>

新井です。

24 messages 1998/12/26
[#4039] Re: config.guess — matz@... (Yukihiro Matsumoto) 1998/12/29

まつもと ゆきひろです

[#4045] Re: config.guess — Koji Arai <JCA02266@...> 1998/12/31

新井です。

[#4047] Re: config.guess — matz@... (Yukihiro Matsumoto) 1999/01/01

まつもと ゆきひろです

[#4048] Re: config.guess — Koji Arai <JCA02266@...> 1999/01/01

新井です。

[#4049] Re: config.guess — matz@... (Yukihiro Matsumoto) 1999/01/02

まつもと ゆきひろです

[#4050] Re: config.guess — Motoyuki Kasahara <m-kasahr@...> 1999/01/04

笠原です。

[#4030] module Precision — gotoken@... (GOTO Kentaro)

ごとけんです

78 messages 1998/12/28
[#4310] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/01/21

ごとけんです

[#4311] Re: module Precision — matz@... (Yukihiro Matsumoto) 1999/01/21

まつもと ゆきひろです

[#4312] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/01/21

ごとけんです

[#4317] Re: module Precision — keiju@... (石塚圭樹 ) 1999/01/21

けいじゅ@日本ラショナルソフトウェアです.

[#4364] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/01/25

ごとけんです

[#4478] Re: module Precision — matz@... (Yukihiro Matsumoto) 1999/01/28

まつもと ゆきひろです

[#4506] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/01/30

ごとけんです

[#4552] Re: module Precision — matz@... (Yukihiro Matsumoto) 1999/02/01

まつもと ゆきひろです

[#4557] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/02/01

ごとけんです

[#4632] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/02/03

ごとけんです

[#4647] Re: module Precision — keiju@... (石塚圭樹 ) 1999/02/03

けいじゅ@日本ラショナルソフトウェアです.

[#4648] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/02/03

ごとけんです

[#4633] Re: module Precision — matz@... (Yukihiro Matsumoto) 1999/02/03

まつもと ゆきひろです

[#4636] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/02/03

ごとけんです

[#4836] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/02/08

ごとけんです

[#4843] Re: module Precision — keiju@... (石塚圭樹 ) 1999/02/08

けいじゅ@日本ラショナルソフトウェアです.

[#4849] Re: module Precision — gotoken@... (GOTO Kentaro) 1999/02/08

ごとけんです

[#4924] Re: module Precision — keiju@... (石塚圭樹 ) 1999/02/09

けいじゅ@日本ラショナルソフトウェアです.

[#4976] a genericity — gotoken@... (GOTO Kentaro) 1999/02/10

ごとけんです

[#5008] Re: a genericity — keiju@... (石塚圭樹 ) 1999/02/11

けいじゅ@日本ラショナルソフトウェアです.

[#5018] Re: a genericity — gotoken@... (GOTO Kentaro) 1999/02/11

ごとけんです

[#5171] Re: a genericity — keiju@... (石塚圭樹 ) 1999/02/16

けいじゅ@日本ラショナルソフトウェアです.

[ruby-dev:3742] List()

From: Shin-ichro Hara <sinara@...>
Date: 1998-12-04 13:01:57 UTC
List: ruby-dev #3742
原です。

[ruby-dev:3724] の List クラスを実用的なもの(本当?)にしてみ
ました。

List クラスはオブジェクトのリストを表現していて、仕様は次の通り。

(1)List(a, b, c,...) は List クラスのインスタンスを生成する
     ここで a, b, c,.. は単なるオブジェクトでも List のインスタ
     ンスでもよい

(2)多重代入 X = Y は X = List(Y) と書いても全く同じである

    例: x, y = List(1, 2)       # x = 1, y = 1
         x, y = List([1, 2])     # x = 1, y = 1
         *y   = List(1, 2)       # y = [1, 2]
         *y   = List([1, 2])     # y = [1, 2]
         x,*y = List(0, [1, 2])  # x = 0; y = [[1, 2]]

(3)その他の list.rb の主なメソッド

    List#size        .. リストの長さ
    Object#single?   .. 単項であるか、長さ1のリストであるとき真
    Object#to_array  .. 単項あるいはリストを配列にして返す
    Object#to_object .. 単項あるいは単項リストは単項そのもの、
                        複項リストは配列を返す


-----^ list.rb
class List
  attr :list
  def initialize(*x); @list = x; end
  def [](x); @list[x]; end
  def size; @list.size; end
  def single?; size == 1; end
  def to_a
    if single?
      @list[0].to_a
    else
      @list
    end
  end
  def +(other); List.new(*(@list+other.list)); end
  def inspect; @list.collect{|x| x.inspect}.join(", "); end
end

class Object
  def to_l; List.new(*self); end

  def single?
    if is_a?(List)
      single?
    else
      true
    end
  end

  def to_array
    if is_a?(List)
      list
    else
      Array(self)
    end
  end

  def to_object
    if is_a?(List)
      if single?
        self[0]
      else
        list
      end
    else
      self
    end
  end
end

def List(*x)
  if x.size == 0
    nil
  else
    list = List.new()
    x.each do |t|
      list += if t.is_a? List
                t
              else
                List.new(t)
               end
    end
    list
  end
end
-----$ list.rb


使用例としては、yield のパラメータとして明示的に複数個を返したい時
yield List(a, b, c,..) として使う。このときブロックパラメータの方
は、|x| で受ければ x.size? でパラメータの数が分かり、与えられた全て
は x.to_array で得られ、 x = x.to_object で yield(a, b, c,..) を |x|
で受けたのと同じになる。また、|x, y|, |*x| など多重代入的な受け方を
した場合は、yield(a, b, c,..) と変わりがない。

リストが与えられる可能性のあるブロックパラメータ |x| に対しては、
to_object などを使って、単項 a が与えられても単項リスト List(a)
が与えられても同じ動作をするようにプログラムを作った方が便利であ
る。(下の collect の様に)

具体的な使用例 ... Enumerable#each_with_index を次のように変更する。

  module Enumerable
    def each_with_index(&block)
      i = 0
      each { |x|
        block.call(List(x, i).to_object)
        i += 1
      }
    end

    def collect(&block)
      ary = []
      each { |x|
        ary.push block.call(x.to_object)
      }
      ary
    end
  end

この様にしても、現在の each_with_index の動作に全く変更は
ない。(collect も。)

  {1=>2, 3=>4}.each_with_index {|x| p x} #=> [[1, 2], 0]
                                         #=> [[3, 4], 1]

また、次の様に each を再定義しても動作は同じである。

  class Hash
    alias _each each
    def each; _each{|x,y| yield([x,y])}; end
  end

しかし、

  class Hash
    def each; _each{|x,y| yield List(x,y)}; end
  end
  {1=>2, 3=>4}.each_with_index {|x| p x} #=> [1, 2, 0]
                                         #=> [3, 4, 1]

の様に動作の事なる each_with_index を誘導する each の定義も
可能になっている。(ここでの collect はこの each の変更を吸
収するような再定義の例である。)


というわけですが、さて(*x = [1, 2] の話はまたちょっと別だけ
ども)、この List() が出来たからもう yield の変更は必要ない
か、こんな面倒なものを作るなら yield を変更した方がましか、、
どっちでしょう?:-)

In This Thread