【发布时间】:2016-01-14 14:36:12
【问题描述】:
在这里,我在类范围内创建了一个局部变量:
class MyClass
x = 1
puts x
end
即使我没有创建MyClass 的任何实例,它也会打印1。
我想以某种方式使用x:
class MyClass
x = 1
def method
puts x
end
end
m = MyClass.new
m.method
我不能。为什么?我得到该类定义创建了一个范围,但为什么在方法中无法访问它?方法的作用域不是在类的作用域内吗?
我可以想象这与创建一个类有关。既然任何类都是Class的对象,那么MyClass的作用域可能就是某个Class方法的作用域,而MyClass的方法与那个实例的耦合方式使得它们的作用域完全不同。
在我看来,我不能只用{}(如在C 中)或类似do..end 的东西创建一个范围。我说的对吗?
【问题讨论】:
-
它打印
1,因为类声明只是在加载类时运行的代码。 -
我没有“类加载”的概念。你能解释一下这是什么意思吗?
-
在运行时,在解析之后,Ruby实际上会执行所有包含在类定义中的代码。
-
所以只创建一个没有任何实例的类会导致在运行时实际执行某些东西(甚至可能是分配)?这和 C++ 很不一样。
-
正确。 Ruby 不需要初始化任何实例来运行类定义中的代码。它在读取时运行,这可能是在读取代码库中代码的其他部分之前。
标签: ruby class scope local-variables