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

标签 ruby

我有一段代码必须对另一个(复杂)函数的输出执行某些操作,但前提是结果满足条件。我以为我可以把它变成一句俏皮话,但它没有成功,我很好奇为什么。

当我运行以下代码时:

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/

相关文章:

ruby - Ruby 中的循环分配

c++ - 使用 SWIG 实现 C++ 和 Ruby 之间的多态性

ruby-on-rails - Bash to Ruby - 使用 whois 和 grep 命令获取列表

ruby - Watir-scroll 在滚动到元素时出错

ruby-on-rails - xmpp 服务器和 ruby​​ on rails 集成建议?

ruby-on-rails - 时间可用性比较,使用 Ruby on Rails

ruby-on-rails - Rails 使用不同的布局?

ruby - Ruby 的 Marshall 格式架构和 Ruby-version 是否独立?

ruby-on-rails - 通过 Ruby 中的 MassiveRecord 的 HBase 导致中止

ruby - 运行 ruby​​ 脚本时出错 "Insecure world writable dir foo in PATH"