我试图弄清楚为什么这会起作用以及这是否是一种不好的做法。
后一个问题很难回答,因为您的代码非常抽象。此外,“不好的做法”是基于观点的,因此偏离主题。
下面的代码会抛出一个语法错误:
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
or
if true && if true then puts "ok" end
end
or
if true && if true then puts "ok" end then end
我在编写 ruby 脚本时遇到了这个问题if陈述
这就是你困惑的根源:这是not an if
陈述。这是一if
表达。 (从技术上讲,ISO Ruby 语言规范将其称为条件表达式。) 那里are noRuby 中的语句,只有表达式。
我很惊讶它没有因为另一个if随后发表声明。
It isn't一份声明。它与任何其他表达式一样。foo && bar
是完全合法的并且foo && if true then 23 end
也是完全合法的因为这是完全相同的事情: an &&
两边都有一个表达式的运算符。