2

コードでメソッドを作成しました

def delayTime(time, intervalString)
  if time > 0  
    sleep(time / time)  
    puts intervalString  
    time -=1  
    delayTime(time, intervalString)  
  end  
end

しかし、私がそれを呼び出すと

delayTime(1, ".")  

それはエラーをスローします

`<class:Main>': undefined method 'delayTime' for Main:Class (NoMethodError)
4

2 に答える 2

0

発生しているエラーは、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) ようになると、望ましくない問題が発生する可能性があることに注意してください。しかし、それは別の日の話です。

于 2013-09-14T19:34:33.707 に答える