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

你必须像下面这样打电话:

Main.new.delayTime(1, ".")

delayTime是您的类的实例方法Main。所以接收者应该是类的一个实例Main。查看您的错误,我确定您将其称为Main.delayTime. 但你不能这样称呼它。如果你想调用它Main.delayTime,那么你需要定义你的方法如下:

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

已更正

class Main
  #Variables
  name = ""
  answer_wonder = ""
  answer_math = ""
  result_math = 0
  #End of Variables
def self.delayTime(time, intervalString)
    if time > 0
      sleep(time / time)
      puts intervalString
      time -=1
      delayTime(time, intervalString)
    end
end
end #Class end

Main.delayTime(1, ".")
于 2013-09-14T18:36:12.227 回答
0

您得到的错误是 Ruby 如何解释代码的结果。您的代码包含一个类定义和一个包含的类主体(介于class和 final之间end)。

当 Ruby 解释器加载文件时,类主体执行一次。当解释器处理正文时,会执行各种语句。当遇到想要的调用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 回答