我使用代码
创建了一个方法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)
答案 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
)多个文件。但是,那是另一天的故事。