今回の問題
次のプログラムを実行するとどうなりますか
$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を受験される方はこちらものぞいてみてくださいね。