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

ただし、これらの include メソッドはどちらも機能しません。

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

これを行うために include メソッドを使用することはまったく可能ですか? 別の方法でできることはわかっていますが、「ルビーのように」やりたいです。(これがルビーのような方法でさえあると仮定して...)私はJavaとC ++からルビーに入っています

前もって感謝します!

4

1 に答える 1

1

コードを十分に長く見つめればわかるでしょう。otherであると想定する宇宙船オペレーターを実装しCardます。しかし、あなたは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 に答える