Ruby学習のアウトプットとして行おうとしましたが、
正直手も足も出なかったので回答例を見て、
読み解く作業をおこなうこととしました。
その記録です。
「プロを目指す人のためのRuby入門」で学習を進めていますが、
まだまだ落とし込みが足りないようです。。。
・回答例
https://qiita.com/sackey_24/items/8fc236bb054aff6b74c8
・参考サイト
https://www.javadrive.jp/ruby/date_class/index5.html
コードごとで読み解き
回答見てもわかるところもあれば初見のところもあったので、
そちらを中心にまず調べて見ました。
どちらにしてもDateクラスを理解しないことには始まらなそうです。。。
Dateクラス
・Timeクラスは組み込みライブラリーだが、Dateクラスは違うので、”require”で呼び込む。
・主要メソッドは、day・mouth・year・wday(それぞれ整数で取得。wdayも日曜日を0として整数で取得)
・オブジェクト作成後、フォーマットを使用し文字列に変換可能(strftimeメソッド)
→%a 曜日の省略形(sun,mon,thu等々) %w 曜日を表す数字
Dateクラスがある程度理解できたので、回答コードの意味もわかってきました。
まずは変数を作り、
head = Date.today.strftime("%B, %Y") #今日の月と西暦を取得→カレンダー上部に表示
year = Date.today.year #今年の西暦
mon = Date.today.mon #今日の月
Dateクラスから今日の西暦と月を作成できたところで、
要件に書いてあるように今月1日と末日もDateクラスから作成。
firstday_wday = Date.new(year,mon,1).wday
lastday_date = Date.new(year,mon,-1).day
week = %w(Su Mo Tu We Th Fr Sa)
ここの重要点としては、
・インスタンスの引数として先ほどの変数を持ってくる。
・末日は”−1”と表記することで取得可能。
・%wは配列をつくる表記(*フォーマット文字列とは別)
次にここまでを実際に出力。
puts head.center(20)
puts week.join(" ")
print " " * firstday_wday
ここも同じく?になったところをまとめます。
・centerメソッドは引数の数が文字数となりそれに沿って中央揃い
・join(" ")→引数のスペースはweek配列の曜日を感覚を開けて表示させるため
・printは改行せず表示するという特性を使いカレンダー1日までの空白を表示。
→スペースを曜日の数字分作る
最後に日付を表記。
数字はくり返し処理をし、改行に関しては条件分岐で設定
wday = firstday_wday
(1..lastday_date).each do |date|
print date.to_s.rjust(2) + " "
右詰で数字を並べる。(1..lastday_wdayで指定した範囲)
そして最後にスタートした曜日(月曜日だったら1)から繰り返し処理ごとに1を足して行き7の倍数に差し掛かったら改行する。
wday = wday+1
if wday%7==0
print "\n"
end
end
if wday%7!=0
print "\n"
end
これで出来上がり。
May 2020
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
振り返り
参考書に書いてある部分が大半だったがそれをいざ0から実装していくとなるとちんぷんかんぷになってしまった。。。
アウトプットすることでその部分や参考書では深く語られてない箇所(今回でいうとDateクラスの詳細)に触れることができたりを確認することができるのでどんどんつづけていければと思います。
また、本記事は自分なりに解釈した内容となるので、もし間違い等があれば、ご指摘頂ければ幸いです。。。
とりあえず配列の章読み返そう。。。