Переменная экземпляра в ruby - PullRequest
2 голосов
/ 13 декабря 2010
class Test
   def initialize
     @var = "125"
   end
   def testmethod
     puts @var
     puts "accessing me from child class"
   end
 end

class TestExtension < Test

  def method1
    puts @var = "One Hundred and twenty five"
    testmethod()
  end
end

t = Test.new
p = TestExtension.new
p.method1
t.testmethod

выход:

One Hundred and twenty five
One Hundred and twenty five
accessing me from child class
125
accessing me from child class

Мой вопрос заключается в том, что доступ к testmethod() в дочернем классе TestExtension приводит к доступу к этому значению @var, которое объявлено в классе TestExtension, вместо доступа к значению, которое объявлено в классе Test , Это правильно?

Ответы [ 2 ]

3 голосов
/ 13 декабря 2010

Краткий ответ:
Да

Чуть более длинный ответ:
Переменные экземпляра, как следует из их названия, для экземпляра .Для каждого объекта может быть только одна переменная с именем @var, независимо от того, какой класс имеет код для доступа к нему.

0 голосов
/ 14 декабря 2010

Это является правильным.

Как сказал Гарет, переменные экземпляра принадлежат экземплярам, ​​а не классам.

Если вы хотите, чтобы переменные принадлежали классам, вы можете использовать переменная экземпляра объекта класса (ошибочно, этот термин сложный, чтобы написать его правильно).

Короче говоря, все в Ruby является объектом, включая классы.В следующем примере Base и Derivative являются просто константами, которые содержат ссылку на объекты.Эти объекты представляют классы (та-да!).

С учетом этого факта мы можем сделать следующее:

class Base
  @var = 1

  def self.change(new_value)
    @var = new_value
  end

  def self.to_s
    "#{self.name}, @var = #{@var}"
  end  
end

class Derivative < Base; end

Derivative.change(2)

puts Base         # => Base, @var = 1
puts Derivative   # => Derivative, @var = 2
...