REx - Ruby Examinationで出てきた問題を振り返る。
問題
$val
はどんな値になりますか?
$val = 0 class Count def self.up $val = $val + 1 $val == 3 ? true : false end end [*1..10].any? do Count.up end p $val
解答
答えは3。
なぜそうなるのか、ひとつずつ見ていく。
まずこちら。
class Count def self.up $val = $val + 1 $val == 3 ? true : false end end
ここでポイントになるのは、三項演算子の部分。
$val == 3 ? true : false
$val
の値が3の場合、trueを返す。それ以外は false を返す。
Ruby 三項演算子のシンプルな例 - Just do IT
つぎに、実際の実行部分。
[*1..10].any? do Count.up end
[*1..10]
は、1〜10の数値が入った配列を作成している。
irb(main):001:0> [*1..10] => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
つまり、冗長に書くと以下と同じ。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].any? do Count.up end
any?
については、以前に記事を書いている。
Ruby の any? メソッドの動き - Just do IT
すべての要素が偽である場合に false を返します。真である要素があれば、ただちに true を返します。 ブロックを伴う場合は、各要素に対してブロックを評価し、すべての結果が偽である場合に false を返します。ブロックが真を返した時点で、ただちに true を返します。
Enumerable#any? (Ruby 2.7.0 リファレンスマニュアル)
p
メソッドで表示してみるとわかりやすい。
[*1..10].any? do p Count.up end => false false true
3の場合にtrueが返るようになっているため、ここで処理が終わっている。
ちなみに、$
はグローバル変数を宣言している。プログラムのどこからでも参照できるので、あまり使わないほうがよさげ。