2013-12-11 3 views
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; 

У меня есть класс Moops под названием Dice.pm, который работает просто отлично, если я проверить его с .pl файла, но при попытке доступа к нему через веб-браузер я получаю следующую ошибку: Не удается найти метод объекта «новый» через пакет «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(); 
    } 
} 
+0

Я предполагаю, что вы 'использование Dice; '? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot Сообщение об ошибке предполагает, что они * dont * имеют 'использование Dice;' –

+0

Использование Dice действительно находится в верхней части скрипта. Я обновил код, чтобы показать весь скрипт. – BackPacker777

ответ

3

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

Давайте посмотрим на documentation for Moops.

If you use Moops within a package other than main, then package names used within the declaration are "qualified" by that outer package, unless they contain "::". So for example:

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; 
+0

Я должен сказать, что это поведение немного странно. – simbabque

+0

Я внедрил ваши предложения, но, увы, я получаю ту же ошибку. Спасибо за подробный ответ! – BackPacker777

+0

Я изменил вашу реализацию, и она работает! Я объявил класс с двойными двоеточиями, но был создан таким образом: Dice-> new – BackPacker777

 Смежные вопросы

  • Нет связанных вопросов^_^