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
は私が見ていたし、このことについて何かを見つけることができませんでした:
- はNoMethodError when trying to access method defined in included module
- クラスhttps://bugs.ruby-lang.org/issues/11665 に関係が含まれてに関し
- が奇妙に見えるAccess a Ruby module's method within same module
ありがとうございます。つまり、 'say_id(id)'を 'self.say_id(id)'に変更するだけでコードの一部が動作します。あなたは "インスタンスメソッド"について読むことを指すことができる場所はありますか? –
確かに、ここに例えば、場所の植樹があります:http://culttt.com/2015/06/10/understanding-class-methods-verses-instance-methods-in-ruby/ ところで - 別のメソッドの中でメソッドを宣言しないようにすべきです(私は 'say_id'を参照しています)。私はあなたの正しい定義を見ることができるように私の答えを1分で編集します。 – djaszczurowski
Jordon、Rubyがモジュールを解析するとき 'self'は' HowToBasic'と等しくなります。したがって、 'def self.say_id(id)'は 'def HowToBasic.say_id(id)'と同じです。 'self'は、クラスメソッドの定義ではなく、オブジェクトの実際の名前(実際にはモジュールオブジェクト)を使用するのが普通です。 'self'を使う理由の一つは、モジュールの名前を変更した場合、モジュールメソッドの定義を変更する必要がないということです。 (これはクラスがモジュールであるため、クラスにも当てはまります)モジュールのシングルトンクラスでモジュールメソッドを定義することもできますが、これは別の日のレッスンです。 –