2016-03-26 3 views
0

Я понимаю, что в Ruby ключ attr_accessor просто создает методы getter/setter. Например,Attr_accessor в Node Class

attr_accessor :data

def data=(value) 
    @data = value 
end 

def data 
    @data 
end 

Так что, если бы это было так, для Node класса, почему бы мне нужно создать initialize метод?

Ex:

def initialize(data, next_node) 
@data = data; 
@next_node = next_node; 

Не могу я просто пишу att_accessor :data, next_node?

+0

Это, скорее всего, приведет к самоуверенному ответу - конструкторы используются для определения интерфейса для вашего класса, то есть данных, которые необходимо создать. Только вы можете действительно определить, что должен сделать этот конструктор, с кем и с чем он работает. – Anthony

ответ

0

С initialize методом вы можете написать:

node = Node.new('foo', node) 

Без (и только с attr_accessor), вы должны написать:

node = Node.new 
node.data = 'foo' 
node.next_node = node 

Чтобы ответить на ваш вопрос: Там нет необходимости для initialize но было бы удобнее использовать.

+2

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

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