Just do IT

思うは招く

RExの問題を振り返る1

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が返るようになっているため、ここで処理が終わっている。

ちなみに、$グローバル変数を宣言している。プログラムのどこからでも参照できるので、あまり使わないほうがよさげ。

docs.ruby-lang.org