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