Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何引用模块方法而不引用整个命名空间?_Ruby_Ruby On Rails 3.2 - Fatal编程技术网

Ruby 如何引用模块方法而不引用整个命名空间?

Ruby 如何引用模块方法而不引用整个命名空间?,ruby,ruby-on-rails-3.2,Ruby,Ruby On Rails 3.2,我有一个模块定义为: module MyApp module Utility def Utility.my_method 我想在其他几个类中使用该方法。但我不想打电话: MyApp::Utility.my_method 我宁愿打电话: Utility.my_method 这合理吗?我尝试了包含MyApp::Utility和包含MyApp,但没有成功。下面是一个将my_方法与类混合的示例: #myapp.rb module MyApp module Utility d

我有一个模块定义为:

module MyApp
  module Utility
    def Utility.my_method
我想在其他几个类中使用该方法。但我不想打电话:

MyApp::Utility.my_method
我宁愿打电话:

Utility.my_method

这合理吗?我尝试了
包含MyApp::Utility
包含MyApp
,但没有成功。

下面是一个将my_方法与类混合的示例:

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

听起来您希望在mixed-in方法上维护模块的名称空间。我见过这样做的尝试,但看起来相当混乱

如果需要my_方法具有名称空间,只需在方法名称中包含模块标识符即可:

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

那么,只需指定您想要的任何别名,例如:

ShortNameGoesHere = MyApp::Utility
ShortNameGoesHere.my_method

相关的<代码>包含MyApp在Ruby 1.9.3中适用于我。然后我可以调用Utility.my_方法。但此处不使用Rails。当您包含模块时,其方法将成为对象的实例方法,因此您只需执行
包含MyApp::Utility
,然后执行
我的方法
而不是
实用程序。我的方法
在1.9.3中拒绝在类中工作。假设我的类名是MyClass,我最终会出现错误“未定义的常量MyClass::Utility。这应该没那么难。你是在尝试混入类方法还是实例方法?我希望它是类方法,但我已经尝试了两种方法。有关混入实例方法的示例,请参阅更新的答案。至于混合类内方法,请看
ShortNameGoesHere = MyApp::Utility
ShortNameGoesHere.my_method