讃岐小僧のEngineering×Techメモ

未経験から挑戦中のプログラミングや、趣味の野球や狩猟について、その他、ビジネスやテクノロジーをテーマに様々なことをつぶやく場所です。

【Ruby Silver 試験】any?, self.method_name, [*1..100]とか

今回の問題

次のプログラムを実行するとどうなりますか

$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

選択肢
10が表示される

選択肢
1が表示される

選択肢
0が表示される

選択肢
3が表示される

今回も例のごとく答えから先にいうと、出力されるのは3です!

今回の記事はここに至るまでの過程をメモしていく。

あれ、Rubyって$とか使うんだっけ?

この$ってなによ?
わかんないから調べた。

$val = 0

あ、グローバル変数っていう意味でしたか。。 こちら見ました。

これ多分、超絶初歩中の初歩ですよね、、笑
そうです。僕のクオリティなんてそんなもん。
前向きに、ポジティブに進んでいくよ。

配列の[* ]について

こういうのはRangeオブジェクトだけど 1..100、[*1..10]とすることで配列オブジェクトとして扱える。

puts (1..100).class
puts [*1..100].class

=> Array
=> Range

配列メソッドのany?

【Rubyリファレンス】:any? (Enumerable)

any?メソッドは、ブロック引数に要素を入れながらブロックを繰り返し実行し、ブロックが真が返したときは繰り返しを中断してtrueを返す

ブロックの戻り値がすべて偽であるとき、あるいはレシーバが空であるときにはfalseを返す。

次の例は、配列の要素に10文字以上の文字列があるかどうかを調べます。

any?メソッドは、ブロック引数itemに要素を入れながらブロックを繰り返し実行し、ブロックが真が返したときは繰り返しを中断してtrueを返します。ブロックの戻り値がすべて偽であるとき、あるいはレシーバが空であるときにはfalseを返します。

下記はfalseのサンプル

animals = ["dog", "cat", "mouse", "pig"]
puts animals.any? {|w| w.size > 10 }

=> false

下記はtrueのサンプル

animals = ["dog", "cat", "mouse", "pig", "hippopotamus"]
puts animals.any? {|w| w.size > 10 }

=> true

クラスメソッドを定義するdef self.method_name

今回のケースではself.upと定義されている。
グローバル変数の$val に1を毎回追加し、もしその値が3であったらTrueを返す、3であったらfalseを返す。

class Count
  def self.up
    $val = $val + 1
    $val == 3 ? true : false
  end
end

また今回は、大本がArray.any? doのブロックから呼び出されているのでtrueを返した時点でブロックは終了する。 そのため、$valはおのずと3で止まる

ブロックが3を返した時点で止まっているかどうかもう一度確認する

$val = 0

class Count
  def self.up
    $val = $val + 1
    p $val              #ここを追加
    $val == 3 ? true : false
  end
end

[*1..10].any? do
  Count.up
end

=> 1
=> 2
=> 3

ちゃんと止まっている。

この記事はここまで

当ブログではRuby Silverの受験に向けてインプットした内容を記事にメモしているのでRuby Silverを受験される方はこちらものぞいてみてくださいね。