Обернуть блок для использования уточнения
Учитывая следующее уточнение:
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