小编And*_*ini的帖子

将ruby类转换为模块而不是使用细化的更好方法?

Module#refine method接受一个类和一个块并返回一个细化模块,所以我想我可以定义:

class Class
  def include_refined(klass)
    _refinement = Module.new do
      include refine(klass) {
        yield if block_given?
      }
    end
    self.send :include, _refinement
  end
end
Run Code Online (Sandbox Code Playgroud)

并且以下测试通过

class Base
  def foo
    "foo"
  end
end

class Receiver
  include_refined(Base) {
    def foo
      "refined " + super
    end
  }
end

describe Receiver do
  it { should respond_to(:foo) }
  its(:foo) { should eq("refined foo") }
end
Run Code Online (Sandbox Code Playgroud)

因此,使用细化,我可以将类转换为模块,动态改进其行为,并将其包含在其他类中.

  • 是否有一种更简单的方法可以将类转换为Ruby中的模块(比如ruby <2)?
  • rb_mod_refine的C实现中 我们看到了

    refinement = rb_module_new();
    RCLASS_SET_SUPER(refinement, klass);
    
    Run Code Online (Sandbox Code Playgroud)

    这只是将精炼的超类设置为klass复制模块中的类的实现吗?

  • 我知道多重继承是通过模块完成的,但是社区会怎么想Class#include_refined?从改进中提取这个方面是否合理?在本地"修补"而不是使用"使用"开关激活优化?

ruby ruby-2.0 refinements

25
推荐指数
1
解决办法
1625
查看次数

标签 统计

refinements ×1

ruby ×1

ruby-2.0 ×1