Ruby

Rubyの引数を理解する(できるだけわかりやすく)

More than 1 year has passed since last update.

引数がとても苦手だったのですが、引数を使えるといろんなことの幅が広がりそうな気がしたし、苦手なままでいるのはやばい感じがしたので、克服するために勉強をしました。それの備忘録として書き残します。

わかんなかったらコメントください。わかる範囲で答えます。

rubyではメソッド内で定義していないものを使うことはできない。従ってこんな感じのものはエラーになる。

ruby
def hoge
  puts huga
end

huga = "眠い"

hoge    #エラーになる

hogeメソッドはhugaをputsしたいわけなんですが、hugaはhogeメソッドの中で定義されたものではありません。もちろんhugaの定義をhogeの中ですればOKです。が、それだと引数の説明にならないのでこのまま引数を使ってエラーを解決します。

引数には本引数と仮引数があるみたいです。
本引数は・・・・・・・
書くより見た方がいい気がするのでとりあえずコード。。

ruby
def hoge(仮引数)
  puts huga
end

huga = "眠い"

hoge(本引数)

こんな感じです。
本引数は、多分メソッドを呼ぶ方に書きます。仮引数は呼ばれて飛びでるメソッドの方に書きます。

実際に本引数と仮引数を入れてみます

ruby
def hoge(huga)
  puts huga
end

huga = "眠い"

hoge(huga)

今回のhogeメソッドはputs hugaをしたいわけですが、hugaがメソッド外で定義されているせいでエラーが起きていましたので、メソッドを呼び出す方の本引数にhugaを入れて、仮引数の方にもhugaを入れました。これによって最終行の引数の全てにhugaが入った状態になります。なのでエラーが出ずにターミナルには「眠い」と表示されます。

ここまでは、本引数と仮引数を同じ名前にしましたが、名前が異なっていても使えます。
例えばこんな感じ

ruby
def hoge(kotoba)
  puts kotoba
end

huga = "眠い"

hoge(huga)

本引数 : huga
仮引数 : kotoba

本引数と仮引数の名前が異なるようにしました。これに伴ってもう一つ変わったところがあります。
hogeメソッドないのputsの右側が「kotoba」に変わりました。
これは、メソッドの中で引数として渡ってきたものを使うためには仮引数と同じ名前でないと使えないからです。
例えば以下のようにするとエラーになります。

ruby
def hoge(kotoba)
  puts huga
end

huga = "眠い"

hoge(huga)    #エラーになる

仮引数はkotobaなのにputsの右側がhugaになってます。やっぱりhugaはhogeメソッドの中で定義されていないのでエラーです。
当然ながらこれもダメです。

ruby
def hoge(huga)
  puts kotoba
end

huga = "眠い"

hoge(huga)    #エラーになる

相変わらずputsの右側のkotobaはhogeメソッドで定義されていません。

ってなわけでおさらいをすると

1.メソッドで使いたいメソッド外部の変数名など本引数の名前が一致していること
2.仮引数とメソッド内において仮引数で渡されたものを使いたいところの名前が一致していること

上記2点が守れていれば、本引数と仮引数の名前が異なっていても問題なく動きます。

念押しするとこういうこと

ruby
def hoge(name2)
  puts name2
end

name1 = "眠い"

hoge(name1)

name1同士は同じ名前
name2同士も同じ名前

こうなっていればOKです。

以上です。

追記
1.本引数は実引数ということの方が多いようです。

2.本引数の中にはローカル変数だけでなく式を書くこともできます。なので何か変数名をいれなくても仮引数を書いたメソッドで使いたいものを本引数の部分に式として書いても使えます。例えば以下のように。

hoge.rb
def hoge(name)
  puts "私の名前は#{name}です"
end

puts hoge("ヤマダ")

ターミナル
ruby hoge.rb
私の名前はヤマダです

本引数の部分には変数名などではなく文字列をそのままいれていますが、 問題なく結果が出ています。