IT's not Rocket Science!

プログラミング難しいけど頑張ろうね!

Rubyでカレンダーを作ったメモ。後編

こんにちは、ひろきです。

フィヨルドブートキャンプではネタバレは基本載せてはいけない方針だったので、今回の記事は軽めです。 コードはほとんど書いていません。

前回は、ここまで表示できるようになりました。

やりたいこと

  • 日を改行させる
  • 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

で表示できるようになるようにはしていません。
書き直してみて良い復習になりました。実際、あまりよくわからず使っていたコードもあったので、調べる良い機会になりました。

この課題をクリアした後、合格した方のコードを見れるのですが、正解はその人の数だけありました。 他の方のコードをみて勉強になるレベルまで達したかわかりませんが、合格した時よりも、今、この記事を書いている時の方が理解が深くなっているので、定期的にコードを見るというのも大事なのだと感じました。