2016-03-22 2 views
-1

Рассмотрим следующий код:Назначение не псевдонимами правильно

class Cattr 
    attr_accessor :attr 
    alias_method :a_attr, :attr 
    alias_method :a_attr=, :attr= 
    def attr ; a_attr ; end 
    def attr= value ; a_attr= value ; end 
end 
ca = Cattr.new 
#⇒ #<Cattr:0x000000018974b0> 
ca.attr 
#⇒ nil 
ca.attr = 42 
#⇒ 42 
ca.attr 
#⇒ nil 

Что? Проблема не с помощью метода наложения спектров, определяемого attr_accessor, альясинг поглотителя работает довольно отлично:

class Cattr 
    attr_accessor :attr 
    # alias_method :a_attr=, :attr= 
    alias_method :a_attr, :attr # still aliased 
    # def attr= value ; a_attr= value ; end 
    def attr ; a_attr ; end  # still aliased 
end 

ca = Cattr.new 
#⇒ #<Cattr:0x000000018974b0> 
ca.attr 
#⇒ nil 
ca.attr = 42 
#⇒ 42 
ca.attr 
#⇒ 42 # sic! 

Sidenote наложения attr? метода работает довольно тоже хорошо.

Мой вопрос будет: это известное рубиновое поведение (aliasing seters запрещено), или я пропускаю что-то очевидное?

+0

@ jörg-ш-Миттаг- Ну, отлично в настоящее время. Как этот вопрос является дубликом связанного? Пожалуйста, укажите на него ответ, который применим в качестве ответа на этот вопрос. – mudasobwa

ответ

2

Сетчатые методы требуют явных приемников. Ваш код:

def attr= value ; a_attr= value ; end 

не вызывает сеттер a_attr=; он присваивает значение локальной переменной a_attr.

Чтобы сделать то, что вы хотите, что вам нужно сделать:

def attr= value; self.a_attr= value; end 
+0

Спасибо. Еще одна вещь, которую я только что обнаружил, заключается в том, что сеттер ожидает единственный параметр. Будучи обернутым как «generic» '* args', это приводит к тому, что' [val] 'передается setter вместо' val'. – mudasobwa

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

  • Нет связанных вопросов^_^