perl | Parámetros mutables e inmutables

Una función o subrutina de Perl es un grupo de sentencias que juntas realizan una tarea específica. En todos los lenguajes de programación, el usuario quiere reutilizar el código. Entonces, el usuario pone la sección de código en función o subrutina para que no haya necesidad de escribir código una y otra vez. Estas subrutinas contienen parámetros que definen el tipo y el número de argumentos que se pueden pasar a la función en el momento de la llamada a la función. Estos argumentos o parámetros se utilizan para evaluar los valores pasados ​​a la función según las expresiones especificadas en la función. Estos valores luego se devuelven a los parámetros especificados y se pasan a la función de llamada.

Ejemplo:

sub Function1(parameter1, parameter2){ statement; }

Parámetros mutables:

Este tipo de parámetros son aquellos cuyo valor se puede modificar dentro de una función a la que se le pasan como parámetro. Significa que cuando se pasa un parámetro a la función mediante la función de llamada , su valor está vinculado al parámetro en la función llamada , lo que significa que cualquier cambio realizado en el valor de esa función también se reflejará en el parámetro de la persona que llama. función.

Parámetros inmutables:

Estos parámetros son de aquellos tipos cuyo valor no se puede modificar dentro de una función a la que se le pasan como parámetro. Significa que cuando se pasa un parámetro a la función mediante la función de llamada , la subrutina recibe un valor en lugar de una variable. Por lo tanto, los cambios realizados en el parámetro de función no se reflejan.

De forma predeterminada, los parámetros de subrutina en Perl son inmutables, lo que significa que no se pueden cambiar dentro de una función y no se pueden modificar accidentalmente los argumentos de la función que llama.
En algunos idiomas, este proceso se conoce como ‘llamada por valor’ , lo que significa que la subrutina a la que se llama recibe un valor en lugar de la variable y, por lo tanto, los parámetros de la función de llamada no se modifican.

Ejemplo:

#!/usr/bin/perl
  
# Function Definition
sub Func(Int $variable)
{
    # Operation to be performed
    $variable /= 2; 
}
  
# Defining a local variable
my $value = 20;
  
# Function Call with local variable
print Func($value);

Producción:

Error: no se puede asignar a un valor inmutable

Para cambiar la propiedad de estos parámetros, se utilizan rasgos . Con la ayuda de las características, el valor del parámetro se puede cambiar dentro de una subrutina.

Rasgos:

Estas son las subrutinas integradas predefinidas que, cuando se usan dentro de un método, modifican el comportamiento del método cuando se ejecuta en tiempo de compilación. Los rasgos pueden incluso usarse para cambiar el cuerpo del método o simplemente etiquetar el método con metadatos.
Los rasgos pueden ser de múltiples tipos dependiendo de su uso, tales como:

  • is cachedEl rasgo almacena en caché el valor de retorno de la función automáticamente, en función de los argumentos que se le pasan.
  • is rwEl rasgo permite accesos de escritura a los parámetros de la subrutina.
  • is copytrait permite cambiar el valor del parámetro dentro de la subrutina pero sin cambiar el argumento en la función de llamada.

Ejemplo: Uso de is copyrasgo

#!/usr/bin/perl
  
# Function Definition using
# 'is copy' trait
sub Func(Int $variable is copy)
{
    # Operation to be performed
    $variable += 5; 
}
  
# Defining a local variable
my $value = 10;
  
# Function Call with local variable
print Func($value), "\n";
  
# Checking if 
# $value gets updated or not
print $value;

Producción:

15
10

En el código anterior, is copyse utiliza el rasgo porque Perl, de forma predeterminada, no permite la modificación de argumentos dentro de una subrutina. Esta característica permite que el programa asigne el valor del parámetro de la función que llama al parámetro de la subrutina que se llama. Pero, este rasgo solo cambiará el valor del argumento en la función llamada.

Ejemplo: Uso de is rwrasgo

#!/usr/bin/perl
  
# Function Definition using
# 'is rw' trait
sub Func(Int $variable is rw)
{
    # Operation to be performed
    $variable += 5; 
}
  
# Defining a local variable
my $value = 10;
  
# Function Call with local variable
print Func($value), "\n";
  
# Checking if 
# $value gets updated or not
print $value;

Producción:

15
15

En el código anterior, cuando is rwse usa en lugar de is copytrait, el valor del argumento pasado en la función de llamada también se actualiza.

Cuando is rwse usa el rasgo, el argumento de la función llamada está vinculado con el argumento de la función que llama, por lo que si se realiza algún cambio en el valor anterior, el último se actualiza de inmediato. Esto se debe al proceso denominado «llamada por referencia» . Dado que ambos argumentos se refieren a la misma ubicación de memoria (debido al is rwrasgo). Esto hace que los parámetros sean totalmente mutables.

Publicación traducida automáticamente

Artículo escrito por Abhinav96 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *