ナスカブログ

未来の自分へのドキュメント

Ruby Goldへの道 day8

以下のサイトでruby gold取得に向けて毎日一回Goldチャレンジを行い間違えた問題を簡単にまとめる。 rex.libertyfish.co.jp

8日目 得点 78点/100点中

今日も間違えた中から数問深掘りする

  • ネストされたクラス内の定数の参照
class C
  p Module.nesting #=> [C]
  CONST = "Hello, class C"
end

module M
  class C
    p Module.nesting #=> [M::C, M]
    CONST = "Hello, module M class C"
  end
end

p C::CONST #=> "Hello, class C"
p M::C::CONST #=> "Hello, module M class C"
  • Module#refineは無名のモジュールをを作成する
  • ブロック内のselfは無名モジュールになる
  • クラスメソッドを再定義するにはsingleton_classを利用する
    • self.メソッド としない
class C
  def self.m1
    200
  end
end

module R
  refine C.singleton_class do
    def m1
      # Cクラスのm1メソッドを再定義する
      # singleton_classがなければそのまま200が出力される
      100
    end
  end
end

using R

puts C.m1 #=> 100
  • 演算と戻り値のクラス
  • 戻り値はRationalとFloatとComplex
  • Rational < Float < Complexで覚えるといい
  • Date同士の演算はRation
  • Time同士の演算はFloat
  • Datetime同士の演算はRational
val = 1 + 1/2r
puts val.class #=> Rational

puts 1.class #=> Integer
# puts 1/2r.class #=> 

float = 1/3.to_f
puts float.class #=> Float
complex = 3.to_c
puts complex.class #=> Complex

val2 = float + complex
puts val2.class #=> Complex