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

なんかほら、例外を全部無視するのもねぇ?


他になんかもっといいやり方ないかなー。