Los siguientes códigos me confunden tanto que no puedo encontrar ningún conocimiento relacionado acerca de la sintaxis "tiene, es, por defecto, vago". ¿Alguien puede darme una explicación detallada, mis mejores deseos?
has "absolute_E" => (is => "rw", default => sub {0} );
has "retract_speed_mm_min" => (is => "lazy");
Respuestas
2 para la respuesta № 1has "retract_speed_mm_min" => (is => "lazy");
A juzgar por esta línea, esto es probablemente un Mugir clase. Para confirmar esto, mire cerca de la parte superior del archivo, y debería ver algo como use Moo
.
Moo es un marco orientado a objetos para Perl. Asumiré que entiendes los conceptos de OO.
Algunos antecedentes históricos: Perl 5 tiene capacidades OO incorporadas, sin embargo, a veces puede ser un poco engorroso. Entonces Alce surgió como una forma mejorada de OOP en Perl. Pero Moose también era bastante pesado, con un costo de tiempo de compilación, por lo que Moo (y también Mouse justo antes) se convirtieron en un subconjunto más ligero de Moose.
has
es para definir atributos en tu clase.
has "absolute_E" => ( is => "rw", default => sub {0} );
Esto define un atributo llamado absolute_E
.
is => "rw"
significa que es legible y escribible, lo que significa que puede hacer esto:
my $value = $obj->absolute_E; # gets the value
$obj->absolute_E($value); # sets the value
Cuando crea una instancia del objeto, puede proporcionar un valor para el atributo:
my $obj = My::Class->new( absolute_E => 5 );
Pero si no proporciona nada, entonces absolute_E
se establece en 0
por default
.
Este segundo atributo tiene algunas cosas más:
has "retract_speed_mm_min" => (is => "lazy");
Esta es una forma corta para:
has "retract_speed_mm_min" => (
is => "ro",
lazy => 1,
builder => "_build_retract_speed_mm_min"
);
Este atributo es readonly
lo que significa que no puede cambiar su valor después de la construcción. Pero puede proporcionar un valor en la construcción como antes.
los builder
Es otra forma de proporcionar un valor predeterminado. Requiere que la clase tenga un método separado llamado _build_retract_speed_mm_min
eso debería devolver el valor predeterminado.
lazy
funciona con builder
. Significa que el atributo no debe establecersepor el constructor hasta que se use el atributo. La demora puede usarse porque el constructor depende de otros atributos para construir el valor de este atributo.
Hay mucho más en Moo y Moose. Sugeriría leer http://modernperlbooks.com/books/modern_perl_2014/07-object-oriented-perl.html y https://metacpan.org/pod/Moose::Manual y https://metacpan.org/pod/Moo.
0 para la respuesta № 2
Ese código básicamente es igual
has ("absolute_E", "is", "rw", "default", sub {0} );
has ("retract_speed_mm_min", "is", "lazy");
Y has
parece una subrutina definida por el usuario.
los
=>
operador es un sinónimo de la coma, excepto quehace que una palabra a su izquierda se interprete como una cadena si comienza con una letra o un guión bajo y está compuesta solo por letras, dígitos y guiones bajos.