星田オステオパシー

Rustでトランキライザーガン その10 うーん・・トレイト?

 あんまりにも同じコードを書いてるので関数化してまとめようと思いまして・・
 まず、この表示に使ってるクロージャ部分がPlayer、Bullet、Animal、Mapと全く同じなのでまとめる

 とりあえずこうなるか・・

 後はそのままで・・

 まあ、オッケイ

 超今更なんだけど、返り値がResult<()>の場合は副作用目的の関数(プロシージャ)なんだから、読むときも書くときもまずここを見れば良いのか・・ホント今更だなぁ

 でも、改めて確定するとなんか気分的に随分違う気がする。言語化って大事だなぁ

 続いて更に関数部分に多くを担わせたいが・・問題になってくるのは引数の型。まあ、これは前から思ってたんだけど、Player、Bullet、Animalそれぞれの型にせっかく共通のフィールドを持たせてるんだから全部をまとめて操作できれば楽なのは目に見えてる


 というわけでトレイトの登場となったわけだな。

 うーん、まあ、ここまでは良いでしょう

 ここでちょっと一手間かかってるが・・まあ、これも許そう

 でも、この型ごとに更に書かないといけない部分は・・面倒くさすぎる!
 こういうところが嫌なんだよなぁ・・そもそもフィールド名とその型が一緒だったら一発登録で同じ挙動が許されるような仕組みにすべきじゃないか?
 今回こそはトレイトに挑戦しようと思ったけどやめた!


 で、関数式にした状態でチェック、オッケイ。
 でも気になるのが画面の最下段が切れてること・・座標と表示の計算が間違ってるのか?と1時間以上かけてチェックしたけど原因不明・・何なんだ?


 結果、予想外の原因判明。ターミナルからの実行時にターミナルの縦サイズが足りないせいで微妙に切れていたのだった。ややこしいことに、一旦表示が行われた後に画面をでかくしても切れてる部分はそのままなんだよな〜・・実行前に画面をデカくしておいてからCargo runしたらご覧の通り、ちゃんと表示されました(テストのために1行増やしてます)。

 後は、BulletとAnimalが森に入ったときには表示しないようにしないといけないってことで・・Mainループの弾丸が範囲から出た場合にbullet.activeをFlaseにするのと同時に、bullet.go_straight()の条件をtrueのときだけに限定することで・・・

 弾丸が森を上書きしないようになった、よしよし・・

 続いてAnimalの座標が森の座標とかぶってるときには表示しないようにして・・・

 オッケイ、森に潜めるようになった。やれやれ・・・最初、tree_coordinate.contains... の先頭に!を付け忘れてて、なんで表示されたままなんだ!?と30分くらいテストしてたんですよねぇ

 というわけでちょうど22時となったので終了。ところで・・・今、これを書いてて思いついたんだけど、クロージャの部分で引数に型指定が無いのに動くのは何故?って質問をした時に「型推論をやってるので」との答えだった。もしかしてだけど・・例の関数も型指定をしなければ勝手に判定して同じ関数がPlayer,Bullet,Animal,Mapに使えるのでは・・?と。それにたしか、強制的に型推論させる書き方があったような・・

 明日はここから始めよう

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事