代码之家  ›  专栏  ›  技术社区  ›  Kirschstein

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

  •  0
  • Kirschstein  · 技术社区  · 15 年前

    我有一个 Card 而我想超载 > 操作员将另一张牌与之比较(王牌比王牌高,王牌比王牌高,等等)。我忘记了我对鲁比所知甚少,也不知道该从哪里开始。

    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 回复  |  直到 15 年前
        1
  •  1
  •   Brian McKenna    15 年前

    您可以使用 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
    
        2
  •  5
  •   darrint    15 年前

    如果你定义宇宙飞船操作员而不是大于,你可能会更高兴。(<=>)

    例如,排序取决于它的定义。

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

        3
  •  2
  •   glenn jackman    15 年前

    我同意达林的观点。

    您所需要做的就是包括比较和定义<=>,然后您将能够免费进行所有其他比较!为您提供了比单独定义“>”更大的灵活性。

    用鹤嘴锄书上的话来说: “Comparable Mixin可用于添加比较运算符(<、<=、==、>=和>),以及两者之间的方法?去上课。为了实现这一点,Comparable假定使用它的任何类都定义了运算符<=>。因此,作为一个类编写器,您可以定义一个方法,<=>,包括Comparable,并免费获得六个比较函数。”

    完整的例子可以在(免费在线)镐书中找到: http://ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html#S2 (向下滚动几段至“Mixins Give you a wonderfully controlled way.”)

    推荐文章