ごとけんです

In message "[ruby-list:28219] Cast"
    on 01/02/24, Shin-ichiro HARA <sinara / blade.nagaokaut.ac.jp> writes:
>で、キャストの形式ですが、Array2**obj のようにしようかと思います。本当
>は [] を使いたいところですが、既に使われいるので。しかも、** は結合力
>が強く、かつ、右結合なのもいいところです。これを使うと上はこんな風に書
>けます。
>
>while line = gets
>   puts( (Array2**line.split.collect{|x| Integer(x)}).sum )
>end
>
>さて、これを行う仕組みですがいたってシンプルです。キャストをしたいクラ
>スには、メソッド casting を用意します。casting は基本的には配列を返し、
>クラス Foo のインスタンス foo に対して
>
>   Foo.new(* foo.casting)
>
>が foo.dup と同じ効果をもつように定義します。そして Class では、キャスト
>を casting を使って行うわけです。次が Ruby で書いた例です。

**というのも面白いのですが、提案の骨子は、casting を使ったコ
ンストラクタの一様化のようですね。ぼくも以前 Parametric とい
うモジュールを書いたときにそのことを考えました。この手の処理
が必要なのは数学モノを書くときに多いのかも知れません。
prec/induced_from は基本的にこの考え方と同じだと思います。

ところで casting たびにオブジェクトが生成されるのがイヤな場
合もあります。それで「看倣し」という観点から、

  class Object
    alias as! extend
    def as(mod) dup.as!(mod) end
  end

  a = Array[1..10].as Set
  anArray.as! Set

のようなことを一時期やってみたことがあります。つまり色々なク
ラスを作るのではなく、必要に応じて要素にいちいち界面を付加し
てやる方法です。それだけでも読みやすい気がしました。

-- Gotoken