2013-12-11 9 views
6

Mam następujący kod w moim Dancer modułu aplikacji:Czy mogę utworzyć instancję obiektu w układzie Dancer, aby zwrócić wartość do wyświetlenia?

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; 

Mam klasy o nazwie Moops Dice.pm że działa dobrze, gdybym go przetestować z .pl pliku, ale gdy próbuję do niego dostęp przez przeglądarkę internetową pojawia się następujący błąd: Nie mogę zlokalizować metody obiektu "nowy" przez pakiet "Kości" (być może zapomniałeś załadować "Kości"?).

Czy mogę to zrobić z tancerzem?

Oto stosowny kod z 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

Zakładam, że 'wykorzystanie Kości; '? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot Komunikat o błędzie sugeruje, że * nie * mają 'use Dice;' –

+0

Używanie Dice jest rzeczywiście u góry skryptu. Zaktualizowałem kod, aby pokazać cały skrypt. – BackPacker777

Odpowiedz

3

miałem zamiar powiedzieć, że zapomniał package Dice w Dice.pm, ale po przeczytaniu się na Moops Jestem mylić o przestrzeni nazw.

Rzućmy okiem na 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 

Jeśli class Dice w Dice.pm będzie rzeczywiście stać Dice::Dice jeśli czytam to poprawnie. Więc musisz use Dice i utworzyć obiekt z Dice::Dice->new.

Aby pakiet Dice w terminie Dice.pm użyciu Moops, wierzę, trzeba zadeklarować klasę tak:

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(); 
    } 
} 

Można wtedy zrobić:

use Dice; 
Dice->new; 
+0

Muszę powiedzieć, że to zachowanie jest trochę dziwne. – simbabque

+0

Zaimplementowałem Twoje sugestie, ale niestety otrzymuję ten sam błąd. Dzięki za szczegółową odpowiedź! – BackPacker777

+0

Zmieniłem twoje wdrożenie i działa! Ogłosiłem klasę podwójnymi dwukropkami, ale wystąpiłem tak: Dice-> new – BackPacker777

Powiązane problemy