発生しているエラーは、Ruby がコードを解釈する方法の結果です。コードは、クラス本体 (class
と finalの間end
) を含むクラス定義で構成されます。
クラス本体は、Ruby インタープリターがファイルをロードするときに 1 回実行されます。インタプリタが本文を処理する際に、さまざまなステートメントが実行されます。目的の呼び出しにdelayTime
遭遇したとき、そのメソッドはまだ定義されていません。
これに対処するには、いくつかの方法があります。まず、クラス本体のコードをロード時に実行するのではなく、クラス (インスタンスまたはクラス自体) でメソッドを呼び出すときに実行する必要がある場合があります。
これは、ロジックをメソッド内にラップすることで実現できます。
class Main
def execute
...
delayTime
...
end
def delayTime
...
end
end
Main.new.execute # Instantiate the class and execute the wanted method
ただし、読み込み時にコードを実行し、定義されたメソッドを呼び出したい場合は、いくつかの変更を加える必要があります。まず、呼び出し元のコードが実行される前にメソッドを定義する必要があります (ロード時、覚えておいてください)。呼び出しコードの前に定義するだけでなく、必ずクラス メソッドとして定義する必要があります (メソッドの前に を付けるか、クラス定義を構文でself.
開き、そこでメソッドを定義します)。class << self ... end
これは、クラス本体が実行されるときにクラスのインスタンスがわからないため必要です。鶏と卵の状況。
変更されたバージョンは次のようになります。
class Main
def self.delayTime
...
end
...
self.delayTime # Could also be called as Main.delayTime
....
end
最後に、クラス定義を開いた例を示します。
class Main
class << self
def delayTime
...
end
end
...
self.delayTime # Could also be called as Main.delayTime
....
end
ただし、クラス本体自体にロジックを配置すると、プログラムが単一のファイルを超えて成長し、複数のファイルを含める ( require
/ load
) ようになると、望ましくない問題が発生する可能性があることに注意してください。しかし、それは別の日の話です。