tanihito’s blog

デジタル・新規事業開発・健康など、興味のあることについてつらつらと書いてきます。

Ruby技術者認定試験 Silver の勉強方法

Ruby技術者認定試験 Silverに合格しました!標準ライブラリについての問題がほとんどなので、普段Rubyを使っている人ならば2,3日で合格できます。

勉強方法

Ruby技術者認定試験 公式ガイドをやりました。Silver/Gold対応の参考書もありますが、Goldにしか出ない内容も書かれているため勉強しにくいようです。

  1. 公式ガイドをざっと読む
  2. 巻末の問題集をやる。考えて分かる問題はないので、分からなければすぐに解答を見る。
  3. 新しく知った内容をまとめる。
  4. 解けなかった問題だけリストアップして再度問題集をやる。

振り返り

  • 勉強内容をまとめるのは良い。同じところで何度も詰まることがなくなる。
  • 勉強した時間を測定しておくべきだった。どれくらいの勉強時間で合格できるかの参考になるはず。

勉強内容のまとめ

演算子

比較演算子の比較。

  • == 同じものか調べる
  • === 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