2014-07-17 67 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

是的。它在那里,但我从未见过在任何代码中使用触发器,直到现在我已经看到。 –

相关问题