かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

こんな雰囲気。

なるほどね〜。