Answers:
使用
..
run 构造的范围从开始到结束。使用创建...
的值不包括最终值。
所以a..b
就像a <= x <= b
,而a...b
就像a <= x < b
。
请注意,在to_a
“整数范围”上提供整数集合时,“范围” 不是一组值,而只是一对开始/结束值:
(1..5).include?(5) #=> true
(1...5).include?(5) #=> false
(1..4).include?(4.1) #=> false
(1...5).include?(4.1) #=> true
(1..4).to_a == (1...5).to_a #=> true
(1..4) == (1...5) #=> false
†以前,文档不包括此文档,而是需要阅读Ranges上Pickaxe的部分。感谢@MarkAmery(请参见下文)注意到此更新。
(a..b) != (a...(b+1))
尽管它们的数组表示形式相等(当a,b∈hen时)无关,但并不重要。我已经对我的答案做了一些更新,以扩大其范围。
inject
来自Enumerable
其中Range
;Enumerable
利用#each
,Range
实现。生成的列表Range#each
从不包含在Range
对象本身内。
那是正确的。
1.9.3p0 :005 > (1...10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
1.9.3p0 :006 > (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
三点语法不太普遍,但是比 (1..10-1).to_a
..
更普遍,因此更受欢迎吗?
(a..b-1) != (a...b)
,尽管此答案暗示它们是。
API文档现在描述了这种行为:
使用
..
run 构造的范围从开始到结束。使用创建...
的值不包括最终值。
换一种说法:
2.1.3 :001 > ('a'...'d').to_a
=> ["a", "b", "c"]
2.1.3 :002 > ('a'..'d').to_a
=> ["a", "b", "c", "d"]
a...b
排除最终值,而a..b
包括最终值。
使用整数时,a...b
其行为与相同a..b-1
。
>> (-1...3).to_a
=> [-1, 0, 1, 2]
>> (-1..2).to_a
=> [-1, 0, 1, 2]
>> (-1..2).to_a == (-1...3).to_a
=> true
但是实际上范围在实数线上有所不同。
>> (-1..2) == (-1...3)
=> false
当以小数步递增时,您会看到这一点。
>> (-1..2).step(0.5).to_a
=> [-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0]
>> (-1...3).step(0.5).to_a
=> [-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5]
a
&b
是整数,范围也不同。只有当每个都转换为数组时,它们才是相同的。接受的答案中存在特定的反例。
..和...表示范围。
只需在irb中看到它即可:
ruby-1.9.2-p290 :032 > (1...2).each do puts "p" end
p
=> 1...2
ruby-1.9.2-p290 :033 > (1..2).each do puts "p" end
p
p
(1..10).include? 10 #=> true
和(1...10).include? 10 #=> false