【问题标题】:Extending a class defined in a gem [duplicate]扩展gem中定义的类[重复]
【发布时间】:2017-07-04 02:27:52
【问题描述】:

假设我有一个假设的 gem,my_gem,它定义了类 AwesomeClass,并且 gem 包含一个二进制文件,AwesomeClass 上工作,但 在我的lib/ 目录中加载任何代码,比如说。我想干净地扩展一些类的方法,有时调用相当于super

假设它看起来像这样:

    class AwesomeClass
      def cool_method
       ...
      end
    end

在这里,在我的库代码中,我想做一些类似的事情:

    AwesomeClass.class_eval
      def cool_method
       (call the original method here)
       ...
      end
    end

你会怎么做? alias 是我唯一真正的选择吗?我错过了一些更好的方法吗? class_eval以外的东西?

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    别名是我唯一真正的选择吗?

    是的,如果你想打开并直接修改一个类。但是,更好的选择是打开第 3 方课程并对其进行猴子修补。您应该使用继承或组合:构建您自己的类来包装AwesomeClass 的实例,提供自己的cool_method 调用AwesomeClass 方法以及您需要的任何其他功能。

    【讨论】:

    • 如果 gem 只需要 AwesomeClass 而不是我自己的,你会如何看待它?
    • @DanielBogan 然后 Gem 构建不正确,这不是 Ruby 类型系统的工作方式。只要您的对象支持与AwesomeClass 相同的方法调用,gem 就不能拒绝它。
    • 是的,这是有道理的。好的,拉德,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2014-06-12
    • 2011-05-12
    相关资源
    最近更新 更多