以下代码导致参数错误:
n = 15
(n % 4 == 0)..(n % 3 == 0)
# => bad value for range (ArgumentError)
我认为这是因为它评估为:
false..true
TrueClass
并且在 range:和中使用了不同类型的类FalseClass
。但是,以下代码不会引发错误。这是为什么?Enumerable#collect
抓到了吗?
(11..20).collect { |i| (i % 4 == 0)..(i % 3 == 0) ? i : nil }
# => no error
稍后添加: 如果fcn返回 15,则仅计算范围的前半部分
def fcn(x)
puts x
15
end
if (fcn(1) % 4 == 0)..(fcn(2) % 3 == 0); end
# => 1
但是如果我们将返回值更改为 16 那么输入将是
# => 1
# => 2
这很奇怪,因为在这种情况下,表达式的计算结果为
true..false
根据下面sawa的回答,这种范围是无效的。
那么在第一种情况下(使用def的返回值 15)我们只有部分范围而没有结束部分?太奇怪了:)