2013-12-11 19 views
6

ho il seguente codice nel mio modulo app Dancer:Posso creare un'istanza di un oggetto in Dancer per restituire un valore da visualizzare?

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; 

ho una classe denominata Moops Dice.pm che funziona bene se provo con un file .pl, ma quando provo ad accedervi tramite il browser Web, viene visualizzato il seguente errore: Impossibile individuare il metodo dell'oggetto "nuovo" tramite il pacchetto "Dice" (forse hai dimenticato di caricare "Dice"?).

Posso farlo con Dancer?

Ecco il codice pertinente da 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

vi assumere 'uso Dice; '? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot Il messaggio di errore suggerisce che * non hanno * usare 'Dadi;' –

+0

Usa Dice è effettivamente nella parte superiore dello script. Ho aggiornato il codice per mostrare l'intero script. – BackPacker777

risposta

3

Stavo per dire che hai dimenticato la package Dice nel vostro Dice.pm, ma dopo aver letto su Moops Sono confuso sugli spazi dei nomi.

Diamo un'occhiata allo 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 

Se il class Dice è in Dice.pm sarà effettivamente diventare Dice::Dice se leggo correttamente questo. Quindi dovresti use Dice e creare il tuo oggetto con Dice::Dice->new.

Al fine di rendere il pacchetto Dice entro Dice.pm utilizzando Moops, credo è necessario dichiarare la classe in questo modo:

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

È quindi possibile fare:

use Dice; 
Dice->new; 
+0

Devo dire che questo comportamento è un po 'strano. – simbabque

+0

Ho implementato i tuoi suggerimenti, ma purtroppo ho lo stesso errore. Grazie per la risposta dettagliata! – BackPacker777

+0

Ho cambiato la tua implementazione, e funziona! Ho dichiarato la classe con i doppi punti, ma istanziata in questo modo: Dadi-> nuovo – BackPacker777