ruby метапрограммирование - блок yield не работает в динамически добавляемом методе

Я работаю над расширением структуры NotAMock для заглушек методов в rspec и получения заглушек перейти к блоку методов.

код в этом Gist отлично работает, когда я пишу его самостоятельно (который сделан так, чтобы напоминать методы-заглушки NotAMock).

но когда я включаю код object.instance_eval... в структуру NotAMock, "block_given?" всегда возвращает false, и из-за этого я никогда не смогу заставить свою доходность работать. Метод добавлен правильно, и я могу вызвать заглушенный метод... но он не распознает блок, который я передаю методу, из заглушенной версии NotAMock.

Чтобы увидеть, как я включил этот код в структуру NotAMock, перейдите на мой клон NotAMock. и проверьте метод add_hook в приватных методах.

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


person Derick Bailey    schedule 22.10.2009    source источник


Ответы (2)


Я даже не уверен, что это возможно. Новые проки даже не распознают блоки.

proc = Proc.new do
  if block_given?
    yield
  else
    puts "Not in a block"
  end
end

proc.call { puts "In a block"} # => puts Not in a block

Предполагается, что Ruby 1.9 позволяет блокам принимать &block в качестве параметров. Но я не знаю, сработает ли это или даже позволит ли это условные блоки.

person EmFi    schedule 23.10.2009

Оказывается, проблема не связана с кодом, на который я ссылался... платформа NotAMock выполняет дополнительное переопределение метода, которое вызывает мою проблему. Я сузил проблему до одной конкретной строки кода и сейчас разрабатываю, как ее исправить.

person Derick Bailey    schedule 23.10.2009