Ошибка Ruby с CSV и < - PullRequest
       0

Ошибка Ruby с CSV и <

0 голосов
/ 12 августа 2010

Ну, я думаю, что код говорит сам за себя:)

# book_in_stock.rb

class BookinStock
  attr_reader :isbn, :price

  def initialize(isbn, price)
    @isbn = isbn
    @price = Float(price)
  end
end

# csv_reader.rb

require 'csv'

class CsvReader
  def initialize
    @book_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

# stock_stats.rb

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}"

При запуске я получаю:

# +search/pickaxe/csv $ ruby1.9.1 test.rb data.csv 
# [+] Processing data.csv
# test.rb:23:in `block in read_in_csv_data': undefined method `<<' for nil:NilCla
# ss (NoMethodError)
#        from /usr/lib/ruby/1.9.1/csv.rb:1760:in `each'
#        from /usr/lib/ruby/1.9.1/csv.rb:1196:in `block in foreach'
#        from /usr/lib/ruby/1.9.1/csv.rb:1334:in `open'
#        from /usr/lib/ruby/1.9.1/csv.rb:1195:in `foreach'
#        from test.rb:22:in `read_in_csv_data'
#        from test.rb:46:in `block in <main>'
#        from test.rb:44:in `each'
#        from test.rb:44:in `<main>'

Что я сделал не так?

Ответы [ 3 ]

5 голосов
/ 12 августа 2010
'@books_in_stock' != '@book_in_stock' # !

(опечатка)

0 голосов
/ 12 августа 2010

Если вы выполните команду с ruby -w, она включит предупреждения и интерпретатор объяснит, что пошло не так:

0 голосов
/ 12 августа 2010

У вас есть опечатка в функции инициализации (@book_in_store вместо @books_in_store). Это все?

Кстати, сумму цен можно сделать с помощью inject в одну строку

@books_in_stock.inject(0) { |sum, book| sum + book.price }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...