2017-11-26 2 views
0

Ich versuche, Moose reader und writer für die Einstellung und einen Wert zu verwenden. Fehler für Reader und Writer Accessor-Methode von Moose in Perl

Das folgende ist employee.pm:

package employee; 
use Moose; 

has 'firstName' => (is => 'ro' , isa => 'Str' , required => 1); 

has 'salary' => (is => 'rw', 
     isa => 'Str', 
     writer => 'set_slalary', 
     reader => 'get_salary', 
     ); 

has 'department' => (is => 'rw' , default => 'support'); 
has 'age' => (is => 'ro' , isa=> 'Str'); 

no Moose; 
__PACKAGE__->meta->make_immutable; 
1; 

Das folgende ist mein Skript 1.pl (die die oben Modul verwendet):

use employee; 
use strict; 
use warnings; 

my $emp = employee->new(firstName => 'Tom' , salary => 50000 , department => 'R&D' , age => '27'); 

$emp->set_salary(100000); 

print $emp->firstName, " works in ", $emp->department, " and his salary is ", $emp->get_salary() , " and age is ", $emp->age ,"\n" ; 

Im Skript Ich versuche, das salary Attribut zu aktualisieren zu 100000. Ich erhalte die folgende Fehlermeldung:

Can't locate object method "set_salary" via package "employee" at 1.pl line 7 

Wenn ich die Linie $emp->set_salary(100000); in 1.pl kommentieren, dann bekomme ich eine korrekte Ausgabe (ohne den aktualisierten Wert für das Attribut salary, natürlich).

Tom works in R&D and his salary is 50000 and age is 27 

In employee.pm habe ich gegebene Lese- und Schreibberechtigung für salary Attribut. Kann jemand vorschlagen, wo ich falsch liege? Danke im Voraus.

+0

Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackoverflow.com/rooms/159833/discussion-between-hobbs-and-ikegami). – hobbs

+0

Sie vermuten, dass ein "automatischer" Methodengenerator existiert. So funktioniert Elch nicht! Bitte lesen Sie die Dokumentation! https://www.google.com.br/search?q=metacpan+%2B+Moose&oq=metacpan+%2B+Moose&aqs=chrome..69i57j69i64.3064j0j7&sourceid=chrome&ie=UTF-8 –

Antwort

-1

Sie falsch geschrieben set_salary.

writer => 'set_slalary' 

sollte

writer => 'set_salary' 

Hinweis sein, dass

is => 'rw' 

ist nur eine andere Art

accessor => 'salary' 

uns schreiben natürlich. is ist unzuverlässig, wenn reader, writer und/oder accessor auch für das gleiche Attribut bereitgestellt werden. Zum Beispiel wird is manchmal ignoriert, wenn reader, writer und/oder accessor auch für das gleiche Attribut bereitgestellt werden. (Demonstration unten.) Dies ist der Fall für Ihr Programm.

Daher ist es eine schlechte Idee, is mit reader/writer/accessor zu mischen. Verwenden Sie den einen oder anderen Stil, aber nicht beide für ein bestimmtes Attribut. In Ihrem Fall sollten Sie nutzlos is => 'rw' loswerden.


Demonstration von is=>'rw' + reader + writer Fehler:

Class.pm:

package Class; 

use Moose; 

has attr1 => (
    is => 'rw', 
    default => 'val1', 
); 

has attr2 => (
    is => 'rw', 
    reader => 'get_attr2', 
    writer => 'set_attr2', 
    default => 'val2', 
); 

1; 

a.pl:

use feature qw(say); 

use FindBin qw($RealBin); 
use lib $RealBin; 

use Class; 

my $o = Class->new(); 
say $o->attr1(); 
say $o->attr2(); 

Ausgang:

val1 
Can't locate object method "attr2" via package "Class" at a.pl line 10. 
Verwandte Themen