前回からの続きです。
読解
真偽値を返すメソッド
def today?(today, year, month, day) #メソッド内の制御構文により真偽値を返す year, month , day = [year, month, day].map!(&:to_i) #変数year/month/dayを整数化して再代入 if day != 0 #もし変数dayが0ではないときは today == Date.new(year, month, day) #変数todayはDateオブジェクト(year/month/day)と同値である end end
最終的な出力段階で、日付が今日(文字色と背景色変更の対象)かそうでないかをチェックするためのメソッド。
変数todayはDateオブジェクトから取得した今日の日付であるのに対して、変数year/month/dayはコマンドラインオプションや範囲式によって取得されたものであるので確認工程を挟むのだと思われる。
def today?(today, year, month, day)
?付きのメソッドは、慣習として真偽値を返すメソッドとして構成される。このメソッドはこのあとif式の条件として扱われているが、初見ではメソッドがポン置きされているだけなので全く意味がわからなかった。
year, month , day = [year, month, day].map!(&:to_i)
year, month , dayと変数を並べて書くのは多重代入と呼ばれる手法。複数の変数に対して、複数の値や配列の値を代入できる。値が変数に対して足りない場合はnilが代入される。
ここでは=の右側で配列にした各変数を整数化しており、それを一挙に代入している。 当然行数を短縮できるのでコードがスマートになる。
.map!はよくあるメソッドに!を付記する使用法。!を付記することで要素を結果で書き換える。 通常は要素はそのままで結果は返り値、別物ものとして扱われる。
(&:to_i)はprocと呼ばれるやつ?もともとは.mapメソッドのブロックとして.map do |n| n.to_i
とするところを、procクラスはブロックをオブジェクトにすることができ省略的に記述している。なのでmapのブロックをprocとして表現しています。
&は、ブロック付きのメソッドに対して&を付加した手続きオブジェクト(ここだとproc)を渡すことでメソッドの呼び出し時に実行されるようになる。
:はシンボル化するもので、procで呼び出されると:の左側を引数として、メソッドが実行される。 この場合は変数year/month/dayのそれぞれの値に対して、.to_iが実行されて整数化される、という流れになる。
procは理解が追いついてないので要再学習ですね。
今日の取得
today = Date.today #変数todayにDateクラスを使ってDate.today(今日の年月日)を代入する
Dateクラス…なのでプログラム中にrequire 'date'
を記述することで使用することができる。記述する場所は慣習的に冒頭が多い。
Date.todayは現在日に相当する日付オブジェクトを生成する。
出力形式は<Date: 2017-09-20 ...>(日付オブジェクト)
となる。日付オブジェクトを取得すればDate.today.year
で今日の年だけ取り出すということもできる。
続く