gpt4 book ai didi

ruby - 类定义/作用域中的局部变量

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

我的印象是可以重新打开 Ruby 中的类定义:

class C
def x
puts 'x'
end
end

class C
def y
puts 'y'
end
end

这按预期工作并且 y 被添加到原始类定义中。

我很困惑为什么下面的代码不能按预期工作:

class D
x = 12
end

class D
puts x
end

这将导致 NameError 异常。为什么重新打开一个类时会启动一个新的本地范围?这似乎有点违反直觉。有什么办法可以在类扩展的时候继续之前的局部作用域?

最佳答案

局部变量不与对象相关联,它们与作用域相关联。

局部变量是词法范围的。您正在尝试做的事情并不比以下更有效:

def foo
x = :hack if false # Ensure that x is a local variable
p x if $set # Won't be called the first time through
$set = x = 42 # Set the local variable and a global flag
p :done
end

foo #=> :done

foo #=> nil (x does not have the value from before)
#=> done

在上面它是同一个方法,在同一个对象上,被执行了两次。 self 没有变化。但是,局部变量在两次调用之间被清除。

重新打开类就像再次调用一个方法:您处于相同的 self 范围内,但您正在启动一个新的本地上下文。当您使用 end 关闭 class D block 时,您的局部变量将被丢弃(除非它们是 closed over )。

关于ruby - 类定义/作用域中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10452566/

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