ClassOne
Movie
まずMovieクラスを作る.下のところで,matrixとかをnewしてインスタンスを作っている. >|ruby| require 'pp'
class Movie
REGULAR=0 NEW_RELEASE=1 CHILDRENS=2
attr_reader :title attr_accessor :price_code
def initialize(title, price_code) @title, @price_code = title, price_code end
end
matrix=Movie.new('Matrix', Movie::REGULAR) mj=Movie.new('MJ', Movie::NEW_RELEASE) totoro=Movie.new('Totoro', Movie::CHILDRENS) gundam=Movie.new('Gundam', Movie::CHILDRENS) pp mj p mj.title p totoro.price_code p totoro.price_code=Movie::REGULAR p mj.title="Michael Jackson"
| < |
いくつかの中身を見ています.ppはpよりも詳しくプログラムの 内容を表示するのに使います.
[bobsNewMacBook:Ruby/Refactoring/Refactv1] bob% ruby v0.rb #<Movie:0x193660 @price_code=1, @title="MJ"> "MJ" 2 0 v0.rb:23: undefined method `title=' for #<Movie:0x193660 @price_code=1, @title="MJ"> (NoMethodError)
Rental
次にRentalクラスを作成. >|ruby| class Rental
attr_reader :movie, :days_rented def initialize(movie, days_rented) @movie, @days_rented = movie, days_rented end
end
| < |
Customer
Customerクラスもつくって,実行.”\n"は"\n"に注意. >|ruby|
class Customer
attr_reader :name def initialize(name) @name=name @rentals = [] end
def add_rental(arg) @rentals << arg end
def statement
total_amount, frequent_renter_points = 0,0
result="Rental Record for #{@name}\n"
@rentals.each do |element|
this_amount=0
case element.movie.price_code
when Movie::REGULAR
this_amount +=2
this_amount += (element.days_rented-2)*1.5 if element.days_rented > 2
when Movie::NEW_RELEASE
this_amount += element.days_rented*3
when Movie::CHILDRENS
this_amount +=1.5
this_amount += (element.days_rented-3)*1.5 if element.days_rented > 3
end
frequent_renter_points +=1
if element.movie.price_code==Movie::NEW_RELEASE && element.days_rented > 1
frequent_renter_points +=1
end
result += "\t"+element.movie.title + "\t"+this_amount.to_s + "\n"
total_amount+=this_amount
end
result += "Amount owed is #{total_amount}\n"
result += "You earned #{frequent_renter_points} frequent renter points"
result
end
end
| < |
>|ruby|
me=Customer.new('Nishitani') me.add_rental(Rental.new(matrix,2)) me.add_rental(Rental.new(mj,4)) me.add_rental(Rental.new(totoro,6)) me.add_rental(Rental.new(gundam,3))
- pp me
print me.statement+ "\n"
| < |
出力(statement)結果は次のとおり.
[bob-no-MacBook-Pro:Ruby/Refactoring/Refactv1] bob% ruby v1.rb #<Movie:0x191734 @price_code=1, @title="MJ"> Rental Record for Nishitani Matrix 2 MJ 12 Totoro 6.0 Gundam 1.5 Amount owed is 21.5 You earned 5 frequent renter points
Keyword(s):
References:[RubyPrimary]