我有一段代码必须对另一个(复杂)函数的输出执行某些操作,但前提是结果满足条件。我以为我可以把它变成一句俏皮话,但它没有成功,我很好奇为什么。
当我运行以下代码时:
do_something(foo) if (foo = compute_foo).present?
我收到NameError: main:Object 的未定义局部变量或方法“foo”
。
我的印象是条件(因此分配)将在主命令之前进行评估。
我尝试在irb
中使用它,当我第二次运行该行时,该命令起作用......所以分配确实发生了,但在if
之后陈述?这让我很困惑,我希望得到一个解释。
显然这个错误可以通过简单地不坚持一句台词来避免,但这不是我要问的。
最佳答案
嗨,这是由于执行顺序造成的
当 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 .
关于ruby - 为什么 if 语句中的赋值之前没有发生过?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76450521/