Ruby未定义方法,但方法存在
我对ruby非常陌生,我正在创建一个CLI应用程序,但是我在Redu meat中遇到了一个未定义的方法错误,我差点被惹恼了。如果这个方法已经定义了,或者我是这么想的,我该如何定义它呢Ruby未定义方法,但方法存在,ruby,command-line-interface,Ruby,Command Line Interface,我对ruby非常陌生,我正在创建一个CLI应用程序,但是我在Redu meat中遇到了一个未定义的方法错误,我差点被惹恼了。如果这个方法已经定义了,或者我是这么想的,我该如何定义它呢 def menu puts "Are you interested in finding some delicious recipes?" puts "" puts "Enter yes or no" case (gets.chomp.downcase) when 'no'
def menu
puts "Are you interested in finding some delicious recipes?"
puts ""
puts "Enter yes or no"
case (gets.chomp.downcase)
when 'no'
puts "Aww you missed out on some yummy meals. Thank you for dropping by"
when 'yes'
puts "Great! Enter one of the following options (Red meat, Poultry, Seafood or Vegetarian)"
#case (gets.chomp.downcase)
input = gets.strip.downcase
if input = "red meat"
red_meat
end
else
puts "I'm sorry, are you hangry? Please try again"
puts ""
menu
end
def red_meat
puts "red meat recipe 1"
puts "red meat recipe 2"
puts "red meat recipe 3"
puts "red meat recipe 4"
end
错误
ERROR:
cli.rb:22:in `menu': undefined method `red_meat' for #<RecipesCli::CLI:0x00007fd941914228> (NoMethodError)
错误:
cli.rb:22:in'menu':未定义的#的方法'red_meat'(NoMethodError)
您需要首先定义您的方法,以便以后能够调用它。在菜单的内部或外部
方法
def红肉
推出“红肉食谱1”
推出“红肉食谱2”
推出“红肉食谱3”
推出“红肉食谱4”
结束
def菜单
“你有兴趣找到一些美味的食谱吗?”
放置“”
输入“是或否”
case(get.chomp.downcase)
什么时候“不”
写着“哦,你错过了一些美味的饭菜。谢谢你来拜访”
什么时候“是”
输入“太好了!输入以下选项之一(红肉、家禽、海鲜或素食)”
#case(get.chomp.downcase)
input=get.strip.downcase
如果输入=“红肉”
红肉
结束
其他的
写“对不起,你是机库吗?请再试一次”
放置“”
菜单
结束
结束
您需要首先定义您的方法,以便以后能够调用它。在菜单的内部或外部
方法
def红肉
推出“红肉食谱1”
推出“红肉食谱2”
推出“红肉食谱3”
推出“红肉食谱4”
结束
def菜单
“你有兴趣找到一些美味的食谱吗?”
放置“”
输入“是或否”
case(get.chomp.downcase)
什么时候“不”
写着“哦,你错过了一些美味的饭菜。谢谢你来拜访”
什么时候“是”
输入“太好了!输入以下选项之一(红肉、家禽、海鲜或素食)”
#case(get.chomp.downcase)
input=get.strip.downcase
如果输入=“红肉”
红肉
结束
其他的
写“对不起,你是机库吗?请再试一次”
放置“”
菜单
结束
结束
从代码的缩进中可以看到,读取肉的方法定义嵌套在菜单的方法定义中
这意味着只有在您第一次调用菜单时才会执行方法定义。(实际上,每次执行菜单
,它都会被执行,总是一次又一次地覆盖红肉
)
但是,由于方法定义位于第21行菜单的末尾,因此在第13行调用该方法时,还不会定义该方法
以下是一个简化的示例:
def菜单
红肉
红肉;结束
结束
菜单
#名称错误…
在调用之前将方法定义移动到时,它会起作用(简化示例):
def菜单
红肉;结束
红肉
结束
菜单
然而,我猜你并不是真的想在菜单中定义红肉
,所以你可能想要这样的东西:
def菜单
红肉
结束
红肉;结束
菜单
在定义菜单
之前,无需定义红肉
。毕竟,定义菜单
并不调用读肉
,只调用菜单
调用红肉
。因此,在调用菜单
之前,您需要确保定义了红肉
提示:如果使用具有自动代码格式的编辑器,您会立即看到def red_meat
相对于def menu
缩进,表示定义red_meat
嵌套在menu
的主体中
注意:代码中至少还有一个错误。从代码中的缩进可以看出,读取肉的方法定义嵌套在菜单的方法定义中
这意味着只有在您第一次调用菜单时才会执行方法定义。(实际上,每次执行菜单
,它都会被执行,总是一次又一次地覆盖红肉
)
但是,由于方法定义位于第21行菜单的末尾,因此在第13行调用该方法时,还不会定义该方法
以下是一个简化的示例:
def菜单
红肉
红肉;结束
结束
菜单
#名称错误…
在调用之前将方法定义移动到时,它会起作用(简化示例):
def菜单
红肉;结束
红肉
结束
菜单
然而,我猜你并不是真的想在菜单中定义红肉
,所以你可能想要这样的东西:
def菜单
红肉
结束
红肉;结束
菜单
在定义菜单
之前,无需定义红肉
。毕竟,定义菜单
并不调用读肉
,只调用菜单
调用红肉
。因此,在调用菜单
之前,您需要确保定义了红肉
提示:如果使用具有自动代码格式的编辑器,您会立即看到def red_meat
相对于def menu
缩进,表示定义red_meat
嵌套在menu
的主体中
注意:您的代码中至少还有一个错误。问题在于方法菜单
在红肉
的定义开始之前没有结束
语句,这就是引发异常的原因。显然,在定义这两个方法之前,您无法执行菜单
,但定义这两个方法的顺序并不重要。@CarySwoveland我认为缺少的结束
是一个复制粘贴错误,因为错误是