所以我認爲這將是非常基本的,但我沒有找到與數組中的屬性相同的對象實際上是否在數組中。下面的代碼返回false:查找對象是否在Ruby中的數組中?
hand = [Card.new(:ace)]
puts("#{hand.include?(Card.new(:ace))}")
但我不知道怎樣才能檢查手陣列中的卡有卡我在包括提供相同內容的?論據。
所以我認爲這將是非常基本的,但我沒有找到與數組中的屬性相同的對象實際上是否在數組中。下面的代碼返回false:查找對象是否在Ruby中的數組中?
hand = [Card.new(:ace)]
puts("#{hand.include?(Card.new(:ace))}")
但我不知道怎樣才能檢查手陣列中的卡有卡我在包括提供相同內容的?論據。
所以要保證對象平等的正確方法是實施#==
和#hash
class Card
attr_accessor :card
def initialize(card)
@card = card
end
def ==(other)
other.class == self.class && other.card == @card
end
alias_method :eql?, :==
def hash
@card.to_s.hash
end
end
p Card.new(:ace) == Card.new(:ace)
#=> true
這似乎適用於所有情況,並允許我使用包括?方法,沒有任何額外的工作。謝謝! – kmahon99
假設
class Card
attr_reader :card
def initialize(card)
@card = card
end
end
你可以使用:
hand.find { |c| c.card == :ace }
find
傳回第一個匹配的元素或nil
你將需要添加到測量卡之間平等的方法卡類。你的類可能是這樣的:
class Card
attr_reader :value
def initialize(v)
@value = v
end
def ==(other_card)
@value == other_card.value
end
end
如果你需要看的東西是否是一個數組,你需要重新考慮數組是否是適當的結構。數組非常適合以特定順序存儲想要訪問的內容,無論是作爲堆棧還是隊列,但隨着它們增長,查看它們所需的時間會不斷增長和增長。相反,如果您想知道是否存在某些內容,請考慮使用哈希或某種形式的樹,無論順序如何,都可以進行快速查找。 –
我知道哈希和其他結構的好處,但是我編碼的任務只有最多5個元素的數組,所以效率在這裏不是一個大問題。 – kmahon99
效率總是令人擔憂。做足夠低效的操作時間,併產生影響。 –