2010-04-21 4 views
17

J'apprends Ruby (en utilisant la version 1.8.6) sur Windows 7.Pourquoi le travail relatif ne nécessite pas Ruby 1.8.6?

Lorsque je tente d'exécuter le programme stock_stats.rb ci-dessous, je reçois l'erreur suivante:

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

I ont trois fichiers de code 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  

Merci à l'avance pour toute aide.

+2

C'est le code du chapitre 3 sur le livre Pioche! –

Répondre

11

Edit:

Retour dans les jours où cette question a été posée appelée Ruby 1.8.6 où il n'y avait pas require_relative. Ruby 1.8.6 est maintenant obsolète et ne devrait plus être utilisé.

Original:

Il n'y a simplement pas de nom de la méthode require_relative. Vous pouvez utiliser require là aussi.

La fonction require_relative est inclus dans un projet d'extension aux bibliothèques de base Ruby, trouvés ici: http://www.rubyforge.org/projects/extensions

Vous devriez pouvoir les installer avec gem install extensions. Ensuite, dans votre code ajoutez la ligne suivante avant la require_relative:

require 'extensions/all' 
+12

Il y en a, mais c'est en 1.9 seulement. – molf

+0

@molf: Je cherchais seulement la version spécifiée. – Aurril

+0

Merci beaucoup, j'ai installé la nouvelle version de Ruby et ça marche. – WANNABE

34

require_relative n'existe pas dans votre version de Ruby. Vous pouvez mettre à jour Ruby, installez le bijou backports et require 'backports/1.9.1/kernel/require/relative' mais le plus simple solution sera de changer votre besoin de:

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

Merci Shanna, vraiment apprécier vos conseils – WANNABE

+1

suggérer d'utiliser 'require File.expand_path ('another_file', __FILE __)' qui peut bien résoudre le répertoire parent si vous avez besoin de charger '' ../ csv_reader'' – huocp

Questions connexes