Sendagaya.rb #136 #sendagayarb

今週、ちょっと浮気をしてSendagaya.rbに参加しました。
メタプログラミングRuby 第2版」を読んでいるということで気になっていたのです。

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

読んで追いついてから参加しようかなと思っていたのですが、いつになるかわからないので、とりあえず参加してみました。

15分くらい各自で読んで、15分たったらみんなでわいわい内容を確認するというスタイル。
「2.5 クイズ:絡み合ったモジュール」からでした。

includeのこと

クイズのサンプルコードを実行していくときにモジュールをincludeする場所のことで話がひろがりました。

module Printable
  def print
     p 'printable_print'
  end

  def prepare_cover
    p 'prepare_cover'
  end
end

module Document
  def print_to_screen
    prepare_cover
    format_for_screen
    print
  end

  def format_for_screen
    p 'format_for_screen'
  end

  def print
    p 'document_print'
  end
end

class Book
  include Printable
  include Document
end

p Book.new.print_to_screen    #=>"prepare_cover", "format_for_screen", "document_print"
p Book.ancestors    #=> [Book, Document, Printable, Object, Kernel, BasicObject]

サンプルコードではBookクラスのなかでincludeしています。
ancestorsを見るとわかりますが、PrintableをincludeしたあとにDocumentをincludeしているので、
Bookのすぐうえの親はDocumentとなり、呼ばれるprintメソッドはDocumentのほうになります。
これをプログラムのトップレベルでincludeすると、どうなるのか。

module Printable
  def print
     p 'printable_print'
  end

  def prepare_cover
    p 'prepare_cover'
  end
end

module Document
  def print_to_screen
    prepare_cover
    format_for_screen
    print
  end

  def format_for_screen
    p 'format_for_screen'
  end

  def print
    p 'document_print'
  end
end

include Printable
include Document

class Book
end

p Book.new.print_to_screen   #=> うえと同じ
p Book.ancestors    #=>[Book, Object, Document, Printable, Kernel, BasicObject]
p self    #=> main
p self.class    #=>Object

Objectクラスの位置が変わりました。
こうなると、moduleのなかで定義しているメソッドたちは、mainで直接定義されているのと変わらなくなる、けど、
同じ名前のメソッド(ここではprint)は、includeされる順番にしたがって呼ばれる。
ようです。(間違っているところはご指摘いただけると助かります)

あんまりこういうことは起こらないと思いますが。。

Classクラスのこと

話が進んでいくうちに(ちょっと発端がうろ覚えですが)、「Objectクラスの親クラスはなにか」という話になりました。
ancestors(あるいはsuperclass)で知ることができるのは、継承している親クラスの系図であって、それとはまたちょっと話のベクトルが違って、
すべてのクラスの親クラスはClassクラスであり、すべてのクラスはClassクラスのインスタンスであるということです。

すでに読み終わったページにそのことが書いてあるということなので、読み返しながら話しました。
「2.3.1 クイズの答え」のところにあるような図がとてもわかりやすかったです。

去年Effective Rubyを読んだときはこの辺がさっぱりわかっていなかったんですが、
今回だいぶ整理されました。。図って大事。

Electronでアプリを作った話

最後に主催の @fukajun さんがElectronでつくったアプリの話をしてくださいました。
詳しくはhttp://fukajun.org/91

おもしろそう!!