引数がとても苦手だったのですが、引数を使えるといろんなことの幅が広がりそうな気がしたし、苦手なままでいるのはやばい感じがしたので、克服するために勉強をしました。それの備忘録として書き残します。
わかんなかったらコメントください。わかる範囲で答えます。
rubyではメソッド内で定義していないものを使うことはできない。従ってこんな感じのものはエラーになる。
def hoge
puts huga
end
huga = "眠い"
hoge #エラーになる
hogeメソッドはhugaをputsしたいわけなんですが、hugaはhogeメソッドの中で定義されたものではありません。もちろんhugaの定義をhogeの中ですればOKです。が、それだと引数の説明にならないのでこのまま引数を使ってエラーを解決します。
引数には本引数と仮引数があるみたいです。
本引数は・・・・・・・
書くより見た方がいい気がするのでとりあえずコード。。
def hoge(仮引数)
puts huga
end
huga = "眠い"
hoge(本引数)
こんな感じです。
本引数は、多分メソッドを呼ぶ方に書きます。仮引数は呼ばれて飛びでるメソッドの方に書きます。
実際に本引数と仮引数を入れてみます
def hoge(huga)
puts huga
end
huga = "眠い"
hoge(huga)
今回のhogeメソッドはputs hugaをしたいわけですが、hugaがメソッド外で定義されているせいでエラーが起きていましたので、メソッドを呼び出す方の本引数にhugaを入れて、仮引数の方にもhugaを入れました。これによって最終行の引数の全てにhugaが入った状態になります。なのでエラーが出ずにターミナルには「眠い」と表示されます。
ここまでは、本引数と仮引数を同じ名前にしましたが、名前が異なっていても使えます。
例えばこんな感じ
def hoge(kotoba)
puts kotoba
end
huga = "眠い"
hoge(huga)
本引数 : huga
仮引数 : kotoba
本引数と仮引数の名前が異なるようにしました。これに伴ってもう一つ変わったところがあります。
hogeメソッドないのputsの右側が「kotoba」に変わりました。
これは、メソッドの中で引数として渡ってきたものを使うためには仮引数と同じ名前でないと使えないからです。
例えば以下のようにするとエラーになります。
def hoge(kotoba)
puts huga
end
huga = "眠い"
hoge(huga) #エラーになる
仮引数はkotobaなのにputsの右側がhugaになってます。やっぱりhugaはhogeメソッドの中で定義されていないのでエラーです。
当然ながらこれもダメです。
def hoge(huga)
puts kotoba
end
huga = "眠い"
hoge(huga) #エラーになる
相変わらずputsの右側のkotobaはhogeメソッドで定義されていません。
ってなわけでおさらいをすると
1.メソッドで使いたいメソッド外部の変数名など本引数の名前が一致していること
2.仮引数とメソッド内において仮引数で渡されたものを使いたいところの名前が一致していること
上記2点が守れていれば、本引数と仮引数の名前が異なっていても問題なく動きます。
念押しするとこういうこと
def hoge(name2)
puts name2
end
name1 = "眠い"
hoge(name1)
name1同士は同じ名前
name2同士も同じ名前
こうなっていればOKです。
以上です。
追記
1.本引数は実引数ということの方が多いようです。
2.本引数の中にはローカル変数だけでなく式を書くこともできます。なので何か変数名をいれなくても仮引数を書いたメソッドで使いたいものを本引数の部分に式として書いても使えます。例えば以下のように。
def hoge(name)
puts "私の名前は#{name}です"
end
puts hoge("ヤマダ")
ruby hoge.rb
私の名前はヤマダです
本引数の部分には変数名などではなく文字列をそのままいれていますが、 問題なく結果が出ています。