неопределенная локальная переменная или метод из & block при вызове метода экземпляра - PullRequest
1 голос
/ 09 июня 2019

Я получаю undefined local variable or method ошибку.

class MyClass
  def initialize(my_value, &if_undefine_method)
      @my_value = my_value
      @a = if_undefine_method
   end

  def method_missing(m, *args, &block)
     @a.call
  end

  def my_method_to_call_from_block
     'HELLO'
  end
end

a = MyClass.new("some_value") do
     my_method_to_call_from_block
end

Когда я вызываю отсутствующий метод:

a.a_method_that_does_not_exist

, вызывается method_missing, но яполучить сообщение об ошибке:

Traceback (последний последний вызов): 3: from (irb): 17 2: from lib / myruby.rb: 22: блок method_missing' 1: from (irb):16:in в irb_binding 'NameError (неопределенная локальная переменная или метод my_method_to_call_from_block для main: Object)

Как мне ссылаться на метод экземпляра из блока, который я передаю, чтобы предотвратить ошибку?

1 Ответ

2 голосов
/ 10 июня 2019

Блок не является частью MyClass, у него есть собственный self, который не имеет метода my_method_to_call_from_block.Использование @a.call изнутри метода MyClass ничем не отличается от вызова блока где-либо еще .

Если вы хотите, чтобы блок выполнялся с self, установленным на ваш экземпляриз MyClass, вам нужно instance_eval:

def method_missing(m, *args, &block)
   instance_eval &@a
end

Учитывайте разницу:

class MyClass
  def initialize(&block)
      @block = block
   end

  def default_self
    @block.call
  end

  def myclass_self
    instance_eval &@block
  end
end


a = MyClass.new do
  p self
end

a.default_self # main

a.myclass_self # <MyClass:0x00007f8da68da348 @block=#<Proc:0x00007f8da68da320@test.rb:16>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...