2010-04-21 13 views
17

estoy aprendiendo Ruby (utilizando la versión 1.8.6) en Windows 7.¿Por qué relative_require no funciona en Ruby 1.8.6?

Cuando trato de ejecutar el programa stock_stats.rb a continuación, me sale el siguiente error:

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

I tener tres archivos de código 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  

Gracias de antemano por cualquier ayuda.

+2

Ese es el código del capítulo 3 en el libro Pico! –

Respuesta

11

Editar:

En los días en que se hizo esta pregunta se refería a Ruby 1.8.6, donde no había require_relative. En este momento, Ruby 1.8.6 está desactualizado y no debería volver a usarse.

original:

simplemente no hay nombre del método require_relative. Puede usar require allí también.

La función require_relative está incluido en un proyecto de extensión de las bibliotecas del núcleo de Ruby, que se encuentran aquí: http://www.rubyforge.org/projects/extensions

Usted debe ser capaz de instalar con gem install extensions. Luego, en el código de añadir la siguiente línea antes de la require_relative:

require 'extensions/all' 
+12

Hay, pero está en 1.9 solamente. – molf

+0

@molf: solo estaba buscando la versión especificada. – Aurril

+0

Muchas gracias, he instalado la versión más nueva de Ruby y funciona. – WANNABE

34

require_relative no existe en su versión de Ruby. Se podría actualizar Ruby, instalar el backports joya y require 'backports/1.9.1/kernel/require/relative' pero la solución más fácil será para cambiar su requieren a:

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

Gracias Shanna, realmente agradezco su consejo – WANNABE

+1

sugiera utilizar 'require File.expand_path ('another_file', __FILE __)' que puede resolver muy bien el directorio padre si necesita cargar ''../ csv_reader'' – huocp

Cuestiones relacionadas