【问题标题】:Why is kernel_required.rb in my stack trace?为什么 kernel_require.rb 在我的堆栈跟踪中?
【发布时间】:2013-05-18 12:28:16
【问题描述】:

我忘了把 end 这个词放在 if 语句的末尾, 并得到以下错误:

/home/***/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': **/home/****/Desktop/ruby/food_finder/lib/restaurant.rb:84: syntax error, unexpected end-of-input, expecting keyword_end (SyntaxError)**
    from /home/****/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /home/****/Desktop/ruby/food_finder/lib/guide.rb:1:in `<top (required)>'
    from /home/****/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from /home/****/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require'
    from init.rb:14:in `<main>'

我的代码没有错误:

def self.saved_restaurants
        # read the restaurant file
        restaurants = []
        if file_usable?
            file = File.new(@@filepath, 'r')

            file.each_line do |line|
                restaurants << Restaurant.new.import_line(line.chomp)
            end

            file.close
        **end** -- > forgotten end
        # return instances of restaurant
        return restaurants
    end

我的代码有错误:

def self.saved_restaurants
        # read the restaurant file
        restaurants = []
        if file_usable?
            file = File.new(@@filepath, 'r')

            file.each_line do |line|
                restaurants << Restaurant.new.import_line(line.chomp)
            end

            file.close
         -- > forgotten end
        # return instances of restaurant
        return restaurants
    end

我的问题是: 为什么我会收到与我的代码有关的错误? 像下面这样:

/home/***/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:45:in `require': 
  1. 这个错误是什么意思?

当我对 saved_restaurants 方法使用正确的语法时,我没有收到任何错误。

【问题讨论】:

    标签: ruby error-handling


    【解决方案1】:

    您的文件restaurant.rbguide.rb 中的方法调用require 读取,该方法在kernel_require.rb 中定义。在它的方法定义中,它有这部分:

    def require path
    
      ...
    
    rescue LoadError => load_error
    
      ...
    
      raise load_error
    end
    

    当您读取的文件中出现语法错误时,将引发 LoadError,该文件已获救,并将作为 require 的错误引发。

    【讨论】:

    • 谢谢..我现在明白了。
    • 现在,真正的问题是:为什么要这样做?我没有答案。
    • 它为什么设计成这样?有人吗?
    • 我刚刚问了一个问题。
    【解决方案2】:

    如果我理解正确,有一个名为 guide.rb 的文件:

    require restaurant
    

    基本上,require是一个在kernel_require.rb中实现的函数,其原型如下:

    require path
    

    这里的路径是 restaurant.rb 并且这个函数失败是因为 require 函数因为语法错误而无法加载 rb 文件。

    请记住,您正在查看调用堆栈,因此不应显示缺少 end 的函数,因为未调用该函数,而仅加载了 ruby​​ 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2014-07-27
      相关资源
      最近更新 更多