我很困惑Ruby 1.9(JRuby 1.6.6(RUBY_VERSION ==“1.9.2”)和Ruby 1.9.3-p125)给puts(true and false)
语法错误。
我不知道为什么 - 这里有什么问题?我该如何正确编写这段代码? puts(true && false)
有效,但有and
的解决方案吗?
示例irb会话:
1.9.3p125 :001 > puts(true and false)
SyntaxError: (irb):1: syntax error, unexpected keyword_and, expecting ')'
puts(true and false)
^
from /home/fr/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `<main>'
1.9.3p125 :002 > puts(true && false)
false
=> nil
感谢MladenJablanović简化了这个例子。旧的例子是f(true and f(false))
。
答案 0 :(得分:3)
所有关于优先权“和”和“&amp;&amp;”在操作数上没有相同的先行,尝试使用
f((true and f(false)))
'和'应该用于类似“做东西A如果这样工作正常然后做东西B”而不是用于严格的布尔检查。
check_db(param) and connect_db(param)
答案 1 :(得分:1)
红宝石中的operator precedence在&&
=
之前and
and
。因此,在使用puts(true
的示例中,它会尝试进行此(隐式)赋值:
false)
然后将其与
组合and
通过foo = puts(true and false)
,这会导致语法错误。请在此处查看一个很好的解释:Difference between "and" and && in Ruby?
编辑:我不确定我的“隐含作业”是否有意义 - 想一想这句话是否明确:
Object.send("puts", true && false) # this works
Object.send("puts", true and false) # this is a syntax error
Object.send("puts", (true and false)) # works again
编辑2:请记住,实际上是在对象上调用方法调用。因此,两种情况的等效陈述将是:
and
不确定这是否有帮助 - 你是对的,这有点违反直觉。我的解决方案是远离{{1}}:)