attr_accessor в method_missing - PullRequest
       8

attr_accessor в method_missing

1 голос
/ 09 марта 2012

Я очень новичок в Ruby и сейчас пытаюсь понять кое-что о метапрограммировании. Я хочу вернуть имя пропущенного метода:

class Numeric

  attr_accessor :method_name

  def method_missing(method_id)
    method_name = method_id.to_s
    self
  end

  def name
    method_name
  end

end

10.new_method.name #this should return new_method, but returns nil

1 Ответ

3 голосов
/ 09 марта 2012

Внутри вашего method_missing, method_name интерпретируется как локальная переменная, а не как метод мутатора method_missing=, который вы ожидаете. Если вы явно добавите получателя, вы получите то, что хотите:

def method_missing(method_id)
  self.method_name = method_id.to_s
  self
end

Кроме того, вы можете присвоить @method_name переменную экземпляра:

def method_missing(method_id)
  @method_name = method_id.to_s
  self
end

Макрос attr_accessor просто добавляет для вас два метода, поэтому attr_accessor :p является сокращением для этого:

def p
    @p
end
def p=(v)
    @p = v
end

Вы можете использовать базовую переменную экземпляра, когда хотите или нуждаетесь.

...