2015-02-08 57 views
0

由於範圍是兩個端點之間的值,因此我們需要比較兩個端點之間的值,因此我們使用比較運算符< =>,比較其兩個操作數並評估爲-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>] 

嗯,意外的事發生了。我期待該陣列包括所有三個蘋果在內。但是,它只返回了中間的蘋果。我可能會做錯什麼?

+1

你肯定行'ELSIF @val = other.val'意? – sawa 2015-02-08 19:57:28

+0

如果你想'Apple#<=>'來反映'@ val'和'other.val'的'<=>',那就直接做吧。 'def <=>(其他); @val <=> other.val end'。 – sawa 2015-02-08 20:00:31

+0

請刪除IRB提示並正確格式化代碼。 @sawa,簡潔的回答(您的第一條評論)。 – 2015-02-08 20:04:20

回答

0

首先,你的方法在elsif比較應該與==(雙等於)不=

def <=>(other) 
    if @val > other.val 
    1 
    elsif @val == other.val 
    0 
    else 
    -1 
    end 
end 

但是,你沒有寫自己所有的比較,而不是你可以用比較@val<=>這樣的:

def <=>(other) 
    @val <=> other.val 
end 

其次,succ方法應該返回同一個類的對象,你似乎是返回一個整數/字符串(val.succ其中val分別爲整數/字符串)而不是Apple類的對象。因此,它應該是:

def succ 
    Apple.new(@val + 1) # or Apple.new(@val.succ) 
end 

這些更改代碼似乎工作後:

class Apple 
    attr_accessor :val 

    def initialize(val) 
    @val = val 
    end 

    def <=>(other) 
    @val <=> other.val 
    end 

    def succ 
    Apple.new(@val + 1) 
    end 
end 

a = Apple.new 1 
b = Apple.new 2 
c = Apple.new 3 
puts (a..b).to_a 
#=> [#<Apple:0x007fa10a97bc08 @val=1>, #<Apple:0x007fa10a97bb18 @val=2>] 
puts (a..c).to_a 
#=> [#<Apple:0x007fc8d3957b28 @val=1>, #<Apple:0x007fc8d3957858 @val=2>, #<Apple:0x007fc8d3957830 @val=3>] 
+0

我建議你刪除最後一塊代碼,並以'結束這些更改後,似乎工作正常。它確實不會添加任何東西。 – 2015-02-08 20:07:38

+0

'''在做出這些修改後,代碼似乎可以工作了'''可能會給出一個想法,那就是輸出的樣子。所有的事情都很好。 :) – Surya 2015-02-08 20:11:57