Ruby新手,@ var和@@ var在一个类中有什么区别

时间:2012-02-07 13:17:22

标签: ruby

正如标题所说,

类定义中@var@@var之间有什么区别? 另外,在定义方法时self.mymethodmymethod之间有什么区别?

3 个答案:

答案 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。