LoginSignup
0
0

More than 3 years have passed since last update.

メソッドに引数を渡し演算の結果を返り値として受け取る

Posted at

引数がよく分からない

「Mr.Yuki」と出力したいのですが…

1 def rename(name)
2  name = "Mr.#{name}"
3 end
4
5 name = "Yuki"
6 rename(name)
7 puts name
Yuki

この構文では、出力にMr.はつかない「Yuki」になります。

1 def rname(name)         # renameメソッドで受け取る変数name
2   name ="Mr.#{name}"    # renameメソッドで受け取る変数name
3 end

メソッドの変数には引数で渡した値のコピーが代入されている。

5 name = "Yuki"    #このnameは全て引数のname
6 rename(name)
7 puts name

要するに、引数のnameと変数nameは同じ名前だが別物である

順番を追って解説。

  • 5行目:引数nameに文字列 "Yuki"が代入される
  • 6行目:このnameを引数として、メソッドrenameを呼び出す  この時にnameのなかに入っている値がコピーされる
  • 1行目:コピーされた"Yuki"はメソッドrenameの変数nameに代入される。  よって引数nameとメソッドで使われる変数nameが同じ値となり、メソッドに値を渡すことができる
  • 2行目:ただし、変数nameの値を変えても、引数のnameは別物なので、引数nameには影響がない

ではどうすれば期待通りの結果が得られるのか?

詳しく解説。

1 def rename(name)
2   name = "Mr.#{name}"
3 end
  • 2行目:メソッドrenameでは引数から受け取ったnameにMr.をつけた文字列を返り値としてメソッドの呼び出し元に返す。
6 name = rename(name)
  • 修正前はrename(name)と、単にメソッドrenameを呼び出しただけだったが、今回はname = rename(name)とメソッドからの返り値をnameに代入している
1 def rename(name)
2  name = "Mr.#{name}"  # ③5行目の結果を受けて、"Mr.Yuki"が左辺の`name`に代入される
3 end
4
5 name = "Yuki"       # ①「=」が1つの式は右辺から読む。”Yuki"を変数nameに代入
6 name = rename(name)   # ②renameは1行目のメソッド。このメソッドの答えと、引数(name)(※5行目で定義)の値を左辺の変数nameに代入
7 puts name          # ④putsで返り値を出力される
Mr.Yuki

これでnameの値が、メソッドrenameによってMr.をつけた文字列になる。

さいごに

ここは本当にわかりづらい。
nameがたくさん出てくる。それが別物だと頭で理解できなかった。
処理に番号ふって、順番で示したらいくらか入ってきた。
ここは復習が必要そうです。

0
0
2

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