Ruby には 2.0 から導入されたキーワード引数という引数の値を変数名に割り当てメソッドを呼び出す方法があるそうです。(Ruby 2.1 からデフォルト値のない Requiredキーワード引数 が使えるようになった)
キーワード引数のメリット
- メソッドに渡している引数が何を意味するものかわかりやすくなる
- 引数の順番を気にしなくてもいい
e.g.
通常のメソッド
def total(price, tax = 0.08, discount = 0, include_tax = false) sub_account = price - discount total = if include_tax tax_account = (sub_account / ((1 + tax) * 100) * (tax * 100)).round sub_account else tax_account = (sub_account * (tax * 100) / 100).round sub_account + tax_account end puts " Price: #{price} Discount: #{discount} Tax rate: #{tax} Total: #{total.round} Tax: #{tax_account} #{'(Internal tax)' if include_tax} -------------------" end # 呼び出し # 10000円の商品を3000円割引で消費税8% total(10000, 0.08, 3000) # 10000円の商品を税率8%を内税で total(10000, 0.08, 0, true)
メソッドに渡す引数が何か覚えておかなければならず、デフォルトのままで済む値もその後の引数が必要なら記入する必要があります。特に自分が書いたコードでなく呼び出し部分だけ見た時にメソッドを見に行かなければ何の引数を渡しているのか分かりづらそうです。
キーワード引数を使ったメソッド
def total(price: , tax: 0.08, discount: 0, include_tax: false) sub_account = price - discount total = if include_tax tax_account = (sub_account / ((1 + tax) * 100) * (tax * 100)).round sub_account else tax_account = (sub_account * (tax * 100) / 100).round sub_account + tax_account end puts " Price: #{price} Discount: #{discount} Tax rate: #{tax} Total: #{total.round} Tax: #{tax_account} #{'(Internal tax)' if include_tax} -------------------" end # 呼び出し # 10000円の商品を3000円割引で消費税8% total(price: 10000, discount: 3000, tax: 0.08) # 内税で10000円の商品を税率10%で total(include_tax: true, price: 10000, tax: 0.1)
キーワード引数を使用したメソッドにすれば引数の順番を気にする必要がなくなるので、必要な引数をより文章的に渡すことができるようになりました。
まとめ
Railsとかファイルが分割されているようなフレームワークだと、関数呼び出すときの引数が何なのわかりにくくなるのがキーワード引数を使って適切な変数名にしておけば呼び出し元からも何の為の引数か判るようになり見通しが良くなりそうです。
コードレビューでキーワード引数のことを教えてもらいました。
Ruby 初心者マンにも優しい職場よい
[参考]
- Ruby 2.0.0 のキーワード引数
- Rubyテクニック: Rubyの通常の引数とキーワード引数の違い - Rails Webook
- 消費税の内税の計算方法、簡単な計算式[8%、10%]|K-W BLOG
#rubyworld matzさん「まだ全然伝えてないんだけど、Ruby3ではキーワード引数直したい。互換性ぶっ壊れると思う^^」
— undo (@undo1203) November 1, 2017
会場「ざわ……」
「これを revert して再度受付けるようにしています。3.0 でのキーワード引数の仕様変更に向けて現状の仕様だとうまく migration できるような中間的な書きかたができないため」
— Yukihiro Matsumoto (@yukihiro_matz) March 12, 2019
Link: ruby-trunk-changes r67216 - r67226 - ruby trunk changes: https://t.co/Vtdadq4iLE
👀👀👀 ムムム…
プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで (Software Design plusシリーズ)
- 作者: 伊藤淳一
- 出版社/メーカー: 技術評論社
- 発売日: 2017/11/25
- メディア: 大型本
- この商品を含むブログを見る