Ruby技術者認定試験 Silver の勉強方法
Ruby技術者認定試験 Silverに合格しました!標準ライブラリについての問題がほとんどなので、普段Rubyを使っている人ならば2,3日で合格できます。
勉強方法
Ruby技術者認定試験 公式ガイドをやりました。Silver/Gold対応の参考書もありますが、Goldにしか出ない内容も書かれているため勉強しにくいようです。
- 公式ガイドをざっと読む
- 巻末の問題集をやる。考えて分かる問題はないので、分からなければすぐに解答を見る。
- 新しく知った内容をまとめる。
- 解けなかった問題だけリストアップして再度問題集をやる。
振り返り
- 勉強内容をまとめるのは良い。同じところで何度も詰まることがなくなる。
- 勉強した時間を測定しておくべきだった。どれくらいの勉強時間で合格できるかの参考になるはず。
勉強内容のまとめ
演算子
比較演算子の比較。
- == 同じものか調べる
- === case式でオブジェクトをテストする
- eql? ハッシュの内部で「同じキーかどうか」を調べる
- equal? オブジェクトの同一性を調べる
以下の演算子は再定義できない。
引数
C言語と違い、ARGVにはプログラム名は入っていない。コマンドライン引数のみ入っている。
ruby foo.rb foo bar #=> "ARGV[0]: foo" #=> "ARGV[1]: bar"
String
String#indexの第2引数にはoffsetを渡す。
s = "abcabc" s.index("a") #=> 0 s.index("a", 1) #=> 3
文字列を置換する様々な方法
s = "abcdef" s[1..2] = "X" # 1文字目から2文字目を置換 p s #=> "aXdef" s = "abcdef" s[1,3] = "X" # 1文字目から3文字分を置換 p s #=> "aXef" s = "abcabc" s["bc"] = "X" # 部分文字列"bc"と最初に一致した箇所を置換 p s #=> "aXabc" s = "abcabc" s[/b./] = "X" # 正規表現にマッチした箇所を置換 p s #=> aXabc"
String#splitの第2引数にはlimitを渡す。
"foo\nbar\nbaz".split("\n") #=> ["foo", "bar", "baz"] "foo\nbar\nbaz".split("\n",2) #=> ["foo", "bar\nbaz"]
chop vs chomp
# chopは行末の1文字を削除する。chompは行末の行区切り文字のみ削除する。 "abc".chop #=> "ab" "abc".chomp #=> "abc" # 行末が\r\nの場合はchop, chompともに2文字削除する。 "abc\r\n".chop #=> "abc" "abc\r\n".chomp #=> "abc" # chomp("")とした場合、末尾の連続する改行コードをすべて取り除く。 "abc\n\r\r\n".chop #=> "abc\n\r" "abc\n\r\r\n".chomp #=> "abc\n\r" "abc\r\n\r\n".chomp("") #=> "abc"
Array
map = collect. find = detect. find_all = select.
a = [1, 2, 3, 4] a.map { |i| i * 2 } #=> [2, 4, 6, 8] a.collect { |i| i * 2 } #=> [2, 4, 6, 8] a.find { |i| i % 2 == 0 } #=> 2 a.detect { |i| i % 2 == 0 } #=> 2 a.find_all { |i| i % 2 == 0 } #=> [2, 4] a.select { |i| i % 2 == 0 } #=> [2, 4]
compactメソッドは配列からnilを取り除く
[1, nil, "b"].compact #=> [1, "b"]
sliceメソッドは、[]メソッドの別名。
a = ["a", "b", "c", "d", "e"] a[0, 2] #=> ["a", "b"] a.slice(0, 2) #=> ["a", "b"]
Hash
Hash#sortの出力はArrayになる
h = {b: 2, a: 1, c: 3} h.sort #=> [[:a, 1], [:b, 2], [:c, 3]]
Hash.newの引数がデフォルトの値になる
h = Hash.new h[:foo] #=> nil h = Hash.new(:bar) h[:foo] #=> :bar
File
File.openの様々なモード。
# fooと書かれたfoo.txtがあった場合 # rモード:読み込みのみ。デフォルト。 File.open("foo.txt", "r") do |f| p f.read(2) #=> "fo" #f.write("ba") #=> IOError: not opened for writing end %x"cat foo.txt" #=> "foo\n" # wモード:書き込みのみ。ファイルは初期化される。 File.open("foo.txt", "w") do |f| # p f.read(2) #=> IOError: not opened for reading f.write("ba") end %x"cat foo.txt" #=> "ba" # aモード:書き込みのみ。ファイル末尾に追記される。 File.open("foo.txt", "a") do |f| # p f.read(2) #=> IOError: not opened for reading f.write("ba") end %x"cat foo.txt" #=> "foo\nba" # r+モード:読み込み、書き込み両方できる。 File.open("foo.txt", "r+") do |f| p f.read(2) #=> "fo" f.write("ba") end %x"cat foo.txt" #=> "foba" # w+モード:読み込み、書き込み両方できる。ファイルは最初に初期化される。 File.open("foo.txt", "w+") do |f| p f.read(2) #=> nil f.write("ba") end %x"cat foo.txt" #=> "ba" # a+モード:読み込み、書き込み両方できる。書き込みはファイル末尾から行う。 File.open("foo.txt", "a+") do |f| p f.read(2) #=> "fo" f.write("ba") end %x"cat foo.txt" #=> "foo\nba"
Regexp
\Aは文字列の先頭にマッチする。^は文字列の先頭か改行文字の直後にマッチする。
/^abc/ =~ "\n\nabc" #=> 2 /\Aabc/ =~ "\n\nabc" #=> nil
Mix-in
includeはクラスに、extendはインスタンスに使用する。
module Greeting def hello; puts "Hello"; end end class Foo include Greeting end f = Foo.new f.hello #=> Hello class Bar; end b = Bar.new b.extend Greeting b.hello #=> Hello