gpt4 book ai didi

ruby - 为什么我可以引用从未运行过的 if/unless/case 语句之外的变量?

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:35 26 4
gpt4 key购买 nike

为什么下面的代码不会报错?

if false
x = 0
end

x #=> nil

而以下确实会引发错误:

y  # NameError: undefined local variable or method `y' for main:Object

unlesscase 语句也会发生同样的事情。

最佳答案

这是因为 Ruby 解析器的工作方式。变量由解析器定义,解析器逐行遍历代码,而不管它是否会实际执行。

一旦解析器看到x =,它就会在当前范围内定义局部变量x(值为nil)。因为 if/unless/case/for/while 不创建新的作用域,x 被定义并且在代码块之外可用。由于条件为假,因此永远不会评估内部 block ,因此 x 未分配给(因此为 nil)。

这是一个类似的例子:

defined?(x) and x = 0
x #=> nil

请注意,这是对所发生情况的高度概括,并不一定是解析器的工作原理。

关于ruby - 为什么我可以引用从未运行过的 if/unless/case 语句之外的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12614805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com