単月表示は大体理解できたので、今度は毎月表示の解答を例に自分で理解しながら進めてみる。
require 'date'
def calendar_month(year: Date.today.year, month: Date.today.month)
firstday = Date.new(year, month, 1) # 今月1日の曜日を取得(0~6)
lastday = Date.new(year, month, -1) # 今月の最終日を取得
first_wday = firstday.wday # 1日の曜日(0-6)
lastday_date = lastday.day # 月末の日数
# 日付の配列を作成(一桁の場合は1マス空白を追加)
days = (1..lastday_date).map{ |n| n.to_s.rjust(2)}
# 1日の曜日に合わせて配列に空白を追加し,7つ区切りの配列に
days = Array.new(first_wday, ' ').push(days).flatten.each_slice(7).to_a
puts firstday.strftime("%B %Y").center(20)
puts %w[Su Mo Tu We Th Fr Sa].join(' ')
days.each do |week|
puts week.join(' ')
end
end
def calendar(year: Date.today.year)
puts '-' * 20
(1..12).each do |n|
calendar_month(year: year, month: n)
puts '-' * 20
end
end
calendar
date関数を読み込んで西暦で年と月を取得する処理を作る。
目次
今日の積み上げ
def…end
def xxx
処理
end
defからendの間に実行したい処理を書く。
defは(define)定義するの意味。
map
オブジェクト.map { |変数|
# 実行したい処理
}
配列やオブジェクトの要素が1つずつ取り出され変数に要素が代入されていき、指定した変数名をブロック内で使用することが出来る。
.flatten
配列を一元化した値を返す。
わかりにくいけれど今の理解では、その月の日にちを配列にして1日の曜日までの空白につけている。
.flattenを外してカレンダーを表示すると、7日で改行せずに横並びになった。
.each_slice(n)
n要素ずつブロックに渡して繰り返す。
.to_a
自身を配列に変換して返す。
.strftime
日付や日時のデータを編集して文字列に変換して返すメソッド。
おすすめテキスト
テストを書かれた伊藤さんのチェリー本で勉強しています。