問題
以下のプログラムを実行するとエラーが起きます。
①エラーが起きた原因
②正しいソースコード(引数を用いたコードにしましょう)
をそれぞれ答えてください。
price = 300
def calculate_price_with_tax
tax = 0.1
return price + price * tax
end
calculate_price_with_tax
模範解答
①エラーが起きた原因
メソッドの外側で定義した変数は、メソッドの内側では使えない。
そのため、1行目のpriceはcalculate_price_with_taxメソッドの中では使えずにエラーが起きてしまった。
②正しいソースコード
price = 300
def calculate_price_with_tax(price)
tax = 0.1
return price + price * tax
end
calculate_price_with_tax(price)
【解説】
メソッドの中と外は完全に別の世界となっています。
そのため、メソッドの中から外にある変数を使ったり、逆にメソッドの外から中にある値を使うことはできません。
唯一、メソッドの中と外を繋ぐ役割が「引数」と「返り値」です。
それを踏まえて今回の問題を解説していきます。
①エラーが起きた原因
解答の通り、エラーが起きた原因は変数priceです。今回の問題文のソースコードには変数priceが2度出てきます。
メソッドの外にある1行目のprice = 300と、メソッドの中にある5行目のprice + price * taxです。
price = 300
def calculate_price_with_tax
tax = 0.1
return price + price * tax
end
メソッドの中では、メソッドの外の変数を使うことができません
※変数の使える範囲をスコープと言います
よって今回の問題文のソースコードでは、変数priceの定義はメソッドの外で行なっていたにも関わらず、メソッドの中で変数priceをそのまま使おうとしたことがエラーの原因になります。
②正しいソースコード
つまりスコープの問題を解決するのが、メソッドの中と外を繋ぐ役割を持つ「引数」と「返り値」です。
・メソッドの外から中に値を渡す役割が「引数」
・メソッド内の処理を呼び出し元に渡す役割が「返り値」
メソッドの呼び出しをメソッド名(渡したい値)と書く
メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く
calculate_price_with_tax(price)
メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く
今回は値段の値を受け取りたいので、変数名はpriceにします。今回はメソッドの外の変数名priceと一緒ですが、わかりやすい名前であれば別の名前にしても大丈夫です。
price = 300
def calculate_price_with_tax(price)
tax = 0.1
return price + price * tax
end
calculate_price_with_tax(price)
少々難しく感じますが、一つ一つ整理していくと理解しやすいです。