2010-11-26
■[Perl6]Perl 6 でクラスメソッドを書く

Perl 6 ではインスタンスメソッドとクラスメソッドは区別されません。オブジェクトのアトリビュートをアクセスしていないメソッドはすべてクラスメソッドとして呼ぶことができます。
class C {
method hello() {
say 'hello';
}
has $!aisatsu = 'konnichiwa';
method konnichiwa() {
say $!aisatsu;
}
}
C.new.hello; # => hello
C.hello; # => hello
C.new.konnichiwa; # => konnichiwa
# C.konnichiwa
# Error: Type objects are abstract and have no attributes, but you tried to access $!aisatsu
メソッドがクラスに対して呼ばれたとき、メソッド内の self 関数はクラスオブジェクトを返します。インスタンスに対して呼ばれたときはインスタンスを返します。クラスオブジェクトは未定義値なので、 self.defined を呼ぶことでメソッドがクラスに対して呼ばれたかどうか知ることができます。
class C {
method whoami() {
if self.defined {
say 'An instance of C';
}
else {
say 'C class';
}
}
}
C.whoami; # => C class
C.new.whoami; # => An instance of C
マルチディスパッチを使えば場合分けをスマートに書けます:
class C {
multi method whoami($self where :defined :) {
say 'An instance of C';
}
multi method whoami() {
say 'C class';
}
}
C.whoami; # => C class
C.new.whoami; # => An instance of C
トラックバック - http://d.hatena.ne.jp/uasi/20101126/1290783645
リンク元
- 7 http://twitter.com/
- 4 http://reader.livedoor.com/reader/
- 2 http://99cm.org/
- 2 http://d.hatena.ne.jp/keyword/perl
- 2 http://hootsuite.com/dashboard
- 2 http://irclog.perlgeek.de/perl6/today
- 2 http://www.google.co.jp/search?q=perl6&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&hl=ja&client=firefox-a
- 1 http://d.hatena.ne.jp/diarylist?of=0&mode=rss&type=public
- 1 http://d.hatena.ne.jp/diarylist?of=150&mode=rss&type=public
- 1 http://irclog.perlgeek.de/perl6/2010-11-26


このエラー、普通にソースからビルドしたときにも見たような気がするのですが昔のこと過ぎてどうやって対処したのか
思い出せません・・・
取り急ぎ下記のコマンドでインストールできます。
brew install https://raw.github.com/uasi/homebrew/jnethack/Library/Formula/jnethack.rb