card.rb
code:ruby
# トランプのカードをあらわすオブジェクトの設計図
class Card
attr_accessor :ordinal # @ordinalというインスタンス変数を定義し、外部から読み書き可能にする
attr_reader :suit, :face # @suit, @faceというインスタンス変数を定義し、外部から参照のみ可能にする
SUITS = %i♣ ♦ ♥ ♠.freeze # SUITSというsuitがとりうる値を決めておく # 値の定義はfreezeで固定してあり, 変更できない
def initialize(str) # Card.new(str)された時に呼ばれる初期化メソッド, 引数strを
@face, @suit = parse(str) # 渡されたstrをparseに入れて、結果を使って@faceと@suitを初期化している
@ordinal = FACES.index(@face) # @faceをFACESと照らし合わせて、cardオブジェクトの@ordinalを決めている
# FACESにはfaceが弱い順に定義されているので、indexが強さを表す値になる
end # def~endまでが処理のひとまとまり
private # この指定以降は、外部から直接は呼び出せないメソッドになる
def parse(str) # Initializeから呼ばれているメソッドをここで準備、strが引数
face = str.chop.to_sym # faceは、strの後ろを切って、シンボルに変換
# "10a".chopをirbで実行して、動作を確認してみる
suit = str-1.to_sym # RubyのStringは、負の数で指定して末尾から文字の切り出しができる raise ArgumentError, "invalid card: #{str}" \ # faceやsuitが想定外だった場合の unless FACES.include?(face) && SUITS.include?(suit) # エラー処理を行なっている
end # メソッドの結果を返す戻り値になる
end