以下节目输出歌曲“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
答案 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_singular
在beer_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