Руби новичок, в чем разница между @var и @@ var в классе - PullRequest
0 голосов
/ 07 февраля 2012

, как следует из названия,

В чем разница между @var и @@var в определении класса? Кроме того, в чем разница между self.mymethod и mymethod в определении метода?

Ответы [ 3 ]

4 голосов
/ 07 февраля 2012

@@ 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

Эти переменные могут сбивать с толку, и вы всегда должны знать контекст, в котором вы определяете переменную экземпляра @... - она ​​может быть определена в экземпляре объекта, который представляет класс, или может быть экземпляром обычного объекта.

2 голосов
/ 07 февраля 2012

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 становится доступной из любого другого метода внутри этого объекта.

Переменные класса особенно полезны для хранения информации, относящейся ко всем объектам определенного класса.

1 голос
/ 07 февраля 2012

В интуитивно понятном виде переменные экземпляра используются для отслеживания состояния каждого объекта.С другой стороны, переменные класса используются для отслеживания состояния всех экземпляров класса.Например, вы можете использовать @@ 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 на единицу и user.name возвращает Питера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...