2015-10-26 57 views
1

所以我認爲這將是非常基本的,但我沒有找到與數組中的屬性相同的對象實際上是否在數組中。下面的代碼返回false:查找對象是否在Ruby中的數組中?

hand = [Card.new(:ace)] 
puts("#{hand.include?(Card.new(:ace))}") 

但我不知道怎樣才能檢查手陣列中的卡有卡我在包括提供相同內容的?論據。

+0

如果你需要看的東西是否是一個數組,你需要重新考慮數組是否是適當的結構。數組非常適合以特定順序存儲想要訪問的內容,無論是作爲堆棧還是隊列,但隨着它們增長,查看它們所需的時間會不斷增長和增長。相反,如果您想知道是否存在某些內容,請考慮使用哈希或某種形式的樹,無論順序如何,都可以進行快速查找。 –

+0

我知道哈希和其他結構的好處,但是我編碼的任務只有最多5個元素的數組,所以效率在這裏不是一個大問題。 – kmahon99

+0

效率總是令人擔憂。做足夠低效的操作時間,併產生影響。 –

回答

1

所以要保證對象平等的正確方法是實施#==#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 
+0

這似乎適用於所有情況,並允許我使用包括?方法,沒有任何額外的工作。謝謝! – kmahon99

1

假設

class Card 
    attr_reader :card 

    def initialize(card) 
    @card = card 
    end 
end 

你可以使用:

hand.find { |c| c.card == :ace }

find傳回第一個匹配的元素或nil

0

你將需要添加到測量卡之間平等的方法卡類。你的類可能是這樣的:

class Card 

    attr_reader :value 

    def initialize(v) 
    @value = v 
    end 

    def ==(other_card) 
    @value == other_card.value 
    end 
end 
相關問題