/ / En Perl, ¿cuál es el significado de este código "tiene 'absolute_E' => (is => 'rw', default => sub {0});" - perl

En Perl, ¿cuál es el significado de este código "tiene 'absolute_E' => (is => 'rw', default => sub {0});” - perl

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 № 1
has "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.

=> es casi lo mismo que ,:

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.