0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

処理に名前をつけて使おう

Posted at

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

実行したプログラム
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)
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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?