2010-01-01から1年間の記事一覧

Rubyベストプラクティス 第5章 関数型プログラミングのテクニック その2

朝ではありませんが、今日も読むことができました。今日は第5章の後半です。 無限リスト ここでも lambda で包むことで遅延評価して無限リストを実現している lazy_stream.rb 高階手続き Proc オブジェクトを関数に見立てると、Rubyのブロックを活用したコー…

Rubyベストプラクティス 第5章 関数型プログラミングのテクニック その1

今日は第5章の前半です。 「Matz は機会均等を重んじる盗人であり」翻訳が難しそう Ruby は関数型言語じゃないしいくつか重要な特徴が抜けているけど、関数型プログラミングのテクニックを参考にしたプラクティスがあるよ、という話 遅延評価 lambda で包む …

Rubyベストプラクティス 第4章 テキスト処理とファイル管理 その2

今日は第4章の後半です。 Pathname と FileUtils 個人的には Pathname は便利だけどとけ込みすぎてうっかり使っちゃいけないところにまで渡してしまうのであまり使わないようにしているんですよね……。思い付く機能はだいたいあるんですけど、たまに無いこと…

Rubyベストプラクティス 第4章 テキスト処理とファイル管理 その1

今日は第4章の前半です。 Prawn の AFM(Adobe Font Metrics) のパーサを題材に 行指向でステートフルなパーサ セクションにまとめられている部分がある String#[ergexp, nth] で切り出し 正規表現 アンカーを使って先頭、末尾、単語境界などにマッチさせる(\…

Rubyベストプラクティス 第3章 動的な機能を使いこなす その2

今日は第3章の後半です。 メソッドでクラスを生成して継承して使うテクニック クラスを生成する部分を遮蔽してブロックつきメソッドで宣言的にする ヘルパーモジュールにブロックを渡して Module.new した無名モジュールを利用する フックメソッドを活用 Mod…

Rubyベストプラクティス 第3章 動的な機能を使いこなす その1

