在Ruby中基于数组中的索引比较项目

时间:2010-03-05 01:00:12

标签: ruby arrays compare

我有一个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

3 个答案:

答案 0 :(得分:5)

如果您定义太空飞船运营商而不是大于运营商,您可能会更高兴。 (小于=&GT)

例如,

排序取决于它的定义。

http://ruby-doc.org/ruby-1.9/classes/Enumerable.html

答案 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