[Rails] tryと第二引数とdelimitedと

業務中にこんな感じのコードを発見。 (もちろん内容は変えてある)

# book.amountは本の値段(数値)
book.amount.try(:to_s, :delimited)

まぁ雰囲気は分かるが、
細かい部分で引っ掛かりを感じたので調査してみた。

するとまぁこんなちょっとしたコードから思いの外学びがあってびっくり。
我ながら全然理解できていなかった;

勉強になったのはざっくり3点。以下で詳細を説明していく。

  • tryそのものの復習
  • tryの第2引数
  • Railsのdelimited

tryについて

tryの基本

Rails のtryメソッドは何となく知っていたが、改めて復習になった。

try (Object) - APIdock

@person ? @person.name : nil@person.try(:name) と書けると。
うーん改めてtry便利ー。

RailsのtryとRubyの&.

Rubyの&.と役割が似ている。

共通点と違いは以下参照。
Rubyの&.とRailsの#tryの違いについて - Qiita

端的に言うと、

  • レシーバがnilの場合nilを返してくれるのはどちらも同じ
  • 定義されていないメソッドを実行しようとした時の動作が異なる
    • "try"... nilを返す
    • "&." ... エラー

tryの第2引数の扱い

何とtryの第2引数は、第1引数で指定したメソッドの引数になるらしい。
全く知らなかった。メソッドチェーンでもするのかと思っていた。

つまりこう言うことになる

book.amount.try(:to_s, :delimited)

book.amount ? book.amount.to_s(:delimited) : nil

詳細は以下参照。 try (Object) - APIdock

Railsのdelimited

Rails では、 number.to_s(:delimited)
とすることで、数値を"3桁区切り"フォーマットの文字列に変換できるらしい。

ActiveSupport::NumericWithFormatによる、to_sの拡張っぽい。
詳細&実例は以下参照。
ActiveSupport::NumericWithFormat

3桁区切り以外にも、
電話番号フォーマットや、通貨フォーマットやら色々あるみたいなので覚えておきたい。