2010-04-21 13 views
17

Sto imparando Rubino (utilizzando la versione 1.8.6) su Windows 7.Perché parente_require non funziona su Ruby 1.8.6?

Quando provo a fare funzionare il programma stock_stats.rb sotto, ottengo il seguente errore:

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

I avere tre file di codice 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  

Grazie in anticipo per qualsiasi aiuto.

+2

Questo è il codice dal capitolo 3 sul libro Piccone! –

risposta

11

Edit:

Torna nei giorni in cui questa domanda è stata posta si riferiva a Ruby 1.8.6 dove non c'era require_relative. Ormai Ruby 1.8.6 è obsoleto e non dovrebbe più essere usato.

originale:

semplicemente non c'è il nome del metodo require_relative. È possibile utilizzare anche require.

La funzione require_relative è incluso in un progetto di estensione alle librerie di base di Ruby, che si trova qui: http://www.rubyforge.org/projects/extensions

Si dovrebbe essere in grado di installarli con gem install extensions. Poi nel codice aggiungere la seguente riga prima della require_relative:

require 'extensions/all' 
+12

C'è, ma è solo in 1.9. – molf

+0

@molf: stavo solo cercando la versione specificata. – Aurril

+0

Grazie mille, ho installato la versione più recente di Ruby e funziona. – WANNABE

34

require_relative non esiste nella versione di Ruby. Si potrebbe aggiornare Ruby, installare il backports gemma e require 'backports/1.9.1/kernel/require/relative' ma la soluzione più semplice sarà quello di cambiare la vostra richiedono di:

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

Grazie Shanna, apprezzo molto il tuo consiglio – WANNABE

+1

suggerire di utilizzare 'require File.expand_path ('another_file', __FILE __)' che può risolvere in modo appropriato la directory principale se devi caricare ''../ csv_reader'' – huocp

Problemi correlati