2010-04-21 30 views
17

tôi đang học Ruby (sử dụng phiên bản 1.8.6) trên Windows 7.Tại sao doesnt relative_require không hoạt động trên Ruby 1.8.6?

Khi tôi cố gắng chạy chương trình stock_stats.rb dưới đây, tôi nhận được lỗi sau:

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

tôi có ba file mã 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  

Cảm ơn trước sự giúp đỡ nào.

+2

Đó là mã từ chương 3 trên sổ Pickaxe! –

Trả lời

11

Edit:

Quay trở lại những ngày mà câu hỏi này đã được hỏi nó gọi Ruby 1.8.6 nơi không có require_relative. Bởi bây giờ Ruby 1.8.6 đã lỗi thời và không nên được sử dụng nữa.

gốc:

Có chỉ đơn giản là không có tên phương pháp require_relative. Bạn có thể sử dụng require ở đó.

Chức năng require_relative được bao gồm trong một dự án mở rộng của thư viện lõi Ruby, tìm thấy ở đây: http://www.rubyforge.org/projects/extensions

Bạn sẽ có thể cài đặt chúng với gem install extensions. Sau đó, trong mã của bạn thêm dòng sau đây trước khi require_relative:

require 'extensions/all' 
+12

Có, nhưng chỉ ở mức 1.9. – molf

+0

@molf: Tôi chỉ đang tìm phiên bản được chỉ định. – Aurril

+0

Cảm ơn rất nhiều, tôi đã cài đặt phiên bản mới hơn của Ruby và nó hoạt động. – WANNABE

34

require_relative không tồn tại trong các phiên bản của Ruby. Bạn có thể nâng cấp Ruby, cài đặt backports đá quý và require 'backports/1.9.1/kernel/require/relative' nhưng việc sửa chữa đơn giản nhất sẽ thay đổi yêu cầu của bạn để:

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

Cảm ơn Shanna, thực sự đánh giá cao lời khuyên của bạn – WANNABE

+1

đề nghị sử dụng 'yêu cầu File.expand_path ('another_file', __FILE __)' có thể giải quyết tốt thư mục mẹ nếu bạn cần tải ''../ csv_reader'' – huocp

Các vấn đề liên quan