読者です 読者をやめる 読者になる 読者になる

局所変数3

Ruby
def double_this num
  num_times_2 = num*2
  puts num.to_s + 'の2倍は ' +num_times_2.to_s
end

double_this 44
puts num_times_2.to_s

最終行 "puts num_times_2.to_s"についてerrorが出ますね。

moomin:programmingRuby tomomi$ ruby method.rb
442倍は 88
method.rb:7: undefined local variable or method `num_times_2' for main:Object (NameError)

errorでは「num_times2 といった局所変数は定義されていませんよ」と言ってます。つまりnum_times2という局所変数はメソッドの中で定義したはずだが、その変数を使おうとしたところが(最終行のputs〜 のくだり)局所ではなかったということです。つまり、

  • 局所とは double_thisの中のみをいう
  • メソッドの中の変数は外からアクセスできない (putsで実行するとerrorが出てますね)

ふるまい例 1

あーなるほど。
自分で書いてみてやっと「外からアクセスできない」意味が分かった気がする。まずは分かったことをよしとします。

def exa var
  var = nil
  puts '変数のふるまい教えて!'
end

var = '外から変数にアクセスできませんよ'
exa var
puts var
moomin:programmingRuby tomomi$ ruby method.rb
変数のふるまい教えて!
外から変数にアクセスできませんよ

このプログラムについて

  • 同じ名前の変数が2つありますね
    • 1行目の var, 6行目のvar. しかしこの2つは無関係
  • exa var とメソッドを呼び出した時は 1つのexa varからもう1つへ文字列が渡される
    • 2つの変数はこのメソッド呼び出し通じてのみ言葉を交わすことができる
  • 結果、この2つの変数は同じ文字列を指すようになり、exa は自分の局所変数である varに対し nilを示すように代入しています。しかしこれは外側(7行目)にはなんの影響もしません