我在看some Ruby documentation,我发现了以下内容:
class MyClass
@one = 1
def do_something
@one = 2
end
def output
puts @one
end
end
instance = MyClass.new
instance.output
instance.do_something
instance.output
令人惊讶的是,这输出:
nil
2
文档中的解释如下:
这种情况发生(在第一个输出行中为零),因为在类MyClass 下面定义的 @one 是属于类对象的实例变量(注意这不一样作为一个类变量,不能称为 @@ one ),而在 do_something 方法中定义的 @one 是属于的实例变量到MyClass的实例。它们是两个不同的变量,第一个只能在类方法中访问。
我不明白这个解释......到目前为止,我得到的是:
我不明白 2 & 3
点 2 听起来像点 1 ,除了明确说明 它不是。点 3 听起来像普通的类属性,除了它不能在类方法之外定义(??)
有人可以帮助我理解这一点,也许可以添加一些例子,以便我可以看到使用这3种变量的存在吗?
答案 0 :(得分:3)
实例变量属于实例(又称对象)。每个对象都有自己的实例变量。
上面的代码中有两个对象:instance
和MyClass
。每个对象都有自己的一组实例变量。
MyClass
有一个名为@one
的实例变量,该变量初始化为1
。
第一次调用output
时,instance
没有名为@one
的实例变量,但没关系:未初始化和未定义的实例变量不要提出异常,他们只是评估为nil
。调用do_something
时,instance
的实例变量@one
会自动创建(实例变量在第一次分配时会神奇地存在)并初始化为{{1} },以便第二次调用2
时,它现在打印output
。
2
的实例变量MyClass
是一个红色的鲱鱼,它永远不会在上面的代码中访问(当然,在创建和初始化它的第2行之后)。
类变量用双倍@one
标记表示。它们属于一个类(实际上是一个模块),并且在所有子类,所有实例,所有子类的所有实例,所有子类,所有子子类的所有实例等之间共享。它们应该被认为是(略微)限制形式的全局变量。
答案 1 :(得分:2)
鉴于作业:
class MyClass
@@class_variable = 3
@class_instance_variable = 1
def initialize
@instance_variable = 2
end
end
可见性如下:
class MyClass
def my_instance_method
@@class_variable # => Can refer (`3`)
@class_instance_variable # => Cannot refer (`nil`)
@instance_variable # => Can refer (`2`)
end
def self.my_singleton_method
@@class_variable # => Can refer (`3`)
@class_instance_variable # => Can refer (`1`)
@instance_variable # => Cannot refer (`nil`)
end
@@class_variable # => Can refer (`3`)
@class_instance_variable # => Can refer (`1`)
@instance_variable # => Cannot refer (`nil`)
end
class SubClass < MyClass
def my_instance_method
@@class_variable # => Can refer (`3`)
@class_instance_variable # => Cannot refer (`nil`)
@instance_variable # => Cannot refer (`nil`)
end
def self.my_singleton_method
@@class_variable # => Can refer (`3`)
@class_instance_variable # => Cannot refer (`nil`)
@instance_variable # => Cannot refer (`nil`)
end
@@class_variable # => Can refer (`3`)
@class_instance_variable # => Cannot refer (`nil`)
@instance_variable # => Cannot refer (`nil`)
end