Help us understand the problem. What is going on with this article?

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

引数がよく分からない

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

yuki_bizz
GSのアルバイト〜店長、自動車整備士を経験、自動車メーカーで開発に携わっています。昔諦めたプログラマーになる夢を叶えるため2020.2/15から勉強を開始。
https://twitter.com/yuki_bizz
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away