From: Hiroyuki Iwatsuki Date: 2005-11-03T01:35:48+09:00 Subject: [ruby-list:41456] Re: オブジェクト同士の演算などを実装するには? 岩月と申します。 05/11/03 に Hideo Konami さんは書きました: > そのあと,たとえば次のような形でこれらのオブジェクト間の演算 > を定義することはできるでしょうか. > > babycat = mike + tama 演算子のメソッドを定義して、そのメソッド内で新たにインスタンスを作ります。 class Num attr_reader(:num) def initialize(num) @num = num end def +(other) # Num.newでも可 self.class.new(@num + other.num) end end a = Num.new(1) b = Num.new(2) a + b # => # > ここで Cat クラスに属する2個のオブジェクト同士の + の演算は, > mike と tama の性質から導かれるもので,たとえば上記のように > して両親の性質をまぜた子猫を作るものとします. 性質の混ぜ方さえわかれば実装可能だと思います。 以下はかなり適当ですが、実装例ということで(^^;)。 class Cat attr_reader(:name, :age, :sex) def initialize(name, age, sex) @name, @age, @sex = name, age, sex end def +(other) self.class.new(@name + other.name, 0.0, rand(2).zero? ? "M" : "F") end end mike = Cat.new("みけ",4.5,"F") tama = Cat.new("たま",3.8,"M") mike + tama # => # > puts Cat.fight(mike,tama) > > みたいな形で,mike, tama のもつ性質を利用して勝ち負けを決めて > "みけの勝ち!" といった出力を得るようにすることはできる > でしょうか. 判定する基準さえあれば実装可能だと思います。 提示された形でいくと、クラスメソッドを用意すればよいのでしょうか。 class Cat # 年長者の勝ち(適当すぎ) def self.fight(a, b) if a.age > b.age a elsif a.age < b.age b else nil # 引き分け end end end Cat.fight(mike, tama) # => # -- IWATSUKI Hiroyuki