Me pregunto por qué Perl tiene capacidad para pasar argumentos por referencia a la función? Sé que ni Python ni Ruby tienen esa característica.¿Por qué Perl permite pasar los argumentos por referencia?
Respuesta
Es útil distinguir una cosa de otra.
(1) Pasar argumentos a una subrutina por referencia. Esto es útil en Perl porque el lenguaje pasa todos los argumentos a una subrutina como una lista de valores indiferenciada. Sin la capacidad de pasar estructuras de datos por referencia, el diseñador de una función que tome dos listas, por ejemplo, no podrá mantener separadas las listas. Además, si las estructuras de datos son grandes, pasarlas por referencia puede proporcionar una ganancia de rendimiento.
process_two_lists(@x, @y); # Can't distinguish the lists.
process_two_lists(\@x, \@y); # Can.
Dado que Python y Ruby se diseñan de forma diferente, no requieren esta distinción en la forma en que se pasan los argumentos. Un método similar en Python o Ruby recibiría dos argumentos distintos (dos objetos que representan las listas x
y y
).
(2) el comportamiento de Perl cual @_
sirve como un alias a los argumentos pasados, lo que permite la subrutina para modificar los datos según la percepción de la persona que llama.
sub add_ten_to_me {
$_[0] += 10;
}
my $x = 1;
add_ten_to_me($x);
say $x; # 11 Amazing!
Python y Ruby también pueden hacer este tipo de cosas; Sin embargo, hay algunas calificaciones. Python distingue entre mutable y objetos inmutables. Si pasa algo mutable a un método de Python (una lista, por ejemplo), el método puede modificar la estructura de datos. Entonces, una versión Python de process_two_lists
podría modificar tanto x
como y
. Sin embargo, una función que recibe objetos inmutables (un entero, por ejemplo) no lo haría. Por lo tanto, un análogo de Python directo de add_ten_to_me
no funcionaría. [Creo que se podrían hacer puntos similares sobre Ruby, pero estoy menos familiarizado con los detalles en este momento.]
Creo que el # 2 es lo que la gente suele llamar "referencia de paso a paso". # 1 se llama pasar una referencia – user102008
Pasar argumentos por referencia puede proporcionar mejoras significativas en el rendimiento.
Perl le da la opción. Creo que es parte de esa idea TIMTOWTDI. Es un método flexible, por lo que puede hacer lo que necesita. Si accede al argumento como $_[0]
, entonces es el mismo objeto. Si lo desplaza o lo copia a un léxico, es por valor.
Así que piénselo de esta manera. La mayoría del código es por valor, pero por referencia está ahí cuando lo necesita.
- 1. Bash - Pasar argumentos por referencia
- 2. Pasar argumentos de matriz por referencia
- 3. C++/CLI: ¿Por qué no puedo pasar cadenas por referencia?
- 4. C++ pasar argumentos por referencia y el puntero
- 5. ¿Hay una mejor manera de pasar por referencia en Perl?
- 6. ¿Por qué no pasar estructura por referencia una optimización común?
- 7. ¿Por qué pasar por referencia implica un constructor de copia?
- 8. Argumentos por referencia en Objective-C
- 9. ¿Por qué no se compila la referencia de los argumentos de referencia del objeto al hilo?
- 10. ¿Por qué Perl no me permite desreferenciar un miembro de una referencia hash en una matriz?
- 11. ¿Por qué Perl permite relaciones mutuas de "uso" entre módulos?
- 12. Pasar una matriz por referencia
- 13. Problema al pasar por referencia
- 14. DailogFragment - getArguments/setArguments - ¿por qué pasar argumentos en un paquete?
- 15. ¿Cómo puedo pasar argumentos comunes a los módulos de Perl?
- 16. PHP Pasar por referencia en foreach
- 17. Solo se pueden pasar variables por referencia
- 18. Por qué Windows no permite que WinSock se inicie mientras se hace pasar por otro usuario
- 19. ¿Cómo puedo pasar los argumentos a Perl one-liner?
- 20. ¿Por qué pasar por referencia const en lugar de por valor?
- 21. ¿Por qué Task.Delay() permite un retraso infinito?
- 22. ¿Cómo se pueden pasar argumentos a funciones variadic por referencia en PHP?
- 23. ¿Puedo pasar parámetros por referencia en Java?
- 24. ¿es posible pasar por referencia en RMI?
- 25. 'pasar parámetro por referencia' en Ruby?
- 26. Cuándo pasar por referencia en PHP
- 27. PDO pasar por aviso de referencia? Este
- 28. C# Pasar una propiedad por referencia
- 29. arrays PHP y pasar por referencia
- 30. paso por el puntero y Pasar por referencia
¿Quiere decir pasar implícito o explícito de referencia? Tal vez proporcione un ejemplo de lo que quiere decir. – TLP
¿Por qué querría omitir la capacidad de pasar argumentos por referencia? –
Parece que los alias '@ _' contenían una característica accidental de la que la gente dependía desde los 3 días de Perl, o tal vez con 'para '. Las búsquedas del archivo p5p y del repositorio git han quedado vacías, pero @tchrist o @merlyn sabrán la respuesta. –