Обернуть блок для использования уточнения

Учитывая следующее уточнение:

module StringRefinement
  refine String do
    def bar
      length
    end
  end
end

Я хочу реализовать модуль для выполнения блоков, используя мое уточнение:

module Demo
  using StringRefinement

  def self.wrap(*args, &block)
    instance_eval(&block)
  end
end

И теперь я должен быть в состоянии использовать это так:

Demo.wrap { puts "some text".bar }

Который не работает:-(

Я играл с привязкой блока, yield, context, singleton_class... но я все еще не могу заставить это работать. Как мне это сделать?

1 ответ

Решение

Вы должны переместить using StringRefinement заявление за пределами вашего модуля.

Проверьте следующий абзац из документов:

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

http://ruby-doc.org/core-2.1.1/doc/syntax/refinements_rdoc.html

Другие вопросы по тегам