【问题标题】:How can I refer to a module method without referring to the entire namespace?如何在不引用整个命名空间的情况下引用模块方法?
【发布时间】:2012-12-15 18:44:42
【问题描述】:

我有一个模块定义为:

module MyApp
  module Utility
    def Utility.my_method

我想在其他几个类中使用该方法。但我不想打电话:

MyApp::Utility.my_method

我宁愿打电话:

Utility.my_method

这样合理吗?我试过include MyApp::Utilityinclude MyApp 无济于事。

【问题讨论】:

  • include MyApp 在 Ruby 1.9.3 中为我工作。然后我可以调用 Utility.my_method。不过这里没有使用 Rails。
  • 当你包含一个模块时,它的方法变成了对象的实例方法,所以你可以只做include MyApp::Utility然后my_method而不是Utility.my_method

标签: ruby ruby-on-rails-3.2


【解决方案1】:

这是一个将 my_method 混合到一个类中的示例:

#myapp.rb
module MyApp
  module Utility
    def my_method
      "called my_method"
    end
  end
end

#test.rb
require './myapp'
class MyClass
  include MyApp::Utility
end

if __FILE__ == $0 then
  m = MyClass.new
  puts m.my_method
end

听起来你想在混合方法上维护模块的命名空间。我已经看到有人尝试这样做(https://stackoverflow.com/a/7575460/149212),但看起来很混乱。

如果您需要对 my_method 进行命名空间,您可以简单地在方法名称中包含一个模块标识符:

module MyApp
  module Utility
    def util_my_method
      "called my_method"
    end
  end
end

【讨论】:

  • 它拒绝在 1.9.3 的类中工作。假设我的类名是 MyClass,我最终得到错误“未定义的常量 MyClass::Utility。它不应该这么难。
  • 你是想混入类方法还是实例方法?
  • 我希望它是一个类方法,但我已经尝试了两种方式。
  • 查看更新的答案以获取在实例方法中混合的示例。至于混入类方法,也许看看stackoverflow.com/questions/10692961/…
【解决方案2】:

好吧,只需分配您想要的任何别名,例如:

ShortNameGoesHere = MyApp::Utility
ShortNameGoesHere.my_method

【讨论】:

    猜你喜欢
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2011-11-09
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多