かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Ruby キーワード引数で見通しを良くするゾ

Ruby には 2.0 から導入されたキーワード引数という引数の値を変数名に割り当てメソッドを呼び出す方法があるそうです。(Ruby 2.1 からデフォルト値のない Requiredキーワード引数 が使えるようになった)

キーワード引数のメリット

  1. メソッドに渡している引数が何を意味するものかわかりやすくなる
  2. 引数の順番を気にしなくてもいい

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 初心者マンにも優しい職場よい


[参考]

 

👀👀👀 ムムム…