在Ruby中,@@variable
与self.variable
在main。
在班级
在方法范围内
例如我的文件如下:
self.variable = 'data'
@@variable = 'data'
def class A
self.variable = 'data'
@@variable = 'data'
def method()
self.variable = 'data'
@@variable = 'data'
end
end
有多少变量?在什么范围内?
答案 0 :(得分:3)
self.variable = 'data'
这是toplevel的方法调用。 self.
只是将它区分为方法调用与局部变量定义。假设你在某处有def variable= x
,它会调用该方法。否则它是NoMethodError
@@variable = 'data'
这会生成一个警告:“来自toplevel的类变量访问”。类变量在该类和子类的所有对象之间共享。 Toplevel的类只是Object,所以实际上这是一个全局类变量[].instance_eval { @@variable } # 'data'
,因为所有内容最终都来自Object。
def class A
self.variable = 'data'
@@variable = 'data'
与上述相同,但现在接收方为A
,因此它会调用A.variable=('data')
并在@@variable
上设置A
。
def method()
self.variable = 'data'
@@variable = 'data'
现在接收器是A
的一些实例,让我们说a = A.new
。所以它是a.variable=('data')
。像@@variable
一样设置A
,因为类的所有实例(及其子类)共享一个变量。
仅 的情况下,如果您在班级的上下文中看到self.variable = 'data'
或attr_accessor :variable
,则可以认为attr_writer :variable
意味着什么。在这些情况下,它是设置@variable
的特定方法调用。否则它可以做任何事情,你需要阅读方法定义。
答案 1 :(得分:0)
@@variable
范围内self.variable
和main
之间的差异。我们可能知道,@@variable
是一个类变量。
@@variable
会将自己附加到self.class
的班级。主要类是Object
。
演示:
self # => main
self.class # => Object
@@variable = "variable"
self.class.class_variables # => [:@@variable]
object.class_variables # => [:@@variable]
请注意,这意味着每个对象都可以访问@@variable
。
String.class_variables # => [:@@variable]
并在顶层修改该变量也会改变所有对象的值。
self.variable
将提供NoMethodError
,因为它没有吸气剂或制定者。如果你要定义一个getter和setter,那么......
class Object
class << self
attr_accessor :variable
end
end
self.variable = "variable" # => "variable"
@@variable
和self.variable
之间的差异。 @@variable
将采用与上述相同的方式,除了现在而不是类Object
,我们将其应用于我们当前所在的任何课程。
但现在,self.variable
将应用于类实例变量。这是一种变量,在其他语言中最常被称为类变量或静态变量(即,只能访问该类,而不能访问其子类)。这与在班级最高级别@variable
相同。
class T
@some = "some"
class << self
attr_accessor :variable
end
self.variable = "variable"
end
T.instance_variables # => [:@some, :@variable]
@@variable
和self.variable
之间的差异。 @@variable
的行为如上所述 - 它仍然指的是我们定义方法的类。
但现在self.variable
指的是实例变量,而不是Class的实例。
class T
attr_accessor :variable
def initialize
self.variable = "variable"
end
end
instance = T.new
instance.instance_variables
instance.variable # => "variable"
在您的示例中,有5个变量(假设已创建正确的getter / setter):
@@variable
Object
main.variable
类实例main
的实例变量Object
@@variable
A
A.variable
A
@variable
。A
醇>