2013-12-11 15 views
6

Ich habe den folgenden Code in meiner Dancer App-Modul:Kann ich ein Objekt in Dancer instanziieren, um einen Wert zur Anzeige zurückzugeben?

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; 

ich eine Moops Klasse habe Dice.pm genannt, die nur gut, wenn ich es mit einer .pl-Datei testen, aber wenn ich versuche, es funktioniert zugreifen über den Webbrowser erhalte ich den folgenden Fehler: Kann die Objektmethode "neu" nicht über das Paket "Würfel" finden (vielleicht haben Sie vergessen, "Würfel" zu laden?).

Kann ich das mit Tänzer machen?

Hier ist der relevante Code aus 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

ich Sie davon ausgehen, 'Verwendung Würfel; '? – ThisSuitIsBlackNot

+0

@ThisSuitIsBlackNot Die Fehlermeldung suggeriert, dass sie * done * '' dice verwenden; ' –

+0

Verwenden Sie Würfel ist in der Tat an der Spitze des Skripts. Ich habe den Code aktualisiert, um das gesamte Skript anzuzeigen. – BackPacker777

Antwort

3

Ich wollte sagen, dass Sie die package Dice in Ihrem Dice.pm vergessen, aber nach dem Einschalten Moops Lesung bis ich bin verwirrt über die Namensräume.

Werfen wir einen Blick auf die 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 

Wenn die class Dice in Dice.pm ist, wird es tatsächlich Dice::Dice werden, wenn ich das richtig gelesen. Sie müssten also use Dice und erstellen Sie Ihr Objekt mit Dice::Dice->new.

Um das Paket Dice innerhalb Dice.pm mit Moops zu machen, ich glaube, Sie die Klasse wie folgt erklären müssen:

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

Anschließend können Sie tun:

use Dice; 
Dice->new; 
+0

Ich muss sagen, dass dieses Verhalten ein bisschen seltsam ist. – simbabque

+0

Ich habe Ihre Vorschläge implementiert, aber leider bekomme ich den gleichen Fehler. Danke für die ausführliche Antwort! – BackPacker777

+0

Ich habe Ihre Implementierung geändert, und es funktioniert! Ich habe die Klasse mit Doppel-Doppelpunkten deklariert, aber instanziiert wie folgt: Würfel-> neu – BackPacker777