ナスカブログ

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

Ruby Goldへの道 day13

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

13日目 得点 72点/100点中

  • 継承
  • moduleの中でクラスを定義するとモジュール::クラスとなる
  • そのクラスを継承するとモジュール::クラスを継承したことになる
class Base
  def name
    p 'Base#name'
  end
end

module Scope
  class Base
    def name
      p 'Scope::Base#name'
    end
  end

  class Inherited < Base # Scope::Baseとして解釈される
    def name
      p 'Scope::Inherited#name'
      super
    end
    p self.ancestors # [Scope::Inherited, Scope::Base, Object, Kernel, BasicObject]
  end
end

inherited = Scope::Inherited.new
inherited.name

#=> "Scope::Inherited#name"
#=> "Scope::Base#name"

nameメソッドを上書きするのは理解できるが@nameoriginal_nameが等しいのがわからん
alias_methodはインスタンス変数も上書きするのか?

class Human
  attr_reader :name

  alias_method :original_name, :name

  # attr_readerを書かない場合、インスタンス変数nameの読み取りメソッドが必要
  # def name
  #   @name
  # end

  def name
    puts @name == original_name # true ..??
    "Mr. " + original_name
  end

  def initialize(name)
    @name = name
  end
end

human = Human.new("Andrew")
puts human.name #=> Mr. Andrew
  • singletonモジュール
    • インクルードするとクラスメソッドinstanceを定義する
    • instanceメソッドを呼び出すとインスタンスを一つだけ返す

ずっとインクルードしたらsingletonメソッドが使えるようになると思ってた。。。

require 'singleton'

class Message
  include Singleton

  def morning
    'Hi, good morning!'
  end
end

p Message.instance.morning #=> "Hi, good morning!"