timesメソッドとは
数値オブジェクトに使うことができる、メソッド。do~end
で囲った処理を数値の数だけ繰り返す。
結論
あえて、最初に結論から述べる。
・ブロック変数ブロックパラメーターは、ブロックの中でのみ有効(スコープ)
・外で定義したものも、ブロックの中では使える(書き換えられることに注意)
このことを頭の片隅に置き、読み進めていって欲しい。
スコープ
スコープとは、定義した変数が使える範囲のこと。
ブロック
do~end
もしくは、{ }
(波括弧)の中をブロックと呼ぶ。さらに、ブロックの中で|変数名|
||(パイプライン)の中の変数をブロック変数ブロックパラメーターという。
STEP1
確実に理解するために、まずはここから。
num = 1
puts num
# =>1
こんなプログラム、変数のいちばん初めに出てくる。
丁寧に説明をすると、1という数値を変数numに代入し、それをputsで呼び出している。意識はしていないが、変数numの及ぶ範囲(スコープ)だから、putsで呼び出すことができる。
STEP2
num = 1
3.times do
puts num
end
# =>1
# 1
# 1
これは、puts num
が3回繰り返され、「1」が3回結果として出された。注目すべき点は、変数numのスコープ。do~end
の外で定義された変数を使うことができている。
STEP3
3.times do
num = 1
end
puts num
# =>NameError
STEP2と似たコードだが、エラーが出ます。↓
NameError (undefined local variable or method num for main:Object)
簡単に訳すと、「puts num
のnum
が定義されていないよ」ということ。
そうです、do~end
の中で定義されたものは、do~end
の外では呼び出すことができないということ。
実はつまずきポイント!!
STEP4
num = 1
3.times do|i|
num = num + i
end
puts num
# =>4
読み解くポイント
①ブロック変数ブロックパラメーターは0から始まり、1ずつ増える。上の例でいくと、1週目には「0」が、2週目には「1」が、3週目には「2」が代入されていると考える。
②外の変数は書き換えられている。
丁寧に書くと↓
1週目 num + 0 =>numが1と定義されているので、「1 + 0」がnumに代入される。
2週目 num + 1 =>上記より、numは1で、2週目なので、iが1に変わり、「1 + 1」がnumに代入される。
3週目 num + 2 =>上記より、numは2で、3週目なので、iが2に変わり、「2 + 2」がnumに代入される。
ポイント
-
ブロック変数ブロックパラメーターはその名の通り、ブロックの中でのみ有効。 - ブロックの外で定義した変数をブロック内の処理によって書き換えることができる。
最後に
繰り返し処理については、プログラミングを学習して、早い段階で覚える内容で、理解したつもりでも細かいところまでは覚えていないことがあるので、この機会に復習を。