三元运算符为假时输出真选项
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
下面的程序输出歌曲“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