かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

defined?の使いどころ

Observableのコード読んでたらこんな風に使われてた。

module Observable
    def add_observer(obj)
        @observers = [] unless defined? @observers
        @observers << obj
    end
    
    def notify_observers *args
        @observers.each { |obs| obs.update(self, *args) }
    end
end

class Person
    include Observable
    attr_accessor :name
end

class EnglishPrinter
    def update(person)
        puts "Hello! My name is #{person.name}."
    end
end
class JapanesePrinter
    def update(person)
        puts "こんにちは!私の名前は#{person.name}です。"
    end
end


person = Person.new
person.add_observer(EnglishPrinter.new)
person.add_observer(JapanesePrinter.new)

person.name = "Tarou"
person.notify_observers

person.name = "Jirou"
person.notify_observers

実行すると

Hello! My name is Tarou.
こんにちは!私の名前はTarouです。
Hello! My name is Jirou.
こんにちは!私の名前はJirouです。

こんな雰囲気。

なるほどね〜。