rubyでcalコマンドを実装してみた話
はじめに
今回はrubyでcalコマンドを実装してみた話を記述しようと思います。 詳しくはcal.rbにて全容をみれます。
それぞれのメソッドを説明
以下はそれぞれのメソッドを説明していきます。
create_space_time メソッド
def create_space_time(date) return space_time = 1 if date.strftime('%a') == 'Man' return space_time = 2 if date.strftime('%a') == 'Tue' return space_time = 3 if date.strftime('%a') == 'Wed' return space_time = 4 if date.strftime('%a') == 'Thu' return space_time = 5 if date.strftime('%a') == 'Fri' return space_time = 6 if date.strftime('%a') == 'Sat' end
入力されたdate
から曜日を調べて、曜日を数字として使うために変換を行うメソッドです。
create_output_day メソッド
def create_output_day(day, cnt) if day < 10 && cnt == 0 "\s#{day}" elsif day < 10 && cnt != 0 "\s\s#{day}" elsif day >= 10 && cnt == 0 day.to_s elsif day >= 10 && cnt != 0 "\s#{day}" end end
出力用のスペースが入った値を曜日と日にちから動的に生成するメソッドです。
create_cal_top メソッド
def create_cal_top(date_start, today) puts "\s\s\s\s\s\s#{today.month}月\s#{today.year}" puts '日 月 火 水 木 金 土' create_space_time(date_start).times do |space_time| if space_time == 1 print "\s\s" else print "\s\s\s" end end end
出力用の月
, 年
, 曜日
を出力するメソッドです。
create_cal_content メソッド
def create_cal_content(date_start, date_end) cnt = create_space_time(date_start) (1..date_end.day).each do |day| if cnt < 6 print create_output_day(day, cnt) cnt += 1 else puts create_output_day(day, cnt) cnt = 0 end end puts "\n" end
カレンダーの中身を生成するメソッドです。
- 具体的な挙動は、
cnt
に1日の曜日を数値として記憶 - 1~最終日の回数ループするようにeach文を生成
- if文とcntを用いて曜日を判定しつつ、土曜日なら改行込みで日にちを出力、それ以外なら改行なしで出力
- 最終日の後ろに改行を入れる
ことで、カレンダーの中身を生成した。
最後に
今回はなんちゃってcalコマンドを作るにあたって、Dateライブラリを使う練習になった。
メソッドの名前を決めるのが難しいなって思った。
実際、ブログを書くにあたってcreate_space_time
という名前はおかしいなと感じたので、week_to_numbers
とかに直す必要があると感じた。