0

attr_accessor1.9 つるはしの本の例を実行したところ、ファイルで使用せずに次のプログラムが正常に実行される理由がわかりませんcsv_reader.rb

book_in_stock.rb

class BookInStock
  attr_accessor :price, :isbn

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

csv_reader オブジェクトのインスタンス変数に、新しい BookInStock オブジェクトを追加して書き込んでいませんか?

csv_reader.rb

require 'csv'
require_relative 'book_in_stock'

class CsvReader
  def initialize
    @book_in_stock = []
  end

  def read_in_csv_data(csv_file)
    CSV.foreach(csv_file, headers: true) do |row|
      @book_in_stock << BookInStock.new(row["price"], row["isbn"])
    end
  end

  def total_value_in_stock
    sum = 0
    @book_in_stock.each {|book| sum += book.price}
    sum
  end
end

test_data.csv

"price","isbn"
"44.12",'asdf34r13'
"74.12",'asdf34r13'
"14.12",'asdf34r13'
"42.12",'asdf34r13'
"4774.12",'asdf34r13'
"04.19",'asdf34r13'

プログラムドライバー

require_relative 'csv_reader'

reader = CsvReader.new

ARGV.each do |csv_file_name|
  STDERR.puts "Processing the thing"
  reader.read_in_csv_data(csv_file_name)
end

puts "Total Value = #{reader.total_value_in_stock}"

メソッドはread_in_csv_dataアクセサメソッドと同じ仕事をしていますか?

4

1 に答える 1

3

attr_accessor手で書くと大まかに次のようになる 2 つのメソッドを作成します。

def price
  @price
end

def price=(new_price)
  @price = new_price
end

これらのメソッドを呼び出すことはないため、それらが存在するかどうかは関係ありません。

于 2013-09-24T17:28:23.150 に答える