以下のプログラムを実行するとエラーが起きます。
①エラーが起きた原因
②正しいソースコード(引数を用いたコードにしましょう)
price = 300
def calculate_price_with_tax
tax = 0.1
puts 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
puts 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
puts price + price * tax
end
メソッドの中では、メソッドの外の変数を使うことができません(変数の使える範囲がスコープ)。
よって今回の問題文のソースコードでは、変数priceの定義はメソッドの外で行なっていたにも関わらず、メソッドの中で変数priceをそのまま使おうとしたことがエラーの原因でした。
②正しいソースコード
ではどうすればいいのでしょうか。
スコープの問題を解決するのが、メソッドの中と外を繋ぐ役割を持つ「引数」と「返り値」です。
①メソッドの外から中に値を渡す役割が「引数」
②メソッドの中から外に値を渡す役割が「返り値」
今回は、メソッドの外から中に変数priceを渡すことで問題は解決します。つまり、解決に必要なのは①の「引数」です。
引数の使い方は大きく2ステップです。
メソッドの呼び出しをメソッド名(渡したい値)と書く
メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く
では今回の問題に当てはめてみましょう。
1. メソッドの呼び出しをメソッド名(渡したい値)と書く
-
今回、calculate_price_with_taxメソッドに渡したい値は変数priceなので、以下のようにメソッドを呼び出します。
calculate_price_with_tax(price)
2. メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く
2. -
今回は値段の値を受け取りたいので、変数名はpriceにします。今回はメソッドの外の変数名priceと一緒ですが、別の名前にしても大丈夫です。
def calculate_price_with_tax(price)
tax = 0.1
puts price + price * tax
end
よって引数を使って以下のように書き換えれば、問題文のソースコードのエラーは解決します。
```rb
price = 300
def calculate_price_with_tax(price)
tax = 0.1
puts price + price * tax
end
calculate_price_with_tax(price)