我正在尝试使用 ruby 中的 .select 枚举在 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
}
此代码块不起作用,因为我试图使麻木对象成为全局变量。这还能用吗?
$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
,因为您只是遍历数组,而不是实际从中选择任何内容。