Сравнение элементов на основе их индекса в массиве в Ruby - PullRequest
0 голосов
/ 05 марта 2010

У меня есть класс 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 ]

5 голосов
/ 05 марта 2010

Вы могли бы быть счастливее, если бы вы определили оператор космического корабля вместо больше чем. (<=>)

Сортировка, например, зависит от ее определения.

http://ruby -doc.org / рубин-1,9 / классы / Enumerable.html

2 голосов
/ 05 марта 2010

Я бы согласился с Дарринтом.

Все, что вам нужно сделать, это включить Comparable и определить <=>, и тогда вы сможете делать все другие сравнения бесплатно! Предоставление вам гораздо большей гибкости, чем простое определение «>».

По словам книги кирки: "Comparable mixin может использоваться для добавления операторов сравнения (<, <=, ==,> = и>), а также метода между?, К классу. Чтобы это работало, Comparable предполагает, что любой класс который использует его, определяет оператор <=>. Таким образом, как писатель классов, вы определяете один метод, <=>, включаете Comparable и получаете шесть функций сравнения бесплатно. "

Полный пример доступен в (бесплатной онлайн) книге кирки: http://ruby -doc.org / документы / ProgrammingRuby / html / tut_modules.html # S2 (прокрутите вниз пара абзацев до «Миксины дают вам чудесно управляемый способ ..»)

1 голос
/ 05 марта 2010

Вы можете использовать метод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...