【问题标题】:How to include a module in a class如何在类中包含模块
【发布时间】:2018-03-24 15:20:49
【问题描述】:

我的 gem 中的一个模块包含在另一个 gem 的一个类中,该类由 Rails 应用程序中的自定义类扩展:

我的宝石:

module MyGem
    def my_method
    end
end
AnotherGem.send :include, MyGem

另一个宝石:

class AnotherGem
end

Rails 应用程序中的类:

class ClassInRailsApp < AnotherGem
end

运行它会导致以下行为:

$ rails c
Loading development environment (Rails 5.1.4)
irb(main):004:0> MyGem.method_defined? :my_method
=> true
irb(main):005:0> AnotherGem.method_defined? :my_method
=> true
irb(main):006:0> ClassInRailsApp.method_defined? :my_method
NoMethodError: undefined method `my_method' for ClassInRailsApp:Class

如何确保在扩展类之前包含我的模块?

编辑:

我尝试在ClassInRailsApp中直接包含MyGem,但指定的实例方法仍然不可用。问题可能与此有关吗?

【问题讨论】:

  • 您的示例代码实际上产生了true,所以我不确定您的问题是什么,确切地说。这应该可行,并且对我有用。

标签: ruby-on-rails ruby rubygems include autoload


【解决方案1】:

在您的想法中,您只是在调用一个方法,例如@object.my_method。实际上,您正在调用 Class 级别的方法,例如Object.my_method,但将其定义为实例级方法。做你正在尝试的正确方法是 Object.new.my_method,但是,不要这样做。

要调用这样的方法,您必须将其定义为类上的方法。请参阅this page,以获得更好的理解。特别是关于如何通过模块定义类级别方法的“常见习语”部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 2013-10-28
    • 2021-05-07
    • 1970-01-01
    • 2017-01-21
    • 2012-02-19
    • 2013-08-22
    • 2018-02-24
    相关资源
    最近更新 更多