次のコードでは、引数エラーが発生します。
n = 15
(n % 4 == 0)..(n % 3 == 0)
# => bad value for range (ArgumentError)
これは、次のように評価されるためだと思います。
false..true
およびさまざまなタイプのクラスが range:TrueClass
およびで使用されます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 を使用) では、終了部分のない部分的な範囲しかありませんか? それはとても奇妙です:)