2010-04-21 7 views
17

Ich lerne Rubin (mit Version 1.8.6) auf 7. WindowsWarum funktioniert related_require nicht in Ruby 1.8.6?

Wenn ich unter den stock_stats.rb Programm auszuführen versuchen, erhalte ich die folgende Fehlermeldung:

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

I haben drei v.small Code-Dateien:

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  

Vielen Dank im Voraus für jede Hilfe.

+2

, dass der Code 3 auf dem Pickaxe Buch aus Kapitel ist! –

Antwort

11

Edit:

Zurück in den Tagen, wo diese Frage gestellt wurde Ruby 1.8.6 genannt, wo es keine require_relative war. Inzwischen ist Ruby 1.8.6 veraltet und sollte nicht mehr verwendet werden.

Original:

Es gibt einfach keinen Methodennamen require_relative. Sie können dort auch verwenden.

Die require_relative Funktion ist in einem Erweiterungsprojekt für die Ruby-Core-Bibliotheken enthalten, hier: http://www.rubyforge.org/projects/extensions

Sie sollten sie mit gem install extensions installieren können. dann in Ihrem Code fügen Sie die folgende Zeile vor dem require_relative:

require 'extensions/all' 
+12

Es gibt, aber es ist nur in 1.9. – molf

+0

@molf: Ich habe nur nach der angegebenen Version gesucht. – Aurril

+0

Vielen Dank, ich habe die neuere Version von Ruby installiert und es funktioniert. – WANNABE

34

require_relative nicht in Ihrer Version von Ruby nicht existiert. Sie könnten Ruby-Upgrade, installieren Sie das backports Juwel und require 'backports/1.9.1/kernel/require/relative' aber die einfachste Lösung wird es sein, Ihre erfordern zu ändern:

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

Danke Shanna, wirklich schätzen Ihren Rat – WANNABE

+1

vorschlagen zu verwenden 'require.expand_path ('another_file', __FILE __)', die Eltern-Verzeichnis schön auflösen können, wenn Sie ''../ csv_reader'' laden müssen – huocp

Verwandte Themen