在 Ruby 中使用枚举时如何提取内联计算?

问题描述 投票:0回答:1

我正在尝试用 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 
}

这还能用吗?

ruby variables global enumerable fizzbuzz
1个回答
0
投票

这还能用吗?

不,不是那样的。即使

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
,因为您只是遍历数组,而不是实际从中选择任何内容。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.