Sendagaya.rb #136 #sendagayarb
今週、ちょっと浮気をしてSendagaya.rbに参加しました。
「メタプログラミングRuby 第2版」を読んでいるということで気になっていたのです。
- 作者: Paolo Perrotta,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/10/10
- メディア: 大型本
- この商品を含むブログ (3件) を見る
読んで追いついてから参加しようかなと思っていたのですが、いつになるかわからないので、とりあえず参加してみました。
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
おもしろそう!!