0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?