From: Hideo Konami <konami / kyoto-wu.ac.jp> Subject: [ruby-list:41455] オブジェクト同士の演算などを実装するには? Date: Thu, 3 Nov 2005 01:09:34 +0900 るびきちです。 > mike = Cat.new("みけ",4.5,"F") > tama = Cat.new("たま",3.8,"M") > > babycat = mike + tama class Cat def +(other) # 子作り end end こういう感じで定義できないことはないです。 しかし、この場合に「+」という演算子メソッドを使うのはどうかと思います。 あとでコードを読んだとき猫と猫を「足す」という行為が、直感的にわかりません。 猫に代数的構造があるとは考えないでしょう。 普通に babycat = mike.make_baby(tama) だといけないですか? > puts Cat.fight(mike,tama) > > みたいな形で,mike, tama のもつ性質を利用して勝ち負けを決めて > "みけの勝ち!" といった出力を得るようにすることはできる > でしょうか. > > mike.fight(tama) という形のメソッドなら簡単なのですが... 具体的なテストケースがないのでどういうのがお望みかわかりませんが、 こんな感じでしょうか? 勝手に攻撃力をセットして高い方を勝ちとしています。 引き分けの判定はなしです。(手抜き) また、型チェックもしていません。 class Cat def initialize(name,age,sex) @name = name; @age = age; @sex = sex end attr_reader :name, :age, :sex attr_accessor :strength def hoge end def self.fight(a, b) a.fight b end def fight(other) winner = if self.strength > other.strength self else other end "#{winner.name}の勝ち!" end end mike = Cat.new("みけ",4.5,"F") tama = Cat.new("たま",3.8,"M") mike.strength = 100 tama.strength = 90 puts Cat.fight(mike,tama) puts mike.fight(tama) -- また、コンストラクタはHash引数による疑似キーワード引数の方がいいかもしれません。 {}は省略できて、見易いです。 mike = Cat.new(:name=>"みけ", :age=>4.5, :sex=>"F") 後で体重などが必要になったときにもすぐ対応できます。 mike = Cat.new(:name=>"みけ", :age=>4.5, :sex=>"F", :weight=>3.5) class Cat def initialize(x) @name = x[:name]; @age = x[:age]; @sex = x[:sex] end end るびきち☆ http://www.rubyist.net/~rubikitch/