さらなる高みへ -higher ground -

プログラミング学習の定着を狙いとしたアウトプット(独り言)をしてみるブログ

配列の続き-引数-

引数とは

引数はプログラムでメソッドなどに渡すことのできる値のことである。
引数を使うことによって、メソッドの外にある変数(スコープ外の変数)をメソッドの中で使うことができる。

引数でメソッドに変数を渡す

メソッドは「何か材料を渡したら共通の処理を施した後に何か値を返してくれるもの」と表現できる。
例えば、ジューサーはジュースを作るものだが、リンゴを材料とするとリンゴジュースが、オレンジを材料とすればオレンジジュースができる。
材料とするものによって出来上がるジュース(結果)が変わるというわけだ。

引数は、この時のリンゴやオレンジのような材料にあたる。
引数によってメソッドの実行結果は変わるということになる。

引数のポイント

引数には以下の2つのポイントがある。

  • 引数は「メソッドを呼び出す部分」と「メソッドを定義している部分」両方に書く
  • 「メソッドを呼び出す部分」に書く引数と「メソッドを定義している部分」に書く引数の名前は、一致している必要はない

一つ目の、『引数は「メソッドを呼び出す部分」と「メソッドを定義している部分」両方に書く』であるが、

メソッドを呼び出す際に書く引数のことを本引数と言う。
メソッドの呼び出し時は、以下のように本引数を書く。

メソッド名(本引数)

この本引数に対して、メソッドを定義している部分に書く引数のことを仮引数と言う。

メソッドを定義している部分には、以下のように仮引数を書く。
メソッドの処理の中では、引数として渡されたものを仮引数としてつけた名前で扱う。

def メソッド名(仮引数)
  実行する処理
end
【例】引数を用いたメソッドの実行
def multi(input)
  puts input * input
end

puts "何か数字を入力してください"
input = gets.to_i

multi(input)

メソッドmultiは、引数として渡した数を2乗した数字を出力してくれるメソッドである。

まず1 ~ 3行目でメソッドmultiを定義する。
5行目のputsメソッドで「何か数字を入力してください」と出力されたあと、6行目でユーザーが入力した数字が変数inputに代入される。

そして、8行目でメソッドmultiを実行している。
その際、メソッドの名の後ろの()の中にinputが書かれていることに注目する。
この記述により、メソッドmultiが実行される際にinputを引数として利用することが出来る。
1行目、メソッドの定義側を見ると、仮引数はinputとなっている。

そのため、メソッドmultiの処理中は、本引数inputをinputという変数として利用することになる。

2つめの『「メソッドを呼び出す部分」に書く引数と「メソッドを定義している部分」に書く引数の名前は同じである必要はない』であるが、

どのような名前の本引数が渡されても、メソッドの中では仮引数の名前で扱うため、本引数と仮引数の名前が同じである必要はない

引数が渡されたメソッドの性質によって名前を変えた方がわかりやすい場合がある。
例えば、先ほどのメソッドの仮引数を以下のようにしても問題なく動作する。

例:仮引数の名前を変更
def multi(number)
  puts number * number
end

puts "何か数字を入力してください"
input = gets.to_i

multi(input)

仮引数の変数名をnumberに変更した。
inputとしてメソッドmultiに引き渡された引数の値は、メソッドmultiの中では変数numberに代入された状態で利用される。

仮引数の名前について

仮引数の名前は何でも良いのだが、どんな人が読んでもそれが何なのかわかるものにするべきである。
例えば、メソッドの仮引数がaやbでは、それが何なのかわかりづらくなる。

def multi(a)
  puts a * a
end

メソッドmultiの中で掛け合わされるのは必ず数字なので、ここはnumberにするべきである。

メソッド自体の答えを明示的に示すreturn文

現在メソッドmultiは引数として渡された数字の2乗の結果を出力するだけである。
この結果をメソッド自体の値とする場合は、以下のように3行目を追記する。

def multi(number)
  puts number * number
  return number * number
end

puts "何か数字を入力してください"
value = gets.to_i

multi(value)

上記のようにすることで、9行目のメソッドmultiの式の答えはnumber * numberの答えになる。

return

全てのメソッドには返り値がある。

メソッド内でreturn ◯◯とすると、return(リターン)のあとに続けた式がそのメソッド自体の返り値になる。
returnを利用した時点で返り値が決まるため、メソッドはその行までで強制的に終了する。
以下の例を見てみよう。

例1:returnを利用した場合

def sample
  "1"
  "2"
  "3"

  return "4"           # ここで処理は終わり

  "5"                # 呼ばれない
  "6"                # 呼ばれない
end

puts sample            # => 4

return文でメソッドは返り値を返してそのまま処理を終了する。return文のあとにコードがあっても無視される。

例2:returnを利用しない場合

def sample
  "1"
  "2"
  "3"
  "4"
  "5"
  "6"                # 最後に実行されている
end

puts sample            # => 6

Rubyではreturn文を省略することが可能である。
returnを省略した場合、メソッドの返り値はそのメソッドの中で最後に実行された式の値となる。

Rubyでは、どんな記述も式と捉え、その返り値を持つという性質がある。
上記のように文字列を書いておくだけの場合、返り値はその文字列の値となる。

本引数と仮引数の関係

ここでもうひとつメソッドを作って、引数や返り値についての理解を深める。

def mixer(fruit)
  puts "#{fruit}を細かく砕く"
  return "#{fruit}ジュース"
end

puts mixer("リンゴ") # => リンゴジュース

メソッドの呼び出し側で渡された引数(リンゴ)は引数を入れる変数(fruit)としてメソッド内で使うことができる。

puts mixer("リンゴ")           # この"リンゴ"という値がメソッドmixerに渡される。

puts 〇〇 とすればputsに引数として渡した値が出力される。
今、〇〇の部分がmixer("リンゴ")となっている。
そこでまずメソッドmixer自体の返り値(メソッド自体の答え)を確定させるために、メソッドmixerが実行される。

def mixer(fruit)                # 渡された"リンゴ"という値が引数を入れる変数fruitに代入される。
  puts "#{fruit}を細かく砕く"     # 今、fruitには"リンゴ"という値が入っている。
  return "#{fruit}ジュース"      # "リンゴジュース" を返す。

以上より、mixer("リンゴ")は、"リンゴを細かく砕く"を出力した後、"リンゴジュース"を返り値とする。

puts mixer("リンゴ")    # mixer("リンゴ")を出力するとその返り値である"リンゴジュース"が出力される
リンゴジュース

juice = mixer("ブドウ") # 変数に代入もできる
puts juice
=> ブドウジュース # puts juiceの実行結果

引数を使うと、渡す引数によって結果を変えることができるので非常に便利である。
6行目の「puts mixer("リンゴ") 」の"リンゴ"をいろいろな文字列に変えると結果の出力も変わる。

⇒「puts mixer("リンゴ")」の部分を「puts mixer("ぶどう")」や「puts mixer("みかん")」に変えて実行してみる。