方法调用抛出一个未定义的方法"错误

时间:2013-09-14 18:09:28

标签: ruby

我使用代码

创建了一个方法
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)

2 个答案:

答案 0 :(得分:1)

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

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, ".")

答案 1 :(得分:0)

您获得的错误是Ruby解释代码的结果。您的代码包含一个包含类主体的类定义(在class和最终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)多个文件。但是,那是另一天的故事。