Rubyで使われている引数についてまとめてみました。
参考記事
https://qiita.com/rtoya/items/33617078501776fdcad7
http://techracho.bpsinc.jp/baba/2013_12_26/15026
初心者の方がおそらく最初に習う引数
#hogeという命令はmsgを出力する
def morning(msg)
puts msg
end
#msgはおはーという文章を出力する
morning = "おはよー"
#hogeを実行する
morning(morning)
仮引数と実引数(本引数)は一緒じゃなくてよかったですもんね。
morning(morning)のカッコでくくってるところのmorningが実引数で
msgが仮引数
私は頭の中でこう考えてます。間違ってましたらご指摘いただけると幸いです・・・・
#仮引数領域がここから〜〜〜
def morning(msg)
puts msg
end
#〜〜〜ここまで
#実引数領域がここから〜〜〜
morning = "おはよー"
morning(morning)
#〜〜〜ここまで
何をいいたいのか?というと、
def morning(msg)で宣言しているのに
puts morning
end
っとしてしまうとエラーが起きてしまいますよ〜っということです。
間違っている例
def morning(msg)
puts morning
end
morning = "おはよー"
morning(morning)
エラーが出ます。
↓
wrong number of arguments (given 0, expected 1) (ArgumentError)
実引数で使用するものがmsgならmsgを中身でも使わないといけないということですね。
最初は自分も割と混乱してました・・・・。
デフォルト引数
def hello(hello = "こんにちは")
puts hello
end
hello
def外に宣言せずに、直接仮引数側で引数を設定するやり方みたいですね。
デフォルト値をつけないキーワード引数
def hello(hello: )
puts hello
end
hello(hello: "こんにちは")
こんなふうに、デフォルトで引数を定めなくても利用できるみたいですね。
ハッシュを使って引数指定
def evening(evening: "こんばんは")
puts evening
end
evening
ハッシュで使用できるので、データの取り出しに便利ですね。
ハッシュを使って引数指定②
def morning_hello(morning:"おはー", hello:"こんにちは")
puts "#{morning}、そして#{hello}"
end
morning_hello
こんなふうに、ハッシュなら順番をきにせずデータを自由に取り出せるみたいです。
可変引数
def morning_hello_evening(*msg)
puts msg
end
morning_hello_evening('morning','hello','evening')
こちらの記事を参照いたしました。わかりやすいです。
https://shinkufencer.hateblo.jp/entry/2018/09/15/230150
どうやら配列でデータを格納しているみたいですね。
可変長引数 2(配列で格納されているものをそれぞれ出力してみる)
本当に配列で格納されているのか?疑い深い私は実際に試しました。
def morning_hello_evening(*msg)
puts "配列に格納されている#{msg[0]}"
puts "配列に格納されている#{msg[1]}"
puts "配列に格納されている#{msg[2]}"
end
morning_hello_evening('morning','hello','evening')
↓
解説
morning_hello_evening('morning','hello','evening')
が
# msg = ['morning','hello','evening']
っとなっており、0がmorning、1がhello、2がeveningとなっている
オプション引数
def morning_hello_evening(**msg)
puts msg
end
morning_hello_evening(morning: 'morning',hello: 'hello',evening: 'evening')
こんな感じで
ちょっと、可変長引数と、オプション引数がわかりずらかったので調べました・・・・
可変長引数が配列
なのに対して
オプション引数はハッシュ
で複数の引数を受け取れる
っという違いであってますでしょうか?
間違ってたらすいません。。
ブロック引数
def morning(&block)
block.call
end
morning{ p 'おはー' }
知識不足でブロック引数を使うメリットがよくわかりませんでした・・・
追々勉強しなおしていこうかと・・・
ブロック引数(yield使用ver)
def morning(&block)
yield
end
morning{ p 'おはー' }
こちらも同上です、追々使用メリットがわかるよう日々学習していきます。
以上です。
もし、これは違う、これはこうしたほうが良い等々ございましたらご指摘いただけますと幸いです。
最後までみていただき、ありがとうございます。