为什么Ruby 1.9.2会给出一个语法错误:puts(true和false)?

时间:2012-03-08 10:55:30

标签: ruby

我很困惑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))

2 个答案:

答案 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}}:)