教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。
その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。
こちらでは、より柔軟にパラメータの初期値を設定できるよう、initialize
メソッドをさらに改善していきます。
ここまでの内容で、initialize
メソッドを使うことによってコードはだいぶシンプルになったのですが、まだ不便なところがあります。それは、決まった値しかパラメータに設定できないところです。
現在は、initialize
メソッドの中に以下のように値が固定されています。
rb123456 Copied!def initialize
@name = "テリー"
@hp = 500
@offense = 150
@defense = 100
end
これを、各インスタンスごとに柔軟に値を設定できるようmain.rb
を書き換えてみましょう。その際は、new
演算子に引数を渡して値を設定します。
rb123456789101112131415161718192021222324252627282930313233343536 Copied!class Brave
# new演算子から渡された引数を受け取る
def initialize(name, hp, offense, defense)
@name = name
@hp = hp
@offense = offense
@defense = defense
end
def name
@name
end
def hp
@hp
end
def offense
@offense
end
def defense
@defense
end
end
brave = Brave.new("テリー", 500, 150, 100)
puts <<~TEXT
NAME:#{brave.name}
HP:#{brave.hp}
OFFENSE:#{brave.offense}
DEFENSE:#{brave.defense}
TEXT
こうすることにより、インスタンスごとにパラメータを自由に設定できるようになりました。
例えば、3人の勇者を作成しても、各勇者ごとに違ったパラメータを設定できるようになります。
rb123 Copied!brave = Brave.new("テリー", 500, 150, 100)
brave2 = Brave.new("マロン", 200, 150, 20)
brave3 = Brave.new("プリン", 100, 300, 10)
これでだいぶ柔軟に勇者を作成することができるようになりました。しかし、これでもまだまだ改善できる点はあります。
まず、今はinitialize
メソッドの引数としてname
、hp
、offense
、defense
の3つを設定しているのですが、引数を見ただけではどのパラメータに値を渡しているのかがわかりません。そこで、main.rb
のinitialize
メソッドを編集してもっとわかりやすくしていきましょう。そのときに使用するのがキーワード引数です。
rb123456789101112131415161718192021222324252627282930313233343536 Copied!class Brave
# new演算子から渡された引数を受け取る
def initialize(name:, hp:, offense:, defense:)
@name = name
@hp = hp
@offense = offense
@defense = defense
end
def name
@name
end
def hp
@hp
end
def offense
@offense
end
def defense
@defense
end
end
brave = Brave.new(name: "テリー", hp: 500, offense: 150, defense: 100)
puts <<~TEXT
NAME:#{brave.name}
HP:#{brave.hp}
OFFENSE:#{brave.offense}
DEFENSE:#{brave.defense}
TEXT
上のコードのようにすると、どのパラメータにどういう値を渡しているのかが一目瞭然です。そのため、コードの可読性が上がりグッと読みやすくなります。
ただ、こちらももう少し改善することができます。今のままではnew
演算子で渡す引数の数が増えるとinitialize
メソッドの引数も増やす必要があり、変更箇所が多くなってしまいます。なので、以下のようにmain.rb
のinitialize
メソッドの引数を変更し、ハッシュとして値を受け取れるようにしましょう。こうすることで、new
演算子で渡す引数の数が増えても変更箇所が少なくて済みます。
rb12345678910111213141516171819202122232425262728293031323334353637 Copied!class Brave
# paramsで一括で受け取る
def initialize(params)
# 各パラメータをハッシュで取得
@name = params[:name]
@hp = params[:hp]
@offense = params[:offense]
@defense = params[:defense]
end
def name
@name
end
def hp
@hp
end
def offense
@offense
end
def defense
@defense
end
end
brave = Brave.new(name: "テリー", hp: 500, offense: 150, defense: 100)
puts <<~TEXT
NAME:#{brave.name}
HP:#{brave.hp}
OFFENSE:#{brave.offense}
DEFENSE:#{brave.defense}
TEXT
これでinitialize
メソッドの引数の記述をだいぶスッキリさせることができました。ここで最後にもうひと押し。initialize
に渡す引数はnew
演算子においてhp: 500, offense: 150, defense: 100
というようなハッシュの形式(キーとバリューの組み合わせ)となっています。そのため、main.rb
のinitialize
に渡せる引数はハッシュのみになるよう限定してあげましょう。そうすることで、ハッシュ以外の値を引数で渡した場合エラーとなってくれるので、予期せぬバグが発生しにくくなります。
rb123456789101112131415161718192021222324252627282930313233 Copied!class Brave
# 引数に**を記述:ハッシュしか受け取れなくなる
def initialize(**params)
@name = params[:name]
@hp = params[:hp]
@offense = params[:offense]
@defense = params[:defense]
end
def name
@name
end
def hp
@hp
end
def offense
@offense
end
def defense
@defense
end
end
brave = Brave.new(name: "テリー", hp: 500, offense: 150, defense: 100)
puts "NAME:#{brave.name}"
puts "HP:#{brave.hp}"
puts "OFFENSE:#{brave.offense}"
puts "DEFENSE:#{brave.defense}"
以上でだいぶ柔軟に初期値を設定できるようになりました。次のパートからはセッター、ゲッターの記述をよりシンプルにする方法を学んでいきます。