感想
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を返却。予想どおり。
気になるところは、確認できました。
どこが間違ったかわからないのはほんとどうにかして欲しい。。
せめて、どこの単元の復習が必要ですとかっていうレベルでもいいので、教えてくれる仕組みが欲しいですね。