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 浏览器访问它时,我收到以下错误:无法找到对象方法“新”通过包“骰子”(也许你忘了加载“骰子”?)

我可以用舞者做这个吗?

以下是 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 Dice你的Dice.pm,但是在阅读了 Moops 之后,我对命名空间感到困惑。

让我们看一下Moops 的文档

如果您在除 main 之外的包中使用 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 制作包DiceDice.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 回答