30日目
今日の学習
Ruby
やんばるエキスパートにあるチャレンジ課題に挑戦。
やんばるエキスパート教材 | ドラクエ風プログラムを作ろう!
Rubyを勉強しはじめの頃に、バトルをするプログラムをどうやってループさせればいいのか分からない!となっていたが、ちゃんとできるようになって良かった。
Ruby本で、クラスについて学習。
クラス
まず、Rubyではオブジェクトは必ず何らかのクラスに属している。
クラスが同じであれば、そのクラスが保持している属性や使えるメソッドが同じになる。
やっとこのあたりについて理解できてきた気がする。
あらかじめRubyで設定されているクラスを使っているという認識がなかったので、整数はIntegerクラスに分類されていて〜〜というような表現を見ても、いまいちぴんとこなかった。
クラスメソッド
クラスの関連性は深いものの、ひとつひとつのインスタンスに含まれるデータは使わないメソッドを定義したい場合は、それをクラスメソッド
として定義する。
クラスメソッド
は、メソッド名の前にself.
をつける。もしくは、class << self ... ... end
として、endの間にメソッドを書く。
git
pushもpullもできない
pushしようとしてもエラーが出てしまったので、pullしようとしたら、fatal: refusing to merge unrelated histories
と出てきてどちらもできないという状態に。
この記事の通りにすると無事pushできるようになった。
今日のやらかし
attr_writerをつけずに値を書き換えようとする
ドラクエのようなバトルをするプログラムを作っていたのだが、敵に攻撃をしてHPを減らそうという操作がうまくいかない。
monster.hp -= monster_damage
こんな感じで、敵へ与えた攻撃の値をmonster_damage
にして、敵のHPから引いてみようと思ったのにエラーが出てしまう。
undefined method
hp=' for #<Monster:0x00007ff23e872368> (NoMethodError)`
原因は、attr_writer
を設定していなかったので、値の書き換えができないという至極単純なことだった。
無闇にattr_accessor
を使わないようにして、とりあえず読み取りのためにattr_reader
だけを設定していたのだった。
気づけば何でもないことであったが、エラー文のhp=
ってなんだ...と変なところでつまづいていた。
とりあえず必要な分だけアクセサを準備して、値の変更が必要だと思ったら書き換えのアクセサも一緒に追加する癖をつけたい。