是否有理由让 if 语句后跟另一个语句以 ruby 中的'and'运算符 (&&) 结束该行?



我试图弄清楚为什么这有效以及这是否是一种不好的做法。

以下代码将引发语法错误

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

最新更新