家に帰って、早速、NullObjectパターンを書いてみた。こんな感じかな。
4| class NullObject
5| def to_s
6| 'This is a NullObject.'
7| end
8|
9| def method_missing(method_id, *args)
10| return self
11| end
12| end
13|
14| module UseNullObject
15| def maybe_null(method_id)
16| alias_method "_orig_#{method_id.to_s}", method_id
17| define_method(method_id) {|*args|
18| r = __send__ "_orig_#{method_id.to_s}", *args
19| return r.nil? ? NullObject.new : r
20| }
21| end
22| end
23|
24| class Customer
25| extend UseNullObject
26|
27| def region; nil end
28| maybe_null :region
29| end
30|
31| c = Customer.new
32| p c.region.foo.bar
(2006.7.24追記。)
/メソッドについては、Lessons From Hpricot
うぁ。かなり字面がおかしい。