6-3-2 特殊な引数のメソッドを定義して呼び出そう

消費税を計算するメソッドを定義する

第1引数に金額を指定し、第2引数に消費税率を指定し、消費税額と消費税込み額をハッシュで戻り値として返却するメソッドを以下のように定義します。

また、メソッドを呼び出す処理を2つ記述します。テキストエディタを開き、ファイル名をspecial_arg.rbとして保存します。

# 特殊な引数のメソッドを定義して呼び出そう
def calculate_tax(price, tax_rate)
  tax = (price * tax_rate).to_i
  tax_included = price + tax
  { tax: tax, tax_included: tax_included }
end

p calculate_tax(100, 0.08)
p calculate_tax(100)

プログラムを実行する

コマンドライン上でプログラムを指定して実行します。

実行結果に、{:tax=>8, :tax_included=>108}というハッシュが表示されます。また、その後引数の数に誤りがあることを示すArgumentErrorが表示されます。

{:tax=>8, :tax_included=>108}
special_arg.rb:2:in `calculate_tax': wrong number of arguments (given 1, expected 2) (ArgumentError)
    from special_arg1.rb:9:in `<main>'

消費税のデフォルト値を設定する

メソッドの第2引数のtax_rateに、デフォルト値として0.08を設定します。また、メソッド呼び出しの税率を10%(0.1)に変更します。

# 特殊な引数のメソッドを定義して呼び出そう
def calculate_tax(price, tax_rate = 0.08) # 修正
  tax = (price * tax_rate).to_i
  tax_included = price + tax
  { tax: tax, tax_included: tax_included }
end

p calculate_tax(100, 0.1) # 修正
p calculate_tax(100)

修正したプログラムを実行する

コマンドライン上でプログラムを指定して実行します。

実行結果に、{:tax=>10, :tax_included=>110}{:tax=>8, :tax_included=>108}というハッシュが表示されます。2番目のメソッド呼び出しでArgumentErrorは発生しません。

$ ruby special_arg.rb
{:tax=>10, :tax_included=>110}
{:tax=>8, :tax_included=>108}

消費税率をハッシュ形式に書き換える

メソッドの第2引数のtax_rateの指定を、tax_rate: 0.08とハッシュ形式に書き換えます。また、メソッド呼び出しの第2引数も同様にハッシュ形式に書き換えます。

# 特殊な引数のメソッドを定義して呼び出そう
def calculate_tax(price, tax_rate: 0.08) # 修正
  tax = (price * tax_rate).to_i
  tax_included = price + tax
  { tax: tax, tax_included: tax_included }
end

p calculate_tax(100, tax_rate: 0.1) # 修正
p calculate_tax(100)

プログラムを実行する

コマンドライン上でプログラムを指定して実行します。実行結果に、{:tax=>10, :tax_included=>110}{:tax=>8, :tax_included=>108}というハッシュが表示されます。

$ ruby special_arg.rb
{:tax=>10, :tax_included=>110}
{:tax=>8, :tax_included=>108}

引数を全て渡すメソッドを定義する

6-2 新しいメソッドを定義してみよう」で使用したプログラムを元に、以下の通り引数を全て渡す形式にメソッド定義とメソッド呼び出しの両方を書き換えます。

ファイル名をspecial_arg2.rbとして保存します。

# 特殊な引数のメソッドを定義して呼び出そう
def generate_sentence_and_abbreviation(*words)
  sentence = words.join(' ')
  abbreviation = words.map { |w| w[0] }.select { |w| w == w.upcase }.join
  { sentence: sentence, abbreviation: abbreviation }
end

p generate_sentence_and_abbreviation('Pen', 'Pineapple', 'Apple' 'Pen')

プログラムを実行する

コマンドライン上でプログラムを指定して実行します。実行結果に、{:sentence=>"Pen Pineapple Apple Pen", :abbreviation=>"PPAP"}というハッシュが表示されます。

$ ruby special_arg2.rb
{:sentence=>"Pen Pineapple ApplePen", :abbreviation=>"PPA"}