※初心者向け
※アウトプット練習の為
開発環境
rails 6.1.4.1
ruby 2.6.5
##問題内容##
以下のプログラムを実行するとエラーが起きます。
①エラーが起きた原因
②正しいソースコード(引数を用いたコードにしましょう)
をそれぞれ答えてください。
実行したプログラム
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ステップです。
1.メソッドの呼び出しをメソッド名(渡したい値)と書く
2.メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く
では今回の問題に当てはめてみましょう。
1. メソッドの呼び出しをメソッド名(渡したい値)と書く
今回、calculate_price_with_taxメソッドに渡したい値は変数priceなので、以下のようにメソッドを呼び出します。
calculate_price_with_tax(price)
2. メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く
今回は値段の値を受け取りたいので、変数名はpriceにします。今回はメソッドの外の変数名priceと一緒ですが、別の名前にしても大丈夫です。
def calculate_price_with_tax(price)
tax = 0.1
puts price + price * tax
end
よって引数を使って以下のように書き換えれば、問題文のソースコードのエラーは解決します。
price = 300
def calculate_price_with_tax(price)
tax = 0.1
puts price + price * tax
end
calculate_price_with_tax(price)