tanihito’s blog

IT・Web・英語・筋トレなど、興味のあることについてつらつらと書いてきます。

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

Ruby技術者認定試験Goldに合格しました!Silverに比べると、継承関係など暗記ではなく考えれば分かる問題が増えました。難易度は上がっていますが、クイズのようで面白い試験です。

勉強方法

Ruby公式資格教科書の演習問題を解いて、分からないところは解説を読みました。勉強時間は休日4日ほど。

勉強内容

環境変数
# 環境変数はENVにStringを渡して取得できる
ENV["HOME"] #=> "/Users/tanihito"
# Symbolではダメ
ENV[:HOME] #=> TypeError
文法

'-'を使って桁数を見やすく表示できる

100_000 #=> 100000
ブロック

{ ... } の方が do ... end ブロックよりも強く結合する。

def foo(arg)
  yield arg
end
# fooの引数は"arg"とブロック
foo "arg" do |msg| p msg end #=> "arg"
# ブロックは"arg"の引数とみなされる
foo "arg" { |msg| p msg } #=> SyntaxError

block_given?を使えば、メソッドにブロックが与えられたか判定できる。

def foo
  block_given? ? yield : "no block"
end  
foo #=> "no block"
foo {p "block"} #=> "block"
引数展開

実引数に'*'をつけると、配列を引数に展開できる。

def foo(a, *b)
  foo2(*b) # 配列[2, 3]を引数に展開
end

def foo2(c, d)
  d
end

foo(1, 2, 3) #=> 3
オープンクラス
  • オープンクラス:定義済みのクラスを再定義できるクラス
  • クラスの再オープン:一度定義したクラスを再定義のために開くこと
# クラスを定義
class Klass
  def foo; end
end

# クラスを再オープンしてメソッドを追加
class Klass
  def foo2; end
  alias :foo3 :foo
  undef :foo2
end

Klass.instance_methods(false) #=> [:foo, :foo3]
Module
  • moduleはnewできない
  • moduleは継承できない
  • moduleはincludeできる
Mix-in

includeするとmoduleをスーパークラスとの間に組み入れる。

module Bar1; end
module Bar2; end
class Foo; end

class FooExt < Foo
  include Bar1
  include Bar2
end

# ancestorsは変更されるが、superclassは変更されない
FooExt.ancestors #=> [FooExt, Bar2, Bar1, Foo, Object, Kernel, BasicObject]
FooExt.superclass #=> Foo
特異クラス
class Foo; end
foo1 = Foo.new
foo2 = Foo.new

# 特異メソッドは特定のインスタンスだけで使える
def foo1.foo1_method; 'foo1' end
foo1.foo1_method #=> "foo1"
foo2.foo1_method #=> NoMethodError

# 特異クラスのインスタンスメソッドとして実装される
Foo1Singleton = class << foo1; self; end
Foo1Singleton.instance_methods(false) #=> [:foo1_method]

# extendすると特異クラスにincludeしたことになる
module Bar; end
foo1.extend(Bar)
Foo1Singleton.ancestors #=> [Bar, Foo, Object, Kernel, BasicObject]
日付・時間
# Timeの単位は秒。内部的にFloatで時刻を持っている。
t = Time.mktime(2014, 1, 2, 3, 4, 5, 6)
t     #=> 2014-01-02 03:04:05 +0900
t + 1 #=> 2014-01-02 03:04:06 +0900
(t - t).class #=> Float

# Dateの単位は日。内部的にRationalで日付を持っている。
require 'date'
d = Date.new
puts d    #=> -4712-01-01
puts d +1 #=> -4712-01-02
(d - d).class #=> Rational