デコレータ

RubyのModuleクラスのattr_accessor、attr_reader、attr_writer、private、protected、publicメソッドはデコレータメソッドである。

class Foo1
  def test
    print "hello\n"
  end
  private :test
end

class Foo2
  private
  def test
    print "hello\n"
  end
end

Pythonでは、デコレータは、@を使用する。

class Foo:
    @staticmethod
    def test():
        print 'hello'

ここでは、内容でなく構文や文法に着目しているが、Pythonではデコレータを表現するのに@を付けた特別な構文を必要としているが、Rubyでは関数呼び出しに()が不要であることを利用してFoo1では、自然な構文、というか特別な構文を用意する必要なく初めからサポートできていた。Foo2のprivateは、勉強不足で実現方法が良く分からないが、構文を特別なモノとして扱っているのだろうか?


Rubyでは、Array#eachをイテレータと呼んだり、Module#attr_accessorをデコレータと呼んだり、構文上や文法上でなく意味上の名前であり、通常のメソッドと特別な区別はしていない。Pythonでは、イテレータというタイプやデコレータ用の構文があり、構文上、文法上特別なモノが用意されている。良いか悪いかは別として、Rubyの文法は洗練されていると言えると思う。