换行块以使用细化

时间:2015-08-28 10:25:31

标签: ruby refinements

鉴于以下改进:

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 个答案:

答案 0 :(得分:2)

您需要将using StringRefinement声明移出模块之外。

检查文档中的以下段落:

  

您只能在顶层激活优化,而不能在任何类,模块或方法范围内激活优化。

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