我正在尝试用 Ruby 制作一个基于可枚举的 FizzBuzz。当我内联计算时它起作用了:
numb_array = (0..100)
numb_array.select { |numb|
if numb % 2 == 0 && numb % 3 == 0
puts "fizzbuzz"
elsif numb % 2 == 0
puts "buzz"
elsif numb % 3 == 0
puts "fizz"
else
puts "none"
end
}
但是尝试将计算移到代码块之外不起作用,可能是因为我试图将
numb
作为全局变量访问。
$div_1 = (numb % 2 == 0)
$div_2 = (numb % 3 == 0)
numb_array = (0..100)
numb_array.select {|numb|
if div_1 && div_2
puts "fizzbuzz"
elsif div_1
puts "fiz"
elsif div_2
puts "buzz"
else
puts "none"
end
}
这还能用吗?
这还能用吗?
不,不是那样的。即使
numb
是全局变量,div_1
和 div_2
也只会设置一次。为了使其正常工作,您可以将计算移至 lambda / proc 中。这将推迟评估,直到您调用 lambda:(通过 numb
)
div_1 = ->(n) { n % 2 == 0 }
div_2 = ->(n) { n % 3 == 0 }
numb_array.each do |numb|
if div_1[numb] && div_2[numb]
puts "fizzbuzz"
elsif div_1[numb]
puts "fiz"
elsif div_2[numb]
puts "buzz"
else
puts "none"
end
end
但是,请注意
div_1
和 div_2
每次迭代最多可能被调用(并因此评估)两次。
您也可以将计算直接移至迭代中并将其存储在局部变量中,例如:
numb_array.each do |numb|
div_1 = numb % 2 == 0
div_2 = numb % 3 == 0
if div_1 && div_2
puts "fizzbuzz"
elsif div_1
puts "fiz"
elsif div_2
puts "buzz"
else
puts "none"
end
end
或者也许利用 Ruby 的 模式匹配:
numb_array.each do |n|
case [n % 2, n % 3]
in [0, 0]
puts "fizzbuzz"
in [0, *]
puts "fiz"
in [*, 0]
puts "buzz"
else
puts "none"
end
end
我在上面的示例中将
select
替换为 each
,因为您只是遍历数组,而不是实际从中选择任何内容。