その他
    ホーム 技術発信 DoRuby Ruby技術者認定試験(Gold)合格経験

    Ruby技術者認定試験(Gold)合格経験

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    Ruby技術者認定試験(Gold)合格経験

     【使用教材】

    Ruby リファレンスマニュアル(オンラインのドキュメント)

    Ruby公式資格教科書 Ruby技術者認定試験Silver/Gold対応

    メタプログラミングRuby

     【勉強方法】

    Ruby公式資格教科書

    教科書のとおりに、Gold範囲をしっかり読む。

    ガイドの説明をしっかり読んだほうが効率的です。

    3章、4章、5-9~5-12は重要です

    2章 実行環境 2,3問ぐらい

    * コマンドラインオプション

    * 組み込み変数/定数

    3章 文法 15問ぐらい

    * 変数と定数

    * 演算子

    * ブロック

    * 例外処理

    * 大域脱出

    4章 オブジェクト指向 (試験の肝の部分です)25問くらい。

    * メソッドの詳細

    * メソッドの可視性

    * クラスの詳細

    * クラスの継承

    * モジュールの詳細

    5-9~5-12 組み込みライブラリ 10問くらい。

    * よく使用されるクラス(Object、Kernel、Module等)

    * よく使用されるモジュール(Enumerable、Comparable等)

    * 数値

    * 正規表現

    正規表現は基本的な使い方以外にも、 *? や +? などの最短マッチも出題されます。

    6章 標準添付ライブラリ 2,3問ぐらい

    * よく使用されるライブラリ(socket、rdoc等)

    メタプログラミングRuby 

     オブジェクト指向について、教科書がない内容があります。

     自分はヨドバシで立って読みました。

    irbで試す(重要)

    自分が試した注意点を共有します。

    —————————————————————————-

    クラスメソッドはクラスしか呼び出さない。

    class C

    def self.m

    p “2”

    end

    end

    C.new.m # undefined method `m’ for #<c:0x1fd7a80> (NoMethodError)

    C.m # 2

    —————————————————————————-

    モジュールをクラスに extend すれば、モジュールのインスタンスメソッドがクラスメソッドになる

    module Foo

    def foo

    p “foo”

    end

    end

    class Hoge

    extend Foo

    end

    Hoge.new.foo #undefined method `foo’ for #<hoge:0x1f07868> (NoMethodError)

    Hoge.foo # foo

    —————————————————————————-

    initialize を定義しない場合は親クラスの initialize が自動で呼ばれます

    class M1

    def initialize

    p “m1”

    end

    end

    class M2 < M1

    end

    M2.new  #m1

    —————————————————————————-

    super と super() は動作が異なります

    super は現在のメソッドがオーバーライドしているメソッドを呼び出します。

    括弧と引数が省略された場合には現在のメソッドの引数がそのまま引き 渡されます。

    引数を渡さずにオーバーライドしたメソッドを呼び出すには super() と括弧を明示します。

    例:

    class Foo

    def foo(arg=nil)

    p arg

    end

    end

    class Bar < Foo

    def foo(arg)

    super(5) # 5 を引数にして呼び出す

    super(arg) # 5 を引数にして呼び出す

    super # 5 を引数にして呼び出す super(arg) の略記法

    arg = 1

    super # 1 を引数にして呼び出す super(arg) の略記法

    super() # 引数なしで呼び出す nil

    end

    end

    Bar.new.foo 5

    —————————————————————————-

    インスタンス変数

    class Sample

    @value = “hello”

    def value

    @value

    end

    end

    Sample.new.value #=> nil

    Sample.class_eval { @value } #=> “hello”

    クラス定義の中で初期化した、@valueは Sampleクラスオブジェクトのインスタンス変数で、

    メソッド定義の中で、初期化した、@valueはSampleクラスオブジェクトのインスタンスのインスタンス変数になる。

    インスタンス変数はクラス内で全メソッドで共通して使用することが出来ます。最初にどこかのメソッドで使用された時点でインスタンス変数は作成され、一度作成されたインスタンス変数は他のメソッドで値を取り出したり格納したりすることが出来るようになります。

    class Foo

    @v1=1

    def self.read; @v1;end

    def write; @v1=2;end

    def read; @v1;end

    end

    => nil

    irb(main):017:0> obj=Foo.new

    => #<foo:0x000000174ce908>

    irb(main):018:0> obj.write

    => 2

    irb(main):019:0> obj.read

    => 2

    irb(main):020:0> Foo.read

    => 1

    —————————————————————————-

    クラスとsuperクラス

    irb(main):032:0* foo=Foo.new

    => #<foo:0x0000001d9caf78>

    irb(main):033:0> foo.class

    => Foo

    irb(main):034:0> foo.superclass

    NoMethodError: undefined method `superclass’ for #<foo:0x0000001d9caf78>

    from (irb):34

    from /home/search/ruby/bin/irb:12:in `<main>’

    irb(main):035:0> Foo.class

    => Class

    irb(main):036:0> Foo.superclass

    => Object

    irb(main):037:0> Class.class

    => Class

    irb(main):038:0> Class.superclass

    => Module

    irb(main):007:0> Module.superclass

    => Object

    —————————————————————————-

    クラス変数。トップレベル:object 全てのクラスの親クラス。

    クラス変数は、親と子共有で使う

    irb(main):001:0> @@v1=1

    => 1

    irb(main):002:0> class Foo

    irb(main):003:1> @@v1=2

    irb(main):004:1> end

    => 2

    irb(main):005:0> p @@v1

    2

    => 2

    —————————————————————————-

    Object extend

    irb(main):001:0> module M

    irb(main):002:1> def m;”aa”;end

    irb(main):003:1> end

    => nil

    irb(main):004:0> obj=Object.new

    => #<object:0x00000011384670>

    irb(main):005:0> obj.extend M

    => #<object:0x00000011384670>

    irb(main):006:0> obj.m

    => “aa”

    irb(main):007:0> class C

    irb(main):008:1> extend M

    irb(main):009:1> end

    => C

    irb(main):010:0> C.m

    => “aa”

    irb(main):011:0> c.new.m

    NameError: undefined local variable or method `c’ for main:Object

    from (irb):11

    from /home/search/ruby/bin/irb:12:in `<main>’

    —————————————————————————-

    以下の2つのコード、include の位置を変えると表示される結果が異なります。

    コード1

    module M

    @@x = 100

    end

    class A

    @@x = 500

    include M

    end

    module M

    puts @@x # 100 と表示される

    end

    class A

    puts @@x # 100 と表示される

    end

    コード2

    module M

    @@x = 100

    end

    class A

    include M

    @@x = 500

    end

    module M

    puts @@x # 500 と表示される

    end

    class A

    puts @@x # 500 と表示される

    end

    —————————————————————————-

    モジュールで定義されたクラス変数(モジュール変数)は、そのモジュールをインクルードしたクラス間でも共有されます。

    module Foo

    @@foo = 1

    end

    class Bar

    include Foo

    p @@foo += 1 # => 2

    end

    class Baz

    include Foo

    p @@foo += 1 # => 3

    end

    —————————————————————————-

    親クラスに、子クラスで既に定義されている同名のクラス変数を追加した場合には、 子クラスのクラス変数は子クラスで保存されます。

    上書きされません。

    class Foo

    end

    class Bar < Foo

    @@v = :bar

    end

    class Foo

    @@v = :foo

    end

    class Bar

    p @@v #=> :bar

    end

    class Foo

    p @@v #=> :foo

    end

    —————————————————————————-

    トップレベルで定義すれば、Object中に定義され、親なので、子供も共有。下記は同じになる。

    @@v=1

    class Foo

    end

    class Bar < Foo

    @@v = :bar

    end

    class Foo

    @@v = :foo

    end

    class Bar

    p @@v #=> :foo

    end

    class Foo

    p @@v #=> :foo

    end

    p @@v #=> :foo

    irb(main):002:0> @@v=1

    => 1

    irb(main):003:0> class Foo

    irb(main):004:1> @@v=2

    irb(main):005:1> end

    => 2

    irb(main):006:0> @@v

    => 2

    irb(main):001:0> class Foo

    irb(main):002:1> @@v=1

    irb(main):003:1> end

    => 1

    irb(main):004:0> p @@v

    NameError: uninitialized class variable @@v in Object

    from (irb):4

    from /usr/bin/irb:12:in `<main>’

    —————————————————————————-

    irb(main):007:0> Module.class

    => Class

    irb(main):008:0> Class.class

    => Class

    irb(main):009:0> Class.superclass

    => Module

    irb(main):005:0> Class.ancestors

    => [Class, Module, Object, Kernel]

    irb(main):010:0> Module.superclass

    => Object

    irb(main):001:0> module Foo

    irb(main):002:1> @@foo = 1

    irb(main):003:1> end

    => 1

    irb(main):004:0> Foo.class

    => Module

    irb(main):006:0> Foo.ancestors

    => [Foo]

    irb(main):001:0> class Foo

    irb(main):002:1> end

    => nil

    irb(main):003:0> Foo.class

    => Class

    irb(main):004:0> Foo.ancestors

    => [Foo, Object, Kernel]

    —————————————————————————-

    可変引数

    可変長引数のデフォルト値は指定できません。

    引数は配列として扱われる。

    可変長引数は一つのメソッドは一つしか指定できません。

    def foo(*args)

    p args

    end

    def bar(*args)

    foo(args)

    end

    def hoge(*args)

    foo(*args)

    end

    実行結果は以下のとおり

    bar(1, 2, 3, 4, 5) #=> [[1, 2, 3, 4, 5]]

    hoge(1, 2, 3, 4, 5) #=> [1, 2, 3, 4, 5]

    foo, bar = [1, 2] # foo = 1; bar = 2

    foo, bar = 1, 2 # foo = 1; bar = 2

    foo, bar = 1 # foo = 1; bar = nil

    foo, bar, baz = 1, 2 # foo = 1; bar = 2; baz = nil

    foo, bar = 1, 2, 3 # foo = 1; bar = 2

    foo = 1, 2, 3 # foo = [1, 2, 3]

    *foo = 1, 2, 3 # foo = [1, 2, 3]

    foo,*bar = 1, 2, 3 # foo = 1; bar = [2, 3]

    —————————————————————————-

    合格者の合格経験を見る

    http://rochefort.hatenablog.com/category/gold

     【感想】

    Silverよりかなり難しいですが、試験内容は上記です。

    ですので、重要な部分を理解して、irbで注意点などしっかり把握すれば、合格できます。

    記事を共有