如何在 Ruby 中将 Obj 设为可枚举的全局对象

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

我正在尝试使用 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 
}
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 - 2024. All rights reserved.