正如标题所说,
类定义中@var
和@@var
之间有什么区别?
另外,在定义方法时self.mymethod
和mymethod
之间有什么区别?
答案 0 :(得分:4)
@@ var是一个类变量,它在类和该类的所有实例之间共享。您可以从类方法和实例方法中访问此变量。
class C
@@a = 1
def self.m1 # define class method (this is similar to def C.m1, because self will evaluate to C in this context)
@@a
end
def m2 # define instance method
@@a
end
end
C.m1 # => 1
C.new.m2 # => 1
@var是类实例变量。通常,您可以从类方法访问此实例变量。
class C
@a = 1
def self.m1
@a
end
def m2
# no direct access to @a because in this context @a will refer to regular instance variable, not instance variable of an object that represent class C
end
end
C.m1 # => 1
这些变量可能令人困惑,您应该始终知道定义实例变量@...
的上下文 - 它可能在表示类的对象实例中定义,或者可能是常规对象的实例。 / p>
答案 1 :(得分:2)
self总是引用当前对象。检查以下例如: -
class Test
def test
puts "At the instance level, self is #{self}"
end
def self.test
puts "At the class level, self is #{self}"
end
end
Test.test
#=> At the class level, self is Test
Test.new.test
#=> At the instance level, self is #<Test:0x28190>
对象变量之所以如此命名是因为它们具有范围,并且是关联的 然后,可以从该对象内的任何其他方法访问当前object.an对象变量。
类变量对于存储与所有对象相关的信息特别有用 某一类。
答案 2 :(得分:1)
直观地说,实例变量用于跟踪每个对象的状态。另一方面,类变量用于跟踪类的所有实例的状态。例如。您可以使用@@ count来跟踪已经实例化的此类对象的数量,如下所示:
class User
@@count = 0
attr_reader :name
def initialize(name)
@@count += 1
@name = name
end
end
User.count为您提供到目前为止已实例化的用户数。
user = User.new('Peter')
将User.count增加1,user.name
返回Peter。