2012-02-07 1 views

ответ

2

самоуправления всегда относится к текущему object.Check следующим Eg: -

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

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

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 

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

1

В интуитивных терминах экземпляры vars используются для отслеживания состояния каждого объекта. С другой стороны, переменные класса используются для отслеживания состояния всех экземпляров класса. Например. Вы можете использовать @@ подсчитывать, чтобы следить за количеством этого класса объектов, которые были реализованным, например, так:

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 возвращает Peter.

Смежные вопросы