⁉️

【Ruby】デフォルト引数とDateに気をつけろ!

2024/01/19に公開

はじめに

Rubyプログラミングにおいて、デフォルト引数の使い方には注意が必要です。特に、サービスクラスなどでデフォルト引数を用いる際には、予期しない動作に注意する必要があります。

デフォルト引数の落とし穴

例えば、以下のようなサービスクラスがあるとします。

class SomeService
  def initialize(fiscal_year = (Date.current << 3).year)
    @fiscal_year = fiscal_year
  end
end

このコードでは、fiscal_yearのデフォルト値が(Date.current << 3).yearとして設定されています。これは、現在の日付から3ヶ月前の年を意味します。しかし、このデフォルト値はサービスクラスが読み込まれた時点で固定され、その後の日付変更が反映されません。これにより、期待した動作と異なる結果が生じる可能性があります。

改善策:デフォルト値をnilに設定

この問題を解決するためには、fiscal_yearのデフォルト値をnilに設定し、メソッド内で現在の年度を設定する方法があります。

class SomeService
  def initialize(fiscal_year = nil)
    @fiscal_year = fiscal_year || (Date.current << 3).year
  end
end

このコードでは、@fiscal_year = fiscal_year || (Date.current << 3).yearという行が重要です。これは、「fiscal_yearがnilまたはfalseの場合にのみ、(Date.current << 3).yearfiscal_yearに割り当てる」という意味になります。これにより、デフォルト値が動的になり、サービスクラスのインスタンス化の都度、現在の年度が反映されるようになります。

まとめ

Rubyにおけるデフォルト引数は非常に便利ですが、その挙動を正しく理解し、適切に利用することが重要です。特に、時系列に依存する値をデフォルト引数に設定する場合は、このような問題に注意する必要があります。

Discussion