由於範圍是兩個端點之間的值,因此我們需要比較兩個端點之間的值,因此我們使用比較運算符< =>,比較其兩個操作數並評估爲-1 ,0或1,這取決於它們的相對順序。其次,如果我們希望迭代,那麼我們必須有一組離散的範圍成員,而不是一個連續的集合。我們使用succ來創建離散的範圍。整數確實是離散的。使用自定義類創建離散範圍
所以我建立這個類叫做Apple。正如你所看到的,我定義這兩個比較運算方法< =>和SUCC方法,因爲我想一個離散範圍:
class Apple
attr_accessor :val
def initialize(val)
@val = val
end
def <=>(other)
if @val > other.val
1
elsif @val == other.val
0
else
-1
end
end
def succ
val.succ
end
end
現在,我創建了三個蘋果,我希望得到一個範圍包括所有的蘋果:
a = Apple.new 1
=> #<Apple:0x00000001d3fa30 @val=1>
b = Apple.new 2
=> #<Apple:0x00000001d35210 @val=2>
c = Apple.new 3
=> #<Apple:0x00000001d2fbf8 @val=3>
(a..b).to_a
=> [#<Apple:0x00000001d3fa30 @val=2>]
嗯,意外的事發生了。我期待該陣列包括所有三個蘋果在內。但是,它只返回了中間的蘋果。我可能會做錯什麼?
你肯定行'ELSIF @val = other.val'意? – sawa 2015-02-08 19:57:28
如果你想'Apple#<=>'來反映'@ val'和'other.val'的'<=>',那就直接做吧。 'def <=>(其他); @val <=> other.val end'。 – sawa 2015-02-08 20:00:31
請刪除IRB提示並正確格式化代碼。 @sawa,簡潔的回答(您的第一條評論)。 – 2015-02-08 20:04:20