三元运算符为假时输出真选项

Ternary Operator Outputting True Option when False

下面的程序输出歌曲“99瓶啤酒”的歌词。

当歌曲唱到只剩下1瓶的时候,就用了"bottle"的单数形式。为了适应这一点,我使用了一个三元运算符来在任何给定时刻选择正确的大小写。

但是,当beer_bottles计数在我的程序中达到1时,最后一句仍然输出"bottles",即使很明显三元运算符计算假的。

我在 IRB 中用 beer_bottles = 1 测试了三元运算符,它正确地输出了 false 选项:"bottle".

非常感谢帮助理解为什么会发生这种情况!!

beer_bottles = 99

while beer_bottles >= 2 do
  plural = "bottles"

  singular = "bottle"

  plural_or_singular = beer_bottles > 1 ? plural : singular

  puts "#{beer_bottles} #{plural_or_singular} of beer on the wall, #{beer_bottles} #{plural_or_singular} of beer."

  beer_bottles -= 1

  puts "BOTTLE COUNT: #{beer_bottles}"

  puts "Take one down and pass it around, #{beer_bottles} #{plural_or_singular} of beer on the wall."
end

您不会在 beer_bottles -= 1 之后再次计算 plural_or_singular,因为 beer_bottles 已更新。

解决方案:

beer_bottles = 99

while beer_bottles >= 2 do
  plural = "bottles"

  singular = "bottle"

  plural_or_singular = beer_bottles > 1 ? plural : singular

  puts "#{beer_bottles} #{plural_or_singular} of beer on the wall, #{beer_bottles} #{plural_or_singular} of beer."

  beer_bottles -= 1
  plural_or_singular = beer_bottles > 1 ? plural : singular
  puts "BOTTLE COUNT: #{beer_bottles}"

  puts "Take one down and pass it around, #{beer_bottles} #{plural_or_singular} of beer on the wall."
end

最安全的做法是在输出变量时进行检查。在打印最后一行之前,您只需将三元组向下移动即可。

我很想将它提取到一个单独的方法中。事实上,这就是 Rails 对 pluralize 的作用。我们可以创建自己的简化版本:

def pluralize(count, noun)
  "#{count} #{count==1 ? noun : noun + 's'}"
end

那么您的代码可能如下所示:

99.downto(1) do |n|
  puts "#{pluralize(n, "bottle")} of beer on the wall, #{pluralize(n, "bottle")} of beer."
  puts "Take one down and pass it around, #{pluralize(n-1, "bottle")} of beer on the wall."
end