метапрограммирование ruby ​​- блок yield не работает в динамически добавленном методе - PullRequest
1 голос
/ 22 октября 2009

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 23 октября 2009

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

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 должен позволять блокам принимать и блокировать в качестве параметров. Но я не знаю, сработает ли это или даже разрешит условные блоки.

0 голосов
/ 23 октября 2009

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

...