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