2

我已经实现了可比较和可枚举,以便我可以使用比较并包括:

给定下面的简单类:

class Card
  include Comparable
  include Enumerable
  attr_accessor :value

  def initialize(v)
    @value = v
  end

  def <=>(other)
    @value <=> other.value
  end

  def each
    yield @value
  end
end

然后:

c = Card.new(1) #so right now we have @value at 1

这些包括方法都不起作用:

[1,3,4,5].include?(c)
c.include?([1,3,4,5])

是否有可能使用 include 方法来做到这一点?我知道我可以用另一种方式来做,但我想“像红宝石一样”做!(假设这甚至是类似 ruby​​ 的方式......)我刚刚从 java 和 c++ 进入 ruby

提前致谢!

4

1 回答 1

1

如果你盯着你的代码足够长的时间,你会明白的。您实现了一个假设otherCard. 但是你在 Fixnums 上调用它!您需要在那里进行一些类型检查:

class Card
  include Comparable
  include Enumerable

  attr_accessor :value
  def initialize(v)
    @value = v
  end
  def <=>(other)
    if other.is_a?(Card)
      @value <=> other.value
    else
      @value <=> other
    end
  end

  def each
    yield @value
  end
end

c = Card.new(1)

[1,3,4,5].include?(c) # => true
c.include?([1,3,4,5]) # => false # because 1 does not contain an array [1, 2, 3, 4, 5]
于 2013-04-04T09:04:06.660 回答