最初に
2020/6にRuby技術者認定試験 Silverを受けて、合格しました。
自分的には、めちゃくちゃ簡単だった記憶です。
問題は貰えないですが、出題された内容の中で印象的なのを少し覚えて、当時メモしました。
せっかくなので、そのメモを元に記事で残すことにしました。
今は2022年の年始ですが、2020年のRubyのアドベントカレンダーPart2がスカスカで、せっかくなので登録しておきます!! どうせなら、この記事がちょっと目立つように!
実際に出題された内容
Arrayのgrepメソッドの理解
問題
下記は、どのような出力がなされるか。
a = ["foo", "foo", "bar", "foo", "baz"]
p a.count("foo")
p a.grep(/f/)
p a.grep(/f/).count
(実際は選択肢問題でしたけど、詳細は覚えてません。
確かなのはArrayのcountやgrepのメソッドの理解を問われるものでした。)
正解と雑感
正解は、
a = ["foo", "foo", "bar", "foo", "baz"]
p a.count("foo") #=> 3
p a.grep(/f/) #=> ["foo", "foo", "foo"]
p a.grep(/f/).count #=> 3
Array
のgrep
は、引数の条件に当てはまるもの全てを列挙する配列を返すメソッドでした。
しかし、試験を受けた当時、grep
の理解が浅く、最初に条件に当てはまる要素を1つ返すメソッドと勘違いして間違えました。
ちなみに、引数ではなくブロックですが、最初に条件に当てはまる要素を1つ返すArray
のメソッドは、find
です。エイリアスでdetect
です。
ちなみに、grep
の使い方として、methods
メソッドと組み合わせて、メソッドを調べるときに便利です。
例えば、文字列クラスのインスタンスにはどんなeach系メソッドがあるんだろうって思ったときに、次のような感じでgrepと正規表現を組み合わせて調べられます。
p ''.methods.grep(/each/).sort
#=> [:each_byte, :each_char, :each_codepoint, :each_grapheme_cluster, :each_line]
Arrayのインスタンスメソッド
問題
出力が[130, 70, 100]
となるように、
__(1)__
に該当する選択肢のうちどのメソッドか。(複数選択)
a = [130, 50, 10, 70, 100]
a.__(1)__{|t| t < 70 }
p a #=> [130, 70, 100]
- reject
- reject!
- delete_if
- delete_if!
- slice
- slice!
正解と雑感
reject!
とdelete_if
です。
これは、しっかり勉強してるところで、エイリアスなのもわかっているので、簡単でした。
条件に当てはまる破壊的メソッドを選ぶ問題。
なお、delete_if
は破壊的メソッドで、delete_if!
は存在しません。
reject!
とdelete_if
がエイリアス。
文字列のsplitメソッドの挙動などの理解
問題
以下の出力は、どうなるか。
s = "str1\tstr2\tstr3"
p s.split
p s.split(//)
(全ての問題が選択式ですが、この問題も選択肢等の詳細は覚えてません)
正解と雑感
合格教本かRExあたりの練習問題でも出題されてたはずですが、
実際の試験問題はシンタックスハイライトが効いてなかったので、少し難しく感じました。
正解は、次の通り。
s = "str1\tstr2\tstr3"
p s.split #=> ["str1", "str2", "str3"]
p s.split(//) #=> ["s", "t", "r", "1", "\t", "s", "t", "r", "2", "\t", "s", "t", "r", "3"]
Stringのsplit
は、引数がなかったときに、改行や半角スペース・タブで区切ります。
実際の試験問題はシンタックスハイライトが効いてないので、特殊文字\t
によるタブの存在が希薄。
希薄なタブの存在を見抜いた上で、split
の引数なしが何で区切るかを把握しておく必要がありました。
区切りが//
や''
のときは、1文字ずつに区切られます。
?Aの意味
問題
次のコードは、何が出力されますか。
p ?A
"A"
65
?A
- 例外が発生する。
答えと雑感
p ?A #=> "A"
合格教本(RExでも)の練習問題と全く同じ問題で、知ってるか知らないかだけの知識問題です。
本番で見たときは「サービス問題だ」と思った記憶があります。
普通の業務コードには出てこないと思いますが、Rubyのゴルフのコードの知見がある方には常識的な問題です。
1文字の文字列は、?
始まりの特殊なリテラルがあります。
?A
は、'A'
と同じ文字列です。
なお、Ruby技術者認定試験は未だ2.1ですが、
Rubyの文字列などの仕様が大幅に違ったさらに昔の1.8時代において?A
は文字コード65
を返していました。
最後に
当時のメモを読む限り、次のような問題もでたようです。
- 例外処理 rescue
- ファイルの指定(a, a+, w, w+, r, r+)
大半が練習問題ででるような問題で、Rubyのバージョンは2.1のままだし試験の問題も変わらなそうなので、合格教本やRExといった有名な問題を解けるように目標を設定してしっかり対策しておけば簡単に合格できる印象です。
以上です。読んでいただいて、ありがとうございました。