2015-03-23 4 views
0

У меня есть этот код с определением класса:Instance доступ к переменному в Рубине

class Test 
    attr_accessor :state 

    @state = 4 

    def check_state 
    puts "state is #{@state}" 
    end 
end 

obj = Test.new 
obj.check_state 

Там нет выхода из переменного экземпляра значения.

Но если я вызову obj.state = 4 до obj.check_state, я получу «состояние 4».

Почему?

Спасибо.

ответ

1

В вашем текущем коде вы определяете переменную экземпляра в классе класса, а не в экземплярах Test. То есть вы можете получить к нему доступ методом класса:

class Test 
    @state = 4 
    def self.state 
    @state 
    end 
end 

# Test.state 
# => 4 

Но это не то, что вы хотите здесь; вы не хотите, чтобы это значение присутствовало в вашем классе, вы хотите, чтобы он присутствовал для каждого экземпляра вашего класса. Для инициализации переменных экземпляра на экземпляры классов, вы должны предоставить конструктор:

class Test 
    attr_accessor :state 

    def initialize 
    @state = 4 
    end 

    def check_state 
    puts "state is #{@state}" 
    end 
end 

# Test.new.state 
# => 4 
+0

поэтому единственное различие между переменной экземпляра и переменной экземпляра класса, это один внутри метода экземпляра, а другой внешний метод экземпляра? – totally

+0

Kinda. Классы - это сами экземпляры, и как таковые могут иметь переменные экземпляра. Существуют также переменные класса (например, '@@ state'), но они ведут себя по-разному наследование WRT. –

+0

Нет никакой разницы между переменными экземпляра и переменными экземпляра класса, потому что нет такой вещи, как переменная экземпляра класса. Классы - это объекты, подобные любому другому объекту, поэтому они могут иметь переменные экземпляра, как и любой другой объект. В этом нет ничего особенного или иного. –

-1

переменную собственного (текущий объект) внутри определения класса является класс сам объект не является объектом приемника. self - ресивер (obj), только внутри метод определение.

https://www.youtube.com/watch?v=X2sgQ38UDVY на 48-й минуте ...

class Test 
     attr_accessor :state 
     puts self.inspect 
     @state = 4 
     def check_state  
     puts "state is #{@state}"  
     puts self.inspect 
     end 
    end 
    obj = Test.new 
    obj.state=4 
    obj.check_state 
Смежные вопросы