【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を受験される方はこちらものぞいてみてくださいね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です