⁉️
【Ruby】デフォルト引数とDateに気をつけろ!
はじめに
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).year
を fiscal_year
に割り当てる」という意味になります。これにより、デフォルト値が動的になり、サービスクラスのインスタンス化の都度、現在の年度が反映されるようになります。
まとめ
Rubyにおけるデフォルト引数は非常に便利ですが、その挙動を正しく理解し、適切に利用することが重要です。特に、時系列に依存する値をデフォルト引数に設定する場合は、このような問題に注意する必要があります。
Discussion