2010-12-22 27 views
3

使用Ruby中的範圍,您可以執行0..5以包含0和5之間的所有數字(包括0和5)。您還可以執行0...5以包含除5之外的相同數字。如何:不包含第一個值的Ruby範圍

(1..5) === 5 
=> true 
(1...5) === 5 
=> false 
(1...5) === 4.999999 
=> true 

有沒有辦法排除第一個數字而不是最後得到這樣的結果?

(1...5) === 1 
=> false 
(1...5) === 1.00000001 
=> true 

回答

2

不,這裏沒有內置的支持。如果這種行爲是必要的,你可能想要推出自己的Range類。

+0

感謝您花時間瞭解我所需要的(不僅僅是2 ... 5)。太糟糕了,沒有內置的支持。我認爲測試數字> 1 &&數字<= 5比創建自己的類更容易。我想如果我確實想創建自己的類,我可以在內部使用Range對象,但只需提供包含?,成員?等方法的執行略有不同。 – dontangg 2010-12-22 21:06:20

+0

您可以在內部使用Range對象,並取消所有值。例如,內部範圍將是(-5 ... -1)。這將包括-5,但不包括-1。當然,這隻適用於其值爲否定的範圍。 – Mashmagar 2013-04-24 16:38:27

1

除了只發送first_arg.succ而不是first_arg?不,對此沒有特別的支持。

+0

除(2..5)`實際上不符合要求外:/ – Matchu 2010-12-22 19:15:31

+1

要求並非基於對Range的工作原理的充分理解。當發生這種情況時,我們通常會回到學習如何在語言或對象的限制範圍內工作,備份幾個步驟並對其進行不同的運行。改變語言或物體的行爲以符合規格可能會導致瘋狂,或者可能燒掉氣氛或打開一扇門進入另一個維度([不應被指名的人])(http://en.wikipedia.org/wiki/)克蘇魯)可以返回併爲我們所有人帶來痛苦......洛,他來...... – 2010-12-22 20:43:59

0

你可以猴子補丁範圍添加一個方法來表現你想要的方式。例如:

class Range 
    def exclusive() 
     Range.new(self.first+1, self.last-1) 
    end 
end 

(1..5).exclusive === 5 
==>false 
(1..5) === 5 
==>true 

雖然它會改變現有類的功能,但要注意monkeypatching。在這種情況下可能有更好的辦法,但考慮到這個問題,這是一個可以接受的答案。

1

非本地範圍。你可以混淆它的思想,但你最好使用遞增的第一個值。這是醜陋的,但:

[(1..5).to_s].map{ |s| a,b=s.split('..').map{|i| i.to_i}; (1+a .. b) } #=> [2..5] 

Range.new(*[(1..5).to_s].map{ |s| a,b=s.split('..').map{|i| i.to_i}; [1+a,b] }.flatten) #=> 2..5 

irb(main):004:0> asdf = (1..5) 
=> 1..5 
irb(main):005:0> Range.new(asdf.min.succ, asdf.max) 
=> 2..5 

似乎都不過分優雅。

相關問題