ruby - 模块同时扩展和包含?

标签 ruby dsl

我正在扩展一个类以接受 DSL。实例应始终以默认值进行响应,但代码可能会更改。当我调用 who_am_i 时,下面的代码工作正常,它设置了 i_am 方法,但我不知道如何设置默认方法。

module Helper
  def i_am
    "Default code"
  end
  def who_am_i
    class_eval(<<-EOS, __FILE__, __LINE__ + 1)
      def i_am
        "This was executed in class: \#{self.class.to_s}"
      end
  EOS
  end
end

class Test
  extend Helper
end

t = Test.new
t.i_am

我可以通过这样做来完成这项工作:

class Test2
  extend Helper
  include Helper
end

t2 = Test2.new
t2.i_am

但这看起来很奇怪。想法?

最佳答案

您需要使用包含的方法/ Hook 。每次给定模块包含到其他类或模块中时都会运行它,并以此类或模块为参数。根据您的情况,您想要:

module Helper
  def i_am
    "Default code"
  end

  def self.included mod
    mod.extend ClassMethods
  end

  module ClassMethods
    def who_am_i
      class_eval(<<-EOS, __FILE__, __LINE__ + 1)
        def i_am
          "This was executed in class: \#{self.class.to_s}"
        end
    EOS
    end
  end
end

class Tester
  include Helper
end

关于ruby - 模块同时扩展和包含?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181581/

相关文章:

c++ - 在 C++ 项目中使用特定领域的语言文件

antlr - 使用 ANTLR4 设计灵活语言应用程序的一般策略

javascript - 临时全局变量/函数和原型(prototype)重写来编写 JS DSL

ruby - 当 Net::ReadTimeout 错误发生时, capybara 不会关闭浏览器

ruby - UTC 时间重置为 2000-01-01( ruby )。如何防止时间重置?

dsl - Xtext - 如何在自己的语法中使用 "import"

elasticsearch - 术语字段汇总

ruby-on-rails - "Gamification" gem ?

ruby-on-rails - 如何在 rake 多任务中传递不同的参数

java - 我可以添加到 JRuby/Rails 项目的 Java 功能示例是什么?