【问题标题】:Why doesn't relative_require work on Ruby 1.8.6?为什么 relative_require 在 Ruby 1.8.6 上不起作用?
【发布时间】:2011-02-10 11:34:26
【问题描述】:

我正在 Windows 7 上学习 Ruby(使用 1.8.6 版)。

当我尝试运行下面的 stock_stats.rb 程序时,我收到以下错误:

C:\Users\Will\Desktop\ruby>ruby stock_stats.rb
stock_stats.rb:1: undefined method `require_relative' for main:Object (NoMethodE
rror)

我有三个 v.small 代码文件:

stock_stats.rb

require_relative 'csv_reader'

reader = CsvReader.new

ARGV.each do |csv_file_name|
  STDERR.puts "Processing #{csv_file_name}"
  reader.read_in_csv_data(csv_file_name)
end

puts "Total value = #{reader.total_value_in_stock}"

csv_reader.rb

require 'csv' 
require_relative 'book_in_stock'

class CsvReader

  def initialize
    @books_in_stock = []
  end

  def read_in_csv_data(csv_file_name)
    CSV.foreach(csv_file_name, headers: true) do |row|
      @books_in_stock << BookInStock.new(row["ISBN"], row["Amount"])
    end
  end  

  # later we'll see how to use inject to sum a collection
  def total_value_in_stock
    sum = 0.0        
    @books_in_stock.each {|book| sum += book.price}
    sum
  end  

  def number_of_each_isbn
    # ...
  end

end       

book_in_stock.rb

require 'csv' 
require_relative 'book_in_stock'

class CsvReader

  def initialize
    @books_in_stock = []
  end

  def read_in_csv_data(csv_file_name)
    CSV.foreach(csv_file_name, headers: true) do |row|
      @books_in_stock << BookInStock.new(row["ISBN"], row["Amount"])
    end
  end  

  # later we'll see how to use inject to sum a collection
  def total_value_in_stock
    sum = 0.0        
    @books_in_stock.each {|book| sum += book.price}
    sum
  end  

  def number_of_each_isbn
    # ...
  end

end       

提前感谢您的帮助。

【问题讨论】:

  • 这是 Pickaxe 书第 3 章的代码!

标签: ruby require


【解决方案1】:

require_relative 在您的 Ruby 版本中不存在。您可以升级 Ruby,安装 backports gem 和 require 'backports/1.9.1/kernel/require/relative',但最简单的解决方法是将您的要求更改为:

require File.join(File.dirname(__FILE__), 'csv_reader')

【讨论】:

  • 感谢 Shanna,非常感谢您的建议
  • 建议使用require File.expand_path('another_file', __FILE__),如果您需要加载'../csv_reader',它可以很好地解析父目录
【解决方案2】:

编辑:

在问这个问题的时候,它指的是没有require_relative 的Ruby 1.8.6。到目前为止,Ruby 1.8.6 已经过时,不应该再使用了。

原文:

根本没有方法名称require_relative。你也可以在那里使用require

require_relative 函数包含在 Ruby 核心库的扩展项目中,可在此处找到:http://www.rubyforge.org/projects/extensions

您应该可以使用gem install extensions 安装它们。 然后在您的代码中在require_relative 之前添加以下行:

require 'extensions/all'

【讨论】:

  • 有,但仅在 1.9 中。
  • @molf:我只是在寻找指定的版本。
  • 非常感谢,我已经安装了较新版本的 Ruby,它可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 2011-02-22
  • 1970-01-01
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
相关资源
最近更新 更多