鳩舎

レースしない

Perl 6 の Role

Perl 自体に造詣もないし、 Perl 6 などましてやというぐらいなのだけれど、とりあえず僕の興味のある分野が Perl 6 にあったので rakudo をコンパイルして試してみた。

Perl 6 には Class と Role があるものらしい。

すごい単純な Person ってクラスを実装してみる。

class Person {
  has $.name;

  method greet() {
    print "I'm $.name";
  }
}

my $romeo = Person.new(:name("romeo"));
$romeo.greet(); # => I'm romeo

名前を持ってて、挨拶するだけのクラス。これに Role で実装を与える。

class Person {
  has $.name;

  method greet() {
    print "I'm $.name";
  }
}

role Tester {
  method greet() {
    print "My name is $.name. I'm a tester.";
  }
}

my $juliet = Person.new(:name("juliet")) does Tester;
$juliet.greet(); # => My name is juliet. I'm a tester.

これはインスタンスに Role を mixin してる。クラス定義時に

role Tester {
  method greet() {
    print "My name is $.name. I'm a tester.";
  }
}

class Person does Tester {
  has $.name;

  # method greet() {
  #   print "I'm $.name";
  # }
}

my $juliet = Person.new(:name("juliet"));
$juliet.greet(); # => My name is juliet. I'm a tester.

とも書ける。ここで Person の greet メソッド定義をコメントアウトしてるけど、これを外すと Romeo と同じ台詞で挨拶するようになる(オーバーライドされる)。

Perl をよくわかってないので、こういう mixin を動的に与えるにはどうするかとかわからないけど、これはなかなかどうして面白いと思う。 Smalltalk で言う Traits とかも似たようなもんなんかな。

ちなみに。

$ time ./perl6 romeo.pl
./perl6 romeo.pl  0.66s user 0.13s system 98% cpu 0.801 total
$ time ./perl6 juliet.pl
./perl6 juliet.pl  0.83s user 0.14s system 99% cpu 0.979 total

体感できるほど遅い。しょうがないんだけど。