こんにちは、ひろきです。
フィヨルドブートキャンプではネタバレは基本載せてはいけない方針だったので、今回の記事は軽めです。 コードはほとんど書いていません。
前回は、ここまで表示できるようになりました。
やりたいこと
- 日を改行させる
- 1週間目の日の場所を合わせる
- 年月を指定してカレンダーを表示する
日を改行させる
現在のコードでは日にちが横一線になっているので、改行させたいです。 「曜日と連携」のような技があるのかわからないですが、ないと思うので、土曜日を表示したら改行できるようにしたいです。
ここでまた、便利なメソッドがないか探してみましょう。
class Date (Ruby 3.3 リファレンスマニュアル)
saturday?の?
はそうだったらtrue
、違ったらfalse
を返します。
なので、そうだったら改行、違ったら改行をしないようにコードを書いていきます。
こうなりました。あとは、日付毎の間隔と1週間目の位置を正すだけです。
1週間目の日の場所を合わせる
先述した通り、曜日と日付を連携させるようなメソッドは知らないですsし、あるかもわからないので、そこに1日が置かれるようにしないといけません。 日曜日は0日分、月曜日は1日分…のように空白を作れたら最高です。 そこで、このメソッドが使えそうです。
Date#wday (Ruby 3.3 リファレンスマニュアル)
wdayは、日曜日から土曜日までを0-6で返します。
この数値を利用して空白を作ります。これで、初日の日付と曜日が合いました。
しかし、1、2週の配置が合いません。
右寄せにできるメソッドがあります。
String#rjust (Ruby 3.3 リファレンスマニュアル)
文字列で使えるメソッドで、文字列よりも小さい数字を()に入れると、反映されません。
年月部分がずれているので、直します。 centerメソッドを使いましょう。 String#center (Ruby 3.3 リファレンスマニュアル)
例えば、center(10)にした場合、全体で10字分だった場合の真ん中に寄せてくれます。 それに合わせて数値を入力してください。 これで、カレンダーの見た目になりました。
最後は、ターミナルで年月を指定して表示する方法です。
年月を指定してカレンダーを表示する
optparse
できるようになること。
①コマンドラインで引数を入力する
②引数がコマンドライン引数としてスクリプトに渡される
③ARGV(配列)を実行すると、配列の出力を得ることができる
リファレンス
library optparse (Ruby 3.3 リファレンスマニュアル)
以下のブログを参考にしました。
optparseの使い方 #Ruby - Qiita
Rubyのoptparseについて掘り下げてみる - あきろぐ
これを使って、-yと-mのコマンドを作ります。
これで年月を指定して作れるはずです。
もしかしたら、今月のカレンダーが表示され続けているかもしれません。
その場合は、yearとmonthの定義が正しくできていません。today.yearのように定義していると、永遠に今の年月が出続けます。yearとmonthを指定した数値で使えるように定義してください。
ここで注意です。もし、年月を指定しなかったら、今月のカレンダーが表示されないといけません。 ということは、定義が2つになります。どちらかを表示できるメソッドが必要になります。
完成!
だいぶざっくりになってしまいましたが、これでカレンダーが完成したのではないでしょうか?
今回は、
cal.rb
で表示できるようになるようにはしていません。
書き直してみて良い復習になりました。実際、あまりよくわからず使っていたコードもあったので、調べる良い機会になりました。
この課題をクリアした後、合格した方のコードを見れるのですが、正解はその人の数だけありました。 他の方のコードをみて勉強になるレベルまで達したかわかりませんが、合格した時よりも、今、この記事を書いている時の方が理解が深くなっているので、定期的にコードを見るというのも大事なのだと感じました。