気軽に楽しくプログラムと遊ぶ

自分が興味があってためになるかもって思う情報を提供しています。

Ruby Gold合格できました。感想と振り返り

感想

86点で合格。難しいとの前評判でかなり覚悟してましたが、
Silverのように知っていればさくっと解ける数行しかない問題も多かったので、助かりました。
Silverと比べるとAPIを問うような問題は少なく、数学のように論理で説いていけるような問題が多かったです。(オブジェクト指向、スコープ絡みなどがやはり多い)
標準添付ライブラリは模擬問題を解いて行った程度の知識でしたが、予想通り出題は少なかったため、なんとかなりました。

振り返ってみる

Yamlの概要

  • 構造化されたデータを表現するフォーマット
  • requireを行い、読み込む必要がある。

YAML#dumpの使い方

require 'yaml'
data = ["Taro", "Hanako", "Jiro"]
# YAMLフォーマット文字列を返却
str1 = YAML.dump(data) # => "---\n- Taro\n- Hanako\n- Jiro\n"

str2 = <<DOC
---
- Taro
- Hanako
- Jiro
DOC
# => "---\n- Taro\n- Hanako\n- Jiro\n"

p str1 == str2 # => true

const_missingの定義方法

  • const_missingはObjectのクラスメソッド
  • 任意のクラス内でObjectをレシーバーとしたクラスメソッドが呼べる。(レシーバー有無関係なしで呼べるんだね。クラス内に他のクラス名のレシーバーがあるのに違和感を感じてしまった)
class Bar
  def self.const_missing(name)
    "self.const_missing"
  end
end
# Barクラス内の定数Xを参照
Bar::X # => self.const_missing

class Bar
  def const_missing(name)
    "const_missing"
  end
end
# Barクラス内の定数Xを参照
Bar::X # => NameError: uninitialized constant Bar::X 
# const_missingはクラスメソッドでないと呼ばれない

class Bar
  def Object.const_missing(name)
    "Object.const_missing"
  end
end
# Barクラス内の定数Xを参照
X # => "Object.const_missing" Barクラス内でレシーバーObjectのメソッド呼べる。

クラスインスタンス変数の呼び出し

これはブログで前に書いた気がする。。

class MyClass
  @v = 1
  def foo
    @V
  end
  
  class << self
    @v = 2
    # 特異クラスへのメソッド定義はクラスメソッド定義
    def foo
      @v
    end
  end
end
MyClass.foo # => 1 

クラス変数はサブクラスでも共有

クラス変数はサブクラスで共有されるという意味がいまいちわかっていなかった。
クラス変数が使えるようになるだけでなく、値自体も共有している。
よって、オブジェクトが異なっても値が保持し続ける。以下で確認。

class C
  @@count = 0
  def initialize()
    @@count += 1
  end
  def class_val
    @@count
  end
end

class D < C
end

C.new
c = C.new
D.new
d =D.new
c.class_val # => 4
d.class_val # => 4

Foo::fooでメソッド呼べる

class Foo
  def self.foo
    puts "foo"
  end
end
Foo::foo # => foo
# mainにはfooはないので以下はNG
self.foo # => NoMethodError: undefined method `foo' for main:Object

Using Cは定義済オブジェクトに影響するか

class A
  def foo
    puts "A"
  end
end

class B < A
  def foo
    super
    puts "B"
  end
end

module M
  refine B do
    def foo
      super
      puts "M"
    end
  end
end

b = B.new
b.foo
# => A 
# => B 
using M
b.foo
# => A 
# => B 
# => M 

全然、影響する。
そして、refineしたBクラスのsuperはrefineする前のBクラスになっている。。うーん。わからん。

可変長引数は引数なしでもエラーにならない

class Foo
  def test(*arg)
  end
end
Foo.new.test() # => nil

エラーにならず、nilを返却。予想どおり。

気になるところは、確認できました。
どこが間違ったかわからないのはほんとどうにかして欲しい。。
せめて、どこの単元の復習が必要ですとかっていうレベルでもいいので、教えてくれる仕組みが欲しいですね。

ひとまず。自分、お疲れした。
これからは、railsrspecの勉強をしようと思います。