2014-07-17 108 views
4

請幫助我理解範圍運算符.....之間的差異,作爲Ruby中使用的「觸發器」。觸發器ruby中的3點範圍運算符和2點範圍運算符之間的區別

這是從語程序員指南紅寶石一個例子:

a = (11..20).collect {|i| (i%4 == 0)..(i%3 == 0) ? i : nil} 

它返回:

[nil, 12, nil, nil, nil, 16, 17, 18, nil, 20] 

另外:

a = (11..20).collect {|i| (i%4 == 0)...(i%3 == 0) ? i : nil} 

返回:

[nil, 12, 13, 14, 15, 16, 17, 18, nil, 20] 
+0

[範圍生成中'..'(雙點)和'...'(三點)之間差異的可能重複?](http://stackoverflow.com/questions/9690801/difference-between - 雙點和三點範圍代) –

回答

3

Ruby中2點和3點之間的區別是包含。例如

(1..100) 
=> All numbers starting from 1 and ending at 100 INCLUDING 100 

(1...100) 
=> All numbers starting from 1 that are less than 100 

(1..100).include?(100) 
=> true 

(1...100).include?(100) 
=> false 

希望這會有所幫助。

2

當在一個範圍內使用雙點時,它會創建一個數字範圍,並且包含傳入的最大數字。當使用三點時,它會創建一個範圍,但不包括最大值數傳入

這樣:

(1..5).each {| i | puts i} #will print 1,2,3,4,5 

雖然:

(1...5).each {| i | puts i} #will print 1,2,3,4 
+0

但使用點運算符作爲觸發器,它將具有不同的行爲。操作數不可迭代(i%4 == 0)..(i%3 == 0)。 – gmuraleekrishna

3

觸發器開關的概念實際上是從electronics來了。它的主要優點是記得它的狀態。將觸發器的布爾範圍看作一個變量,存儲布爾值。讓我們來看看下面的例子:

1.upto(10).each do |i| 
    puts i if (i%2==0)..(i%4==0) 
end 

     #      vvvv value of 「hidden」 state 
2  # left range boundary ⇨ true 
3 
4  # right range boundary ⇨ false, no 5 follows 
6  # left range boundary ⇨ true 
7 
8  # right range boundary ⇨ false, no 9 follows 
10 

在你的第一個例子中的「條件」 4的倍數成爲true回百轉,以false在3的倍數。在第二個示例中,12上的條件變量沒有關閉,僅僅是因爲正確的範圍邊界(i%3)是,因爲它是3點範圍,因此排除了

希望這個例子不是太糾結。

+1

是的。它在那裏,但我從未見過在任何代碼中使用觸發器,直到現在我已經看到。 –

相關問題