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とかに直す必要があると感じた。