【问题标题】:Ruby undefined method but method existRuby未定义方法但方法存在
【发布时间】:2020-04-05 01:14:55
【问题描述】:

我对 ruby​​ 非常陌生,我正在创建一个 CLI 应用程序,但我收到 red_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)

【问题讨论】:

    标签: ruby command-line-interface


    【解决方案1】:

    您需要先定义您的方法,以便以后能够调用它。在您的 menu 方法内部或外部。

    def red_meat
        puts "red meat recipe 1"
        puts "red meat recipe 2"
        puts "red meat recipe 3"
        puts "red meat recipe 4"
    end 
    
    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
    end
    

    【讨论】:

    • 问题只是方法menured_meat的定义开始之前没有end语句,这就是引发异常的原因。显然你不能在定义两个方法之前执行menu,但是定义这两个方法的顺序并不重要。
    • @CarySwoveland 我认为缺少的end 是复制粘贴错误,因为如果是问题,返回的错误会有所不同。请亲自尝试,method definition order matters in Ruby
    【解决方案2】:

    从代码中的缩进可以看出,read_meat 的方法定义嵌套在menu 的方法定义

    这意味着方法定义只会在您第一次调用menu 时执行。 (实际上,每次你执行menu都会执行,总是一遍又一遍地覆盖red_meat

    但是,由于方法定义在第 21 行 menuend,所以在第 13 行调用该方法时还没有定义。

    这是一个简化的例子:

    def menu
      red_meat
    
      def red_meat; end
    end
    
    menu
    # NameError …
    

    当您将方法定义移到调用之前,它会起作用(简化示例):

    def menu
      def red_meat; end
    
      red_meat
    end
    
    menu
    

    但是,我猜您实际上并不是要在 menu 中定义 red_meat,所以您可能想要的是这样的:

    def menu
      red_meat
    end
    
    def red_meat; end
    
    menu
    

    在定义menu 之前无需定义red_meat。毕竟,定义menu 不会调用read_meat,只有调用 menu 调用red_meat。因此,您只需确保在 调用 menu 之前定义了 red_meat

    提示:如果您使用具有自动代码格式化功能的编辑器,您会立即看到def red_meat 相对于def menu 缩进,表明定义red_meat 嵌套在menu 的主体内.

    注意:您的代码中至少还有一个错误。

    【讨论】:

    • 我想知道您如何在这样的答案中获得 2 票反对。我认为它没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2012-03-13
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 2018-05-16
    相关资源
    最近更新 更多