かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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です。

こんな雰囲気。

なるほどね〜。