NullObject
昨日の続き。
こんなん考えてみた。
class NullObject def initialize(value=nil) def value.method_missing(name, *args, &block) self end unless [Symbol, NilClass].include? value.class @value =value end def method_missing(name, *args, &block) @value end end class Object def nullobj(value=nil) NullObject.new value end end variable = nil p (variable || nullobj).hello #=> nil #p (variable || nullobj).hello.world #=> undefined method p (variable || nullobj('hello')).hello #=> 'hello' p (variable || nullobj('hello')).hello.world #=> 'hello' p (variable || nullobj(:hello)).hello #=> :hello p (variable || nullobj(:hello)).hello.world #=> undefined method
いやまぁほとんど打鍵数変わらないのは分かってるんだけどさ
(variable || nullobj).hello
variable ? variable.hello : nil
同じ変数名を二度書くのがなんかいやなんよ。
もちろん文字数だけ気にするならこの手もあるんだけど
(variable || nullobj).hello variable.hello rescue nil
なんかほら、例外を全部無視するのもねぇ?
他になんかもっといいやり方ないかなー。