問題
以下のコードを実行すると、ターミナルにはなんと表示されるでしょうか?
def rename(name)
name = "#{name}::Takayama"
return name
end
name = "Yukihiro"
rename(name)
puts name
予想
Yukihiro::Takayama
答え
Yukihiro
なぜ答えがYukihiroになったのか?
ポイントは変数に種類があるということ。また、それぞれ変数によってスコープ(適用範囲)が違うということだ。
変数の種類とスコープ
ローカル変数
書き方:小文字または_で始まる。 例:name
スコープ:宣言した位置からその変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終りまで。
インスタンス変数
書き方 : @で始まる。 例:@name
スコープ:同一のオブジェクト内
クラス変数
書き方:@@を前置 例:@@name
スコープ:クラス定義の中
グローバル変数
書き方:$で始まる変数 例:$name
スコープ:プログラムのどこからでも参照可能
先ほどの問題の変数の種類は?
def rename(name) #renameメソッドを引数(name)を追加して定義
name = "#{name}::Takayama" #文字列をnameに代入
return name #nameを戻り値として返す
end
nameとあるので変数の種類はローカル変数。つまりメソッド定義の終わりまでがスコープということになる。
メソッド定義rename(name)の中でname= "#{name}エンジニア"と定義されてはいるものの、このnameはメソッド定義の終わりまでしか参照されない。
よって後半部分にある
name = "Yukihiro" #文字列Yukihiroをnameに代入
rename(name) #メソッドrename(name)の呼び出し
puts name #変数nameの表示
rename(name)は何の意味も持たない。
ただ単にname = "Yukihiro"が呼び出されただけなので、答えがYukihiroとなった。
Yukihiro:Takayamaと表示させるにはどう入力すればいいのか?
返り値について
問題のコードの中でreurn nameとあるが、この部分もrubyの超基礎となるので記述する。
プログラミング言語には、返り値(戻り値)というものがある。
返り値(戻り値)とは関数やメソッドなどが処理を終了する際に、呼び出し元に対して渡す値のことである。
ruby以外の言語では関数の返り値はreturnメソッドで設定するが、Rubyではこのreturnを省略することができ、メソッド内で最後に実行された値が自動的に入るという設計になっている。
rubyの中での、returnは、返り値を返すという性質がある。