今日は第3章の前半です。動的な機能ということで、メタプログラミングRubyに通じるような内容になりそうです。 BlankSlate - メタプログラミングRubyで出てきましたね 一旦見えなくしたメソッドをまた呼び出せるようにできる機能もある(UnbondMethod を保存…

Rubyベストプラクティス 第2章 美しいAPIを設計する その2

今日は第2章の後半です。 attr_reader, attr_writer, attr_accessor を使う(get_??? とか set_??? というメソッド名にはしない) method!, method? といった名前の慣習を知る 任意の値を true/false に変換するには二重否定(!!obj) 疑問符(?) つきメソッドが…

Rubyベストプラクティス 第2章 美しいAPIを設計する その1

今日は第2章の前半です。すごい章題ですね。 まずは実例を見る Ruport の Table 機能 クラス名と同名のメソッドによるインスタンス生成(Array() や Hash() のように) 引数の型などを検査して生成方法をディスパッチする メソッド引数のいろいろ 標準、省略可…

Rubyベストプラクティス 第1章 テストでコードを駆動する その2

第1章の後半です。師走ですし本書はさくさく進めます。 テスト手法 モック、スタブの利用 flexmock StringIO を用いて入出力をスタブにする IO を汎用オブジェクトでスタブにする方法もある 汎用オブジェクトはインタフェースと密結合する(内部処理の変更で…

Rubyベストプラクティス 第1章 テストでコードを駆動する その1

Rubyベストプラクティス -プロフェッショナルによるコードとテクニック作者: Gregory Brown,高橋征義,笹井崇司出版社/メーカー: オライリージャパン発売日: 2010/03/26メディア: 大型本購入: 9人 クリック: 307回この商品を含むブログ (47件) を見る今日から…

メタプログラミングRuby 付録E から騒ぎ

付録E では nil オブジェクトを題材にしています。 「今までに見た NullPointerException の数を憶えているか?」 Null オブジェクト(NullDevice クラス)を作って、何もしないメソッドを定義する 「Null オブジェクトは Java っぽい」 NilClass に直接必要な…

メタプログラミングRuby 付録B ドメイン特化言語

Zork(テキスト形式のアドベンチャーゲーム)の記述言語 TADS General Purpose Language の略で GPL と書かれているけどついライセンスのGPL と読んでしまう 内部 DSL と外部 DSL なんとなく内部 DSL をおすすめしている感じ DSL と メタプログラミング は強い…

メタプログラミングRuby 付録A よく使うイディオム その3

A.3 メソッド引数のトリック ハッシュ引数でキーワード引数っぽく使う用例 可変長引数(アスタリスクを付ける) デフォルト値つきの引数 A.4 自己yield ブロックの呼び出し(yield)に self を渡すこと Object#tap の例 A.5 Symbol#to_proc 「ワンコールブロック…

メタプログラミングRuby 付録A よく使うイディオム その2

その1 は第9章のラストと一緒になってしまいました。 A.2 nil ガード a ||= val こういう書き方よくしますね けど、ここの等価だと言ってるこのコードはちょっと間違ってますね。 a ||= [] が if a != nil a = a else a = [] end と等しいと書いてありますが…

メタプログラミングRuby 第9章 安全なメタプログラミング その3

危険なメタプログラミングを防ぐ話題は続きのほうにありました。今日は9.2 「モンキーパッチを防ぐ」からです オープンクラスを無制限に使うのでなく、モジュールを作って include する → ancestors に出る 動的メソッドを定義する時は先に同名のメソッドが…

メタプログラミングRuby 第9章 安全なメタプログラミング その2

ActionController のテストは一見普通のテストだけどその裏には……というところで終わったのでした。続き テスト テストにもメタプログラミングを駆使する そりゃそうだろうと思ってました テストする元のクラスを再オープンしていますが、こういうのでテスト…

メタプログラミングRuby 第9章 安全なメタプログラミング その1

メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見る第9章ではメタプログラミングの落とし穴を避け…

メタプログラミングRuby 第8章 ActiveRecord の中身 その2

今日は ActiveRecord の動的ファインダのところです。 ActiveRecord::Base.find は find_by_ のように属性名を含むメソッドでの検索もできる and, or での連結などもできる 「ゴーストメソッド」で実装 長い ここでもやはり最初に method_missing でメソッド…

メタプログラミングRuby 第8章 ActiveRecord の中身 その1

メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見る第8章では ActiveRecord の動的属性と動的ファ…

メタプログラミングRuby 第7章 ActiveRecord の設計 その2

今日は ActiveRecord::Base で使われているメタプログラミングの実際について。 autoload で require を遅延 Validations の included でサブモジュールを追加 include させる クラス拡張ミックスインで ActiveRecord::Base の特異クラスに Validations など…

メタプログラミングRuby 第7章 ActiveRecord の設計 その1

メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見る今日から第2部「Rails におけるメタプログラミ…

メタプログラミングRuby 第5章 金曜日:コードを記述するコード その4

第5章 後半、フックメソッドのところからです。 フックメソッドとは inherited, included, method_added など何かイベントがあった時にインタプリタから自動的に呼ばれるメソッドのこと Merb の例 - included を使って Merb::Cache::CacheMixin が include …

メタプログラミングRuby 第5章 金曜日:コードを記述するコード その3

第5章、eval を使った実践編。 まずはクラスマクロ attr_checked ではなくカーネルメソッドとして add_checked_attr(klass, meth) のようなメソッドを定義(手順1) eval でべったりとクラスを開いてメソッド定義。これはかなりの力技 すぐに eval を使わずに …

メタプログラミングRuby 第5章 金曜日:コードを記述するコード その2

第5章前半、eval の説明がまだ続きます。 「???_eval にブロックを渡すのと文字列を渡すのは同じことだ」 - いつパース、コンパイルされるかは異なりますけどね それにブロックにするか文字列にするかで定数探索が異なる時期があったような……。今の 1.9 だと…

メタプログラミングRuby 第5章 金曜日:コードを記述するコード その1

メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見る今日から第5章です。「コードを記述するコード…

メタプログラミングRuby 第4章 木曜日:クラス定義 その4

第4章の最後です。 クイズ: モジュールを include してクラスメソッドを定義しようとしてもできない クラスの特異クラスに include する それ extend でできるよ alias でオリジナルのメソッドを退避してラッパを書く手法。アラウンドエイリアスと呼ぶらしい…

メタプログラミングRuby 第4章 木曜日:クラス定義 その3

第4章の特異メソッドのところからです。 クラスメソッドは実は特異メソッドだったんだよ。な、なんだってー>ΩΩΩ とかやって欲しかった attr_reader とか attr_writer のようなメソッドをクラスマクロと言うらしい 「特異クラスはRuby界の UFO だ。実際に目…

メタプログラミングRuby 第4章 木曜日:クラス定義 その2

クラスのインスタンス変数とクラス変数 クラスもオブジェクトなので当然インスタンス変数を持てる クラス変数は継承で共有される クラス変数じゃなくてクラスのインスタンス変数を使うのがいまどきのメインストリームらしい クラスのインスタンス変数に利用…

メタプログラミングRuby 第4章 木曜日:クラス定義 その1

メタプログラミングRuby作者: Paolo Perrotta,角征典出版社/メーカー: KADOKAWA/アスキー・メディアワークス発売日: 2010/08/28メディア: 大型本購入: 18人 クリック: 533回この商品を含むブログ (125件) を見る今日から第4章です。ここには特異クラスの説明…

メタプログラミングRuby 第3章 水曜日:ブロック その4

ブロックの章の実用編ということで RedFlag という営業部門向けの DSL を作るところです。 最初のバージョン適当すぎる。でもまあちゃんと動く 「月間売上が驚くほど高い」 「こんな感じの DSL になるといいのだけど」最初にそれを見せてください上司さん se…