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


引数がよく分からない

「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がたくさん出てくる。それが別物だと頭で理解できなかった。
処理に番号ふって、順番で示したらいくらか入ってきた。
ここは復習が必要そうです。