我有一段代码,它必须对另一个(复杂)函数的输出做一些事情,但前提是结果满足一个条件。我想我可以把它变成一行程序,但它没有工作,我很好奇为什么。
当我运行以下代码时:
do_something(foo) if (foo = compute_foo).present?
我得到NameError: undefined local variable or method 'foo' for main:Object
。我的印象是,条件(因此赋值)将在主命令之前进行评估。
我试着在irb
中使用它,当我第二次运行这行时,命令工作了...所以赋值确实发生了,但是在if
语句之后?这让我很困惑,我希望得到一个解释。
- 显然,这个错误可以避免,只要不坚持一句话,但这不是我想问的。
1条答案
按热度按时间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.