我试图弄清楚为什么这有效以及这是否是一种不好的做法。
以下代码将引发语法错误:
if true &&
puts "ok"
end
尽管以下代码不会,但它将按预期执行:
if true &&
if true
puts "ok"
end
end
我在编写一个带有包含大量条件链的 if 语句的ruby脚本时遇到了这个问题,所以我将每个条件放在单独的行中,然后我注释掉最后一个并执行脚本。此刻,我意识到if语句以 &&运算符结尾。虽然我预计它会抛出,但我很惊讶它没有,因为紧接着是另一个if语句。
我的红宝石版本是ruby 2.2.6p396 (2016-11-15 revision 56800) [x86_64-darwin16]
。
我试图弄清楚为什么这有效以及这是否是一种不好的做法。
后一个问题很难回答,因为你的代码太抽象了。此外,"不良做法"是基于意见的,因此偏离了主题。
以下代码将引发语法错误:
if true && puts "ok" end
这是一条红鲱鱼。请阅读错误消息:
SyntaxError: unexpected string literal, expecting `do' or '{' or '('
puts "ok"
^
它没有说任何关于if
.我希望你的代码等同于
if true && puts "ok"
end
这确实提出了相同的SyntaxError
:
SyntaxError: unexpected string literal, expecting `do' or '{' or '('
if true && puts "ok"
^
我们可以进一步将其缩小到
true && puts "ok"
这是因为&&
比空格分隔的参数列表具有更高的优先级,因此此行被解析为
(true && puts) "ok"
因此,为了消除歧义,我们需要在参数列表中添加括号:
if true &&
puts("ok")
end
现在代码按预期工作。
尽管以下代码不会,但它将按预期执行:
if true && if true puts "ok" end end
事实上,这是完全合法的。行尾的二元运算符将隐式延续该行,即此代码等效于:
if true && if true
puts "ok"
end
end
或
if true && if true then puts "ok" end
end
或
if true && if true then puts "ok" end then end
我在编写带有if语句的 ruby 脚本时遇到了这个问题
这是你困惑的根源:这不是一个if
的说法。这是一个if
表达。(从技术上讲,ISO Ruby 语言规范称其为条件表达式。Ruby 中没有语句,只有表达式。
我很惊讶它没有,因为紧接着是另一个if语句。
这不是一个声明。这是一个像任何其他表达式一样的表达式。foo && bar
是完全合法的,foo && if true then 23 end
也是完全合法的,因为它是完全相同的东西:一个&&
运算符,两边都有一个表达式。
你有没有试过关注,
if true &&
(puts "ok")
end
它不会抛出错误,您将获得帮助以收集结论。
&&
的左侧需要执行表达式,当您向&&
左侧提供以下内容时,
if true
puts "ok"
end
它被视为单个表达式。
也许它是执行的,true.send :&, expression
在这里提供puts 'ok'
作为表达肯定会抛出SyntaxError