この記事は前回書いた記事【挫折する前に】Ruby 引数がイマイチわからない人への発展編です。
前回の記事では初歩的な解説をしましたので、前回の記事→本記事
の順で読むと理解が深まるのではないかと思います。
###本記事の内容
- 前回の記事【挫折する前に】Ruby 引数がイマイチわからない人へで省略した部分の解説をしていきます。
###この記事が参考になりそうな人
- 前回の記事を読んでいただいた方
- 「引数がわからなくて挫折しそう!」という初心者の方
- 「引数がイマイチわからない」という方
##前回のおさらい
前回の記事ではイメージを掴んでいただくことを優先して、用語やコードの動きを極力省いて解説しましたが、今回はそれの補足をしていきたいと思います。
前回書いたコードは以下のようなものでした。
def tashizan(hikisu, hikisu2)
hikisu + hikisu2
end
puts tashizan(10, 20)
=>30
「tashizan」メソッドに引数(hikisu)と(hikisu2)を渡して、そこに10と20という数字を入れた結果、30という値を得ることができました。
この部分に関して、前回の記事を読んでいただいた方の中には、もしかしたら「おおよそのイメージはできたけどコードがどういう動きかイマイチ理解できない」
という方もいたと思うので解説します。
この部分を理解するには**戻り値(返り値)**というものを理解する必要があります。
##戻り値(返り値)とは
元々Rubyにはメソッドの値を返すという特性があります。
もし値が空だった場合でもnilという値を返してくれます。
では上記のコード(sample.rb)でどこに値が戻っているかというと、2行目の部分に戻っています。
実はここには下記のように**「return」**が省略されています。
def tashizan(hikisu, hikisu2)
return hikisu + hikisu2
end
puts tashizan(10, 20)
=>30
このreturnは省略することができるので書いていませんでしたが、これによって、実際は4行目のメソッドが呼ばれた時に1行目の引数に値が渡され、2行目の値に戻っていたことがわかるかと思います。
ちなみにメソッド複数の値がある場合、そのメソッドの中で最後に得られる値が戻り値となります。
文章だけではイメージしにくいかと思うのでコードをみてみましょう。
先ほどの足し算の文の下に掛け算の文を追加してみます。
def tashizan(hikisu, hikisu2)
hikisu + hikisu2
hikisu * hikisu2
end
puts tashizan(10, 20)
=>200
3行目の掛け算の方の値が結果として返ってきていますね。
これが先ほど説明した、**そのメソッドの中で最後に得られる値が戻り値となる。**ということです。
#仮引数と本引数
return文がわかったところで話を引数に戻します。
引数を理解する上で、まず2種類の引数があることを理解する必要があります。
1.仮引数
2.本引数(実引数)
です。
仮引数はメソッドを定義する際に使う引数のことで、
本引数はそのメソッドを実際に呼び出す際に使う引数のことです。
実際のコードで説明すると、1行目が仮引数、5行目が本引数となります。
def tashizan(hikisu, hikisu2)
return hikisu + hikisu2
end
puts tashizan(10, 20)
=>30
先ほどのreturnの流れを思い出してみてください。
1行目で**"定義した"tashizanメソッドの引数が、5行目で"呼び出されて"**値が戻っていましたよね。
つまり、「仮引数はメソッドを定義する際の引数」で本引数は「メソッドを呼び出す際の引数」ということになります。
ここで大事なポイントがあります。
それは、仮引数の名前は本引数と同じでなくてOKということです。
ここで「どういうこと???」となる人が多いと思うので事項で解説していきます。
##仮引数をもう少し深掘る
「仮引数」という名前のとおり、仮なので**どんな名前にしても値は渡ります。**以下のコードをみてください。
※今回はイメージを掴んでもらうことを優先しています。本来は、英語かつ他の人がみてもわかる引数名にするのがベストです。
def tashizan(hikisu)
puts hikisu + hikisu # =>20が出力される
end
hikisu = 10
tashizan(hikisu)
例によってtashizanメソッドを定義しました。
簡単にコードの流れを説明します。
※大前提として、プログラミングのコードは上から順に読まれていくことを理解しておいてください。
1~3行目はメソッドを定義していますが、この時点ではメソッドが呼び出されていないため、実行されず、次の行に処理が移ります。
5行目で数値10を左の"hikisu"に代入しています。
その"hikisu"を8行目の本引数に渡し、先ほど同様、1行目の仮引数に値が渡って出力されます。
では、先ほど説明した本引数と仮引数の名前は同じでなくてもOKというのはどういうことか?コードでみていきます。
def tashizan(abc)
puts abc + abc # =>20が出力される
end
hikisu = 10
tashizan(hikisu)
仮引数の値が本引数と異なっていても値が渡るか調べるため、1行目の引数名を"hikisu"から"abc"に変更してみました。
無事、先ほどと同じように20が出力されていますね。
このことから、呼び出す際のメソッド名(tashizan)が合っていれば、仮引数と本引数の名前は必ずしも同じでなくても値は渡るということがわかったかと思います。
##まとめ
上記の例で仮引数の名前を変更しても値が渡ることがわかりました。
これはつまり、本引数(hikisu)は数値10を渡す式であり、その値が仮引数(abc)にコピーされているイメージです。
よって、仮引数の名前を変更しても本引数には反映されないということを表しています。
今回は引数のイメージにフォーカスして、なるべく伝わりやすく書いたつもりです。
引数を理解できると様々なことに応用できるようになるので、慣れるまで復習し続けることが大切だと思います。