2016-11-28 3 views
1

以下のコードは私にNoMethodErrorを与えます。私はなぜそれが私にエラーを与えるのか、なぜ私はモジュール内のメソッドのネストについて何も見つけることができないのですか少し混乱しています。誰かがなぜこれがうまくいかないのか説明してもらえますか?モジュールで "defs"を入れ子にすることはできますか?NoMethodErrorが同じモジュール内の "ネストされたメソッド"(またはdef)にアクセスしようとしています

module HowToBasic 
    module_function 

    def say_id_and_say_name(id) 

    # nested method 
    def say_id(id) 
     p id 
    end 

    # errors here with `say_id_and_say_name': 
    # undefined method `say_id' for HowToBasic:Module (NoMethodError) 
    # from teststuff.rb:24:in `<main>' 
    say_id(id) 
    end 

end 

HowToBasic.say_id_and_say_name("99999") 

バージョン: ルビー2.3.1p112

は私が見ていたし、このことについて何かを見つけることができませんでした:

答えて

4

メソッド定義にキーワードがありません。say_id_and_say_nameは単なるインスタンスメソッドなので、Moduleで呼び出すことはできません。

module HowToBasic 
    module_function 

    def self.say_id(id) 
    p id 
    end 

    def self.say_id_and_say_name(id)  
    say_id(id) 
    end  
end 

HowToBasic.say_id_and_say_name("99999") 
+0

ありがとうございます。つまり、 'say_id(id)'を 'self.say_id(id)'に変更するだけでコードの一部が動作します。あなたは "インスタンスメソッド"について読むことを指すことができる場所はありますか? –

+0

確かに、ここに例えば、場所の植樹があります:http://culttt.com/2015/06/10/understanding-class-methods-verses-instance-methods-in-ruby/ ところで - 別のメソッドの中でメソッドを宣言しないようにすべきです(私は 'say_id'を参照しています)。私はあなたの正しい定義を見ることができるように私の答えを1分で編集します。 – djaszczurowski

+1

Jordon、Rubyがモジュールを解析するとき 'self'は' HowToBasic'と等しくなります。したがって、 'def self.say_id(id)'は 'def HowToBasic.say_id(id)'と同じです。 'self'は、クラスメソッドの定義ではなく、オブジェクトの実際の名前(実際にはモジュールオブジェクト)を使用するのが普通です。 'self'を使う理由の一つは、モジュールの名前を変更した場合、モジュールメソッドの定義を変更する必要がないということです。 (これはクラスがモジュールであるため、クラスにも当てはまります)モジュールのシングルトンクラスでモジュールメソッドを定義することもできますが、これは別の日のレッスンです。 –

関連する問題