我有一个Card
类,我想重载>
运算符以与另一张卡进行比较(Ace高于王,王高于王后等)。我已经忘记了我对Ruby的了解甚少,并且不知道从哪里开始。
class Card
@@RANKS = ['A', 'K', 'Q', 'J', 'T', '9', '8','7','6','5','4','3','2']
attr_reader :rank
def initialize(str)
@rank = str[0,1]
end
def > (other)
#?????
end
end
答案 0 :(得分:5)
如果您定义太空飞船运营商而不是大于运营商,您可能会更高兴。 (小于=&GT)
例如,排序取决于它的定义。
答案 1 :(得分:2)
我同意darrint。
您需要做的就是包括Comparable和define< =>然后你就可以免费进行所有其他比较了!为您提供比定义'>'更多的灵活性在它自己。
用镐书的话来说: “Comparable mixin可用于将比较运算符(<,< =,==,> =和>)以及?之间的方法添加到类中。为此,可比较假设任何使用它的类都定义了运算符< =>。因此,作为类编写者,您可以定义一个方法,< =&gt ;,包含Comparable,并免费获得六个比较函数。“
(免费在线)镐书中提供了完整示例: http://ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html#S2 (向下滚动几段到'Mixins给你一个奇妙的控制方式......')
答案 2 :(得分:1)
您可以使用array.index
方法。以下代码检查两张卡的索引,如果true
卡出现在当前卡之后,则返回other
。
class Card
@@RANKS = ['A', 'K', 'Q', 'J', 'T', '9', '8','7','6','5','4','3','2']
attr_reader :rank
def initialize(str)
@rank = str[0,1]
end
def > (other)
@@RANKS.index(other.rank) > @@RANKS.index(@rank)
end
end
ace = Card.new 'A'
king = Card.new 'K'
nine = Card.new '9'
puts ace > king
puts ace > nine
puts nine > king