Могу ли я создать экземпляр объекта в 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;