Ruby为何if条件内赋值未先执行?单行代码报错咨询
Ruby单行条件赋值报错的根本原因
核心解析与执行逻辑
- Ruby的代码解析是逐段扫描的:当处理
do_something(foo) if (foo = compute_foo).present?这行代码时,会先扫描前半段的do_something(foo)。此时赋值操作foo = compute_foo还在后面的条件表达式里,解析器还没标记foo为局部变量,所以会把foo当作一个未定义的方法调用。 - 执行阶段,Ruby确实会先计算条件部分:
(foo = compute_foo).present?会执行赋值,创建局部变量foo并赋值。但此时前半段的foo已经被解析成方法调用,而你没有定义foo方法,因此触发NameError。
第二次运行正常的原因
第一次执行时,条件部分的赋值已经在当前irb作用域里创建了局部变量foo。第二次解析该行代码时,Ruby会优先将foo识别为已存在的局部变量,而非方法调用,因此不会报错。
内容的提问来源于stack exchange,提问作者hananamar
相关产品推荐
相关产品推荐

