Могу ли я создать экземпляр объекта в Dancer, чтобы вернуть значение для отображения?

У меня есть следующий код в моем модуле приложения 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;

У меня есть класс Moops с именем Dice.pm, который отлично работает, если я тестирую его с помощью файла.pl, но когда я пытаюсь получить к нему доступ через веб-браузер, я получаю следующую ошибку: Не удается найти метод объекта "new" через пакет "Кости" (возможно, вы забыли загрузить "Кости"?).

Могу ли я сделать это с танцором?

Вот соответствующий код из 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();
    }
}

1 ответ

Решение

Я собирался сказать, что ты забыл package Dice в вашем Dice.pm, но после прочтения на Moops я запутался в пространствах имен.

Давайте посмотрим на документацию для Moops.

Если вы используете Moops в пакете, отличном от main, то имена пакетов, используемые в объявлении, "квалифицируются" этим внешним пакетом, если они не содержат "::". Так, например:

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,

Для того, чтобы сделать пакет Dice в Dice.pm используя Moops, я считаю, что вам нужно объявить класс следующим образом:

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;
Другие вопросы по тегам