2015-07-22 4 views
0

В большинстве языков вы можете сделать что-то вроде следующего:Как получить доступ к переменным из расширенного класса в рубин

class a { 
    this.property = 'prop' 
} 

class b extends a { 
    puts this.property //prints 'prop' 
} 

Как это работает в рубин? Моя первоначальная мысль была чем-то вроде

class A 
    @property = 'prop' 
end 

class B < A 
    puts @property 
end 

Но это не работает. Ruby имеет ключевое слово self, но это похоже на то, что я могу сказать, чтобы оно было зарезервировано для методов. Могут ли классы наследовать переменные в рубине?

ответ

3

Да, они могут, и вот фрагмент, который показывает, как это сделать.

class A2 
    def initialize 
    @foo = 42 
    end 
end 

class B2 < A2 
    def print_foo 
    puts @foo 
    end 
end 

# Prints 42 
B2.new.print_foo 

Приведенный выше код определяет класс A2, с конструктором, который определяет и устанавливает переменную экземпляра @foo. Класс B2 расширяет A2 и определяет метод, который использует @foo.

Я думаю, что проблема с вашим кодом заключается в том, что @property не присвоено значение, так как присваивание не относится к методу, который вызывается в любой точке.

+0

gosh 7 секунд разницы lol https://cloudup.com/ckK-7TPgqBC –

1

Да. Вам нужно инициализировать переменные экземпляра в методе initialize.

Смотрите пример:

class A 
    attr_accessor :property 

    def initialize 
    self.property = 'prop' 
    end 
end 

class B < A 
end 

puts B.new.property # prints "prop" 
1

Переменные, начинающиеся с @ сигилой являются переменные экземпляра. Они принадлежат определенному экземпляру (т. Е. «Объект»).

У вас есть два объекта в коде, один объект - класс A, второй объект - класс B. Каждый из этих двух объектов имеет свои собственные переменные экземпляра.

A имеет переменную экземпляра под названием @property со значением 'prop'. B не имеет переменных экземпляра, однако неинициализированные переменные экземпляра оценивают до nil вместо того, чтобы создавать исключение, поэтому вы не получите ошибку, но она принимает значение nil.

Вы не можете наследовать переменные. Единственное, что вы можете наследовать в Ruby, являются методы:

class A 
    def self.property 
    'prop' 
    end 
end 

class B < A 
    puts property 
end 
# prop 

Рубин также имеет класс переменных, которые начинаются с @@ сигилы. Они являются общими для иерархии всего класса:

class A 
    @@property= 'prop' 
end 

class B < A 
    puts @@property 
end 
# prop 

Однако переменные класса почти никогда не используются в Ruby, из-за большого объема они имеют, почти как глобалов.

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