🕳️

【Ruby】Date.new(year: 〇, month: △, day: □)は一見合ってそうですが少し違います

2020/10/14に公開

タイトル通りのミスで30分くらい悩んでいました。 悲しかったので自分への戒めを込めて記事に残したいと思います。

結論

× Date.new(year: 2020, month: 5, day: 18)

Date.new(2020, 5, 18) または Date.new(year = 2020, month = 5, day = 18)

ミスの内容

Date.newをしようとした際、 本来は Date.new(2020, 5, 18) のようにしなければならないところを、 Date.new(year: 2020, month: 5, day: 18) としてしまっていました。 実行結果がこちらです

irb(main):001:0> Date.new(year: 2020, month: 5, day: 18)
Traceback (most recent call last):
    3: from (irb):1
    2: from (irb):1:in `new'
    1: from (irb):1:in `initialize'
TypeError (invalid year (not numeric))

TypeError (invalid year (not numeric)) このエラーでyearが数字ではないと言われているのですが、『ちゃんと指定してるのになぜ...?』と何が間違っているのか本当にわかりませんでした。

ミス(思い込み)の原因

Railsで使われるchangeメソッドと混同していました。

irb(main):014:0> date = Date.new(2020,7,7)
irb(main):015:0> date => Tue, 07 Jul 2020
irb(main):016:0> date.change(year: 2021, month: 3, day: 3) => Wed, 03 Mar 2021

参考: https://apidock.com/rails/Date/change

year, month, dayを明示的に書きたい場合

ちなみに、year, month, dayを明示的に書きたい場合は、 Date.new(year = 2020, month = 5, day = 18) のようにすることで期待する動作をさせることができます。

Discussion