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
体感できるほど遅い。しょうがないんだけど。