Hatena::ブログ(Diary)

ヤルキデナイズドだった

Yarukidenized

2010-11-26

[]Perl 6 でクラスメソッドを書く 00:00 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

singletasksingletask 2011/06/15 12:27 パッチの適用のところでHunk #1 FAILED @..というエラーが出てビルドできないようです。
このエラー、普通にソースからビルドしたときにも見たような気がするのですが昔のこと過ぎてどうやって対処したのか
思い出せません・・・

uasiuasi 2011/06/16 15:51 報告ありがとうございます。パッチの適用順序に問題がありましたので修正しておきます。
取り急ぎ下記のコマンドでインストールできます。
brew install https://raw.github.com/uasi/homebrew/jnethack/Library/Formula/jnethack.rb

singletasksingletask 2011/06/16 18:23 さっそくの修正、ありがとうございました。無事ビルドできました。

uasiuasi 2011/06/16 23:05 (修正が取り込まれたので上記のコマンドは不要になりました。以降は brew install jnethack を使ってください)

トラックバック - http://d.hatena.ne.jp/uasi/20101126/1290783645