ruby 为什么if语句中的赋值之前没有发生过?

up9lanfz  于 2023-06-22  发布在  Ruby
关注(0)|答案(1)|浏览(112)

我有一段代码,它必须对另一个(复杂)函数的输出做一些事情,但前提是结果满足一个条件。我想我可以把它变成一行程序,但它没有工作,我很好奇为什么。
当我运行以下代码时:

do_something(foo) if (foo = compute_foo).present?

我得到NameError: undefined local variable or method 'foo' for main:Object。我的印象是,条件(因此赋值)将在主命令之前进行评估。
我试着在irb中使用它,当我第二次运行这行时,命令工作了...所以赋值确实发生了,但是在if语句之后?这让我很困惑,我希望得到一个解释。

  • 显然,这个错误可以避免,只要不坚持一句话,但这不是我想问的。
xwmevbvl

xwmevbvl1#

嗨这是由于执行命令
当Ruby遇到这行do_something(foo) if (foo = compute_foo).present?时,它将开始从左手边到右手边计算它。
因此,在这种情况下,它遇到的第一个表达式是do_something(foo)。但是,在这一点上,foo还没有被赋值,所以它会引发NameError,因为foo是未定义的。
正如Stefan所提到的,本文档将对此提供明确的解释:
https://ruby-doc.org/3.2.2/syntax/control_expressions_rdoc.html#label-Modifier+if+and+unless.

相关问题