三元运算符在假时输出True选项

时间:2017-04-21 19:53:51

标签: ruby ternary-operator string-interpolation

以下节目输出歌曲“99 Bottles of Beer”的歌词。

当歌曲到达只剩下1个瓶子的点时,它使用单数形式的“瓶子”。为了适应这种情况,我使用三元运算符在任何给定时刻选择正确的情况。

然而,当我的程序中Caused by: javax.naming.directory.SchemaViolationException: [LDAP: error code 65 - no structural object class provided]; remaining name 'uid=testy' at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3167) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:3082) at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888) at com.sun.jndi.ldap.LdapCtx.c_bind(LdapCtx.java:423) at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_bind(ComponentDirContext.java:299) at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.bind(PartialCompositeDirContext.java:217) at org.wso2.carbon.user.core.ldap.ReadWriteLDAPUserStoreManager.doAddUser(ReadWriteLDAPUserStoreManager.java:275) ... 71 more 计数达到1时,最后一句仍会输出“瓶子”,即使三元运算符的评估结果为false也是如此。

我使用beer_bottles在IRB中测试了三元运算符,并正确输出了错误选项:“bottle”。

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

beer_bottles = 1

2 个答案:

答案 0 :(得分:2)

最安全的做法是在输出变量时检查。您可以在打印最后一行之前简单地移动三元组。

我很想将它提取到一个单独的方法中。事实上,这就是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

答案 1 :(得分:1)

plural_or_singularbeer_bottles -= 1更新后,您再次计算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