岩月と申します。 05/11/03 に Hideo Konami<konami / kyoto-wu.ac.jp> さんは書きました: > そのあと,たとえば次のような形でこれらのオブジェクト間の演算 > を定義することはできるでしょうか. > > 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 # => #<Num:0x100f6390 @num=3> > ここで 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 # => #<Cat:0x100f56b8 @sex="M", @age=0.0, @name="みけたま"> > 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) # => #<Cat:0x100f5160 @sex="F", @age=4.5, @name="みけ"> -- IWATSUKI Hiroyuki <URL:mailto:don / na.rim.or.jp>