カレンダー作成問題を単月から毎月表示にしてみる

ruby

単月表示は大体理解できたので、今度は毎月表示の解答を例に自分で理解しながら進めてみる。

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

日付や日時のデータを編集して文字列に変換して返すメソッド。

おすすめテキスト

テストを書かれた伊藤さんのチェリー本で勉強しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

パソコンとネットの何でも屋さん兼農家見習い中
2021年に奥さんに腎移植して人生の価値観が大きく変わりました
何が起きても諦めずに生き抜く力が一番大切
時々ブログも書いてます

目次