2017-09-19 19 views
0

は現在、私はこのようなモジュールがあります。モジュールでクラスメソッドを使用する方法はありますか?

module MyModule 
    def A 

    end 

    ..... 

end 

をし、私はクラスメソッドとしてその方法Aを使用したいモデルを持っています。しかし、事は私はそのメソッドが必要です。私がそれを拡張すると、私は他の不要なクラスメソッドを私のモデルに拡張しようとしています。そのため、私はこのようにモジュールを書き換えることなくMyModule.AのようなSTHを行うための方法があります:

module MyModule 
    def A 
    ... 
    end 

    def self.A 
    ... 
    end 

    ..... 

end 

それは私がそのように行う場合は自分自身を繰り返すの一種です。私はまだ、Railsでそれを行うより良い方法があると感じています。

+2

['module_function:A'](https://ruby-doc.org/core/Module.html#method-i-module_function):: _Sidenote:_あなたはすべきですメソッドを大文字にしない。あなたがそうすることを妨げるものは何もありませんが、Rubyは、 'Kernel#Integer'や家族のような、非常に特殊な場合に大文字の名前を使用するという規則を持っています。 – mudasobwa

+0

冷たい私の質問を別の投稿として返信してください。私はあなたの答えを受け入れることができますか? –

+0

'extend'はクラスのメソッドとしてモジュールのインスタンスメソッド(モジュールがインスタンスを持たないにもかかわらず、それらが呼び出されるものです)だけを持ち込みます。 'extend'はモジュールのクラスメソッドで何もしません(' include'もしません)。したがって、 'A'(それを' a'と呼ぶ)がモジュールの唯一のインスタンスメソッドである場合、何もしません。 –

答えて

5

使用Module#module_functionモジュール機能する単一の関数を作る:

module M 
    def m1; puts "m1"; end 
    def m2; puts "m2"; end 
    module_function :m2 
end 

か:

module M 
    def m1; puts "m1"; end 
module_function # from now on all functions are defined as module_functions 
    def m2; puts "m2"; end 
end 

M.m2 #⇒ "m2" 
M.m1 #⇒ NoMethodError: undefined method `m1' for M:Module 
1

はい、あなたは、あなたができるはずです、module_functionとしてそれを定義することができますモジュール名を使用してアクセスします。

例:

module Mod 
    def my_method 
    100 
    end 

    def self.my_method_1 
    200 
    end 
    module_function :my_method 
end 

Mod.my_method 
# => 100 
Mod.my_method_1 
# => 200 

注:module_functionに自己定義されたメソッドを追加する必要はありませんが、彼らは直接アクセス可能です。しかし、のメソッドは自己なしで定義する必要があります

関連する問題