2016-05-24 3 views
0

Не понимаю, почему атрибуты 'attributes =' внутри инициализации должны иметь префикс self.Зачем нужен явный я внутри инициализации() ruby ​​

'имя' метод не должен иметь префикс себя называть 'атрибуты' метод

class A 
attr_accessor :attributes 

    def initialize attrs ={} 
    self.attributes = attrs 
    end 

    def name 
    puts attributes 
    end 
end 

a = {"name" => "someone"} 
b = A.new a 

b.name 

выход { "имя" => "кто-то"}

если self.attributes = attrs изменение attributes = attrs output gonna be nil

+0

Все это зависит от того, как Ruby видит 'attributes =' в теле вашего метода 'initialize'. Без 'self', чтобы заставить его быть вызовом метода, он часто интерпретируется как назначение переменной. – tadman

+0

Не «часто». * Всегда * 'foo = bar' * всегда * присваивает локальной переменной с именем' foo'. Фактически, именно так Ruby различает локальные ссылки на переменные и вызовы методов: 'foo' является ссылкой на локальную переменную тогда и только тогда, когда раньше было проанализировано присвоение' foo = bar'. –

ответ

1

Если вы используете attributes = attrs, вы просто присвойте attrs локальной переменной attributes так же, как вы могли бы назначить attrs до some_other_var. При добавлении attributes с номером self. вы указываете, что необходимо использовать аксессор.

+0

Я думал, что атрибуты = определены attr_accessor, как объяснить def name puts attributes end. – helloyi621

+0

Вызов метода access 'attributes' выполняет поиск, сначала, если есть локально переменная с именем' attributes', если она не ищет метод экземпляра с именем 'attributes', в этом случае он найдет его так, как вы определили это с 'attr_accessor'. Для назначения с атрибутами = 'нет способа различать локальное назначение переменной и метод установки экземпляра, поэтому вам необходимо устранить его с помощью' self.attributes = ' – maartenvanvliet

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