das folgende Fragment von Perl-Code anzeigen, die auf Moose basiert:Perl Moose Accessoren on the fly erzeugt
$BusinessClass->meta->add_attribute($Key => { is => $rorw,
isa => $MooseType,
lazy => 0,
required => 0,
reader => sub { $_[0]->ORM->{$Key} },
writer => sub { $_[0]->ORM->newVal($Key, $_[1]) },
predicate => "has_$Key",
});
erhalte ich die Fehlermeldung:
bad accessor/reader/writer/predicate/clearer format, must be a HASH ref at /usr/local/lib/perl5/site_perl/mach/5.20/Class/MOP/Class.pm line 899
Der Grund des Fehlers ist clear: reader und writer müssen String-Namen von Funktionen sein.
Aber was in diesem speziellen Fall zu tun? Ich möchte keine neue Funktion für jedes der hundert ORM-Felder erstellen (ORM-Attribut ist hier ein gebundener Hash). Also kann ich hier keine Schnur weitergeben, ich brauche eine Schließung.
So führte meine Codierung Bedürfnisse in einen Widerspruch. Ich weiß nicht, was ich machen soll.
Das obige war ein Fragment von echtem Code. Jetzt stelle ich ein minimales Beispiel:
#!/usr/bin/perl
my @Fields = qw(af sdaf gdsg ewwq fsf); # pretend that we have 100 fields
# Imagine that this is a tied hash with 100 fields
my %Data = map { $_ => rand } @Fields;
package Test;
use Moose;
foreach my $Key (@Fields) {
__PACKAGE__->meta->add_attribute($Key => { is => 'rw',
isa => 'Str',
lazy => 0,
required => 0,
reader => sub { $Data{$Key} },
writer => sub { $Data{$Key} = $_[1] },
});
}
Rennen führt dies zu:
$ ./test.pl
bad accessor/reader/writer/predicate/clearer format, must be a HASH ref at /usr/lib/i386-linux-gnu/perl5/5.22/Class/MOP/Class.pm line 899
Class::MOP::Class::try {...} at /usr/share/perl5/Try/Tiny.pm line 92
eval {...} at /usr/share/perl5/Try/Tiny.pm line 83
Try::Tiny::try('CODE(0x9dc6cec)', 'Try::Tiny::Catch=REF(0x9ea0c60)') called at /usr/lib/i386-linux-gnu/perl5/5.22/Class/MOP/Class.pm line 904
Class::MOP::Class::_post_add_attribute('Moose::Meta::Class=HASH(0x9dc13f4)', 'Moose::Meta::Attribute=HASH(0x9dc6b5c)') called at /usr/lib/i386-linux-gnu/perl5/5.22/Class/MOP/Mixin/HasAttributes.pm line 39
Class::MOP::Mixin::HasAttributes::add_attribute('Moose::Meta::Class=HASH(0x9dc13f4)', 'Moose::Meta::Attribute=HASH(0x9dc6b5c)') called at /usr/lib/i386-linux-gnu/perl5/5.22/Moose/Meta/Class.pm line 572
Moose::Meta::Class::add_attribute('Moose::Meta::Class=HASH(0x9dc13f4)', 'af', 'HASH(0x9ea13a4)') called at test.pl line 18
Ich weiß nicht, was zu tun ist (wie „dynamisch“ (Verschluss-like) Accessoren erstellen, ohne zu schreiben eine individuelle Funktion für jedes der 100 Felder?)
Können Sie bitte ein [mcve] erstellen, damit wir das ausführen können? – simbabque
@simbabque Fertig – porton
Der Writer soll direkt in den Hash schreiben, nicht in ein Objekt? – simbabque