6

Dancer アプリ モジュールに次のコードがあります。

package Deadlands;
use Dancer ':syntax';
use Dice;

our $VERSION = '0.1';

get '/' => sub {
    my ($dieQty, $dieType);
    $dieQty = param('dieQty');
    $dieType = param('dieType');
    if (defined $dieQty && defined $dieType) {
        return Dice->new(dieType => $dieType, dieQty => $dieQty)->getStandardResult();
    }
    template 'index';
};

true;

Dice.pm という名前の Moops クラスがあり、.pl ファイルでテストすると問題なく動作しますが、Web ブラウザからアクセスしようとすると、次のエラーが表示されます:オブジェクト メソッド "new" が見つかりませんパッケージ "Dice" 経由 (おそらく "Dice" をロードするのを忘れていませんか?) .

ダンサーでこれを行うことはできますか?

Dice.pm の関連コードは次のとおりです。

use 5.14.3;
use Moops;

class Dice 1.0 {
    has dieType => (is => 'rw', isa => Int, required => 1);
    has dieQty => (is => 'rw', isa => Int, required => 1);
    has finalResult => (is => 'rw', isa => Int, required => 0);

    method getStandardResult() {
        $self->finalResult(int(rand($self->dieType()) + 1));
        return $self->finalResult();
    }
}
4

1 に答える 1

3

の を忘れたと言うつもりでしたがpackage DiceDice.pmMoops を読んだ後、名前空間について混乱しています。

Moopsのドキュメントを見てみましょう。

メイン以外のパッケージ内で Moops を使用する場合、宣言内で使用されるパッケージ名は、「::」が含まれていない限り、その外部パッケージによって「修飾」されます。たとえば、次のようになります。

package Quux;
use Moops;

class Foo { }       # declares Quux::Foo

class Xyzzy::Foo    # declares Xyzzy::Foo
   extends Foo { }  # ... extending Quux::Foo

class ::Baz { }     # declares Baz

が入っている場合class Diceは、これを正しく読めばDice.pm実際になります。Dice::Diceしたがってuse Dice、でオブジェクトを作成する必要がありますDice::Dice->new

Moops を使用してパッケージを作成するには、次のようにクラスを宣言する必要があると思いDiceます。Dice.pm

class ::Dice 1.0 {
    #  ^------------- there are two colons here!

    has dieType => (is => 'rw', isa => Int, required => 1);
    has dieQty => (is => 'rw', isa => Int, required => 1);
    has finalResult => (is => 'rw', isa => Int, required => 0);

    method getStandardResult() {
        $self->finalResult(int(rand($self->dieType()) + 1));
        return $self->finalResult();
    }
}

その後、次のことができます。

use Dice;
Dice->new;
于 2013-12-11T22:19:11.777 に答える