0
0

More than 3 years have passed since last update.

【初心者向け】Rubyの引数についてまとめてみました。

Posted at

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 'おはー' }

こちらも同上です、追々使用メリットがわかるよう日々学習していきます。

以上です。
もし、これは違う、これはこうしたほうが良い等々ございましたらご指摘いただけますと幸いです。

最後までみていただき、ありがとうございます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0