Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby未定义方法,但方法存在_Ruby_Command Line Interface - Fatal编程技术网

Ruby未定义方法,但方法存在

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'

我对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'
      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我认为缺少的
结束
是一个复制粘贴错误,因为错误是