我有一個類,其中的數據存儲爲set,我希望能夠比較該類的對象,使元素的字母大小寫無關緊要。例如,如果該集合包含字符串元素,則不應有差異"a"
和"A"
。如何讓設置差異對大小寫不敏感?
爲此,我曾試圖定義一組成員的eql?
方法是不敏感的區分,但是這對中集的方法-
(化名difference
)沒有影響。那麼,我應該如何去做-
對大小寫不敏感?
下面的代碼說明了此問題:
require 'set'
class SomeSet
include Enumerable
def initialize; @elements = Set.new; end
def add(o)
@elements.add(o)
self
end
def each(&block) # To enable +Enumerable+
@elements.each(&block)
end
def difference(compared_list)
@elements - compared_list
end
end
class Element
attr_reader :element
def initialize(element); @element = element; end
# This seems to have no effect on +difference+
def eql?(other_element)
element.casecmp(other_element.element) == 0
end
end
set1 = SomeSet.new
set2 = SomeSet.new
set1.add("a")
set2.add("A")
# The following turns out false but I want it to turn out true as case
# should not matter.
puts set1.difference(set2).empty?
一個明顯的解決方法是將所有字符串轉換爲低/大寫的情況下添加到集 – akonsu
@akonsu我想避免這一點。 –
糾正我,如果我錯了,但不會使用'eql?'設置元素使插入O(n)? – Dogbert