LoginSignup
0
0

More than 1 year has passed since last update.

Ruby5

Last updated at Posted at 2023-01-29

問題

以下のプログラムを実行するとエラーが起きます。
①エラーが起きた原因
②正しいソースコード(引数を用いたコードにしましょう)
をそれぞれ答えてください。

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 メソッド名(受け取った値を入れる変数名)と書く

メソッドの外から中に変数priceを渡すことで問題は解決
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)

少々難しく感じますが、一つ一つ整理していくと理解しやすいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0