Perdón por la pregunta genérica. He buscado por todas partes y he encontrado tantos hilos similares a este, sin embargo, ninguno que responda a mi pregunta específica, tal vez porque el término que estoy buscando ni siquiera existe.
Un amigo mío está aprendiendo programación, específicamente JavaScript, y me preguntó por qué esto no estaba funcionando:
var a = "Hello World";
a.replace("Hello", "Goodbye");
console.log(a) // Logs "Hello World"
La razón es porque replace
no se modifica a
, ya que las cadenas son inmutables en JavaSript. Becuase que devuelve una cadena, que había necesidad de hacer algo así ...
var a = "Hello World";
a = a.replace("Hello", "Goodbye");
console.log(a); // Logs "Goodbye World"
Sin embargo, la alternativa es una función como la de JavaScript reverse()
, ya que modifica lo que sea que la llame. Por ejemplo:
var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();
console.log(fruits) // ["Bananas", "Oranges", "Apples"]
Cuando mi amigo me preguntó por qué el suyo replace
no funcionaba, me di cuenta de que estaba buscando una palabra que no sé (que yo sepa) ...
"Debe establecer la cadena en" reemplazo de punto de cadena ", porque la función de reemplazo es ________."
No es necesario establecer una matriz igual a "matriz de puntos inversa", porque la inversa es ________.
Estoy familiarizado con las funciones del prototipo , aunque no creo que esa sea la palabra que estoy buscando. ¿Alguien puede ayudarme a completar estos espacios en blanco?
fuente
You don't need to set an array equal to "array dot reverse", because reverse is a mutator function
. Yo creo que he oído que la terminología para referirse a las funciones que "mutar" la instancia que les llama. Pero probablemente deberías volver a verificar eso en otro lugar.Respuestas:
El par de conceptos que está buscando son parámetros mutables / inmutables y resultados in situ / devueltos.
En tus ejemplos:
Debe establecer la cadena en "string dot replace", porque la función de reemplazo opera en una cadena que, en python, es inmutable, por lo que la función de reemplazo devuelve una nueva cadena.
Para un programador de C / C ++, esto es más familiar como parámetros "pasados por valor", en lugar de "pasados por referencia", lo que los hace inmutables y devuelve el resultado.
No es necesario establecer una matriz igual a "matriz de puntos inversa", porque la inversa opera en una matriz, que es mutable , por lo que puede realizar cambios en el lugar antes de regresar.
En lenguajes como C / C ++, esto se conoce como parámetros "pasados por referencia", es decir, pasar la dirección que, si no es modificada por
const
, permite que la función cambie, mute , los contenidos de esa dirección alteran los resultados en el lugar antes de regresar.Por supuesto, no es inusual tener una función que devuelva resultados por ambos mecanismos, por ejemplo
int SomeFn(int p1, int p2, int *ErrCode)
, puede, potencialmente devolver resultados tanto en el valor de retorno como modificando el contenido deErrCode
.Un tercer método
Para completar, un tercer mecanismo para devolver resultados es por efecto secundario o global , es decir, modificar el alcance del archivo, todo el programa, valores compartidos o ambientales. En general, esto se considera una mala noticia , ya que, a menos que esté muy bien documentado, solo puede averiguar qué se está cambiando mediante una lectura cuidadosa del código. En lenguajes como C / C ++, esto es demasiado fácil de hacer teniendo una variable de alcance externo con un nombre dado, posiblemente incluso en otro módulo, y sin enmascarar la variable de alcance local del mismo nombre. En Python, si bien puede leer los valores de los valores en ámbitos externos, a menos que los valores de ámbito externo se establezcan explícitamente como disponibles para ser modificados con
global
palabra clave, al intentar modificar una variable de ámbito externo crea automáticamente un local con el mismo nombre.fuente
(The reverse function is a _______ function.
) Dicho esto, esta es una respuesta casi idéntica a la que terminé dando a mi amigo, así que agradezco su confirmación, aunque todavía me pregunto si hay términos específicos. Dejaré que la pregunta permanezca abierta por un tiempo, pero ciertamente aceptaré esto como la respuesta en caso de que estas palabras simplemente no existan.Mi forma preferida de expresarlo es:
El
reverse
método de matriz es mutante . Es un mutador . Un caso especial común es un setter .El
replace
método de cadena no es mutante . No es un mutador . Si no modifica nada , está libre de efectos secundarios . Un caso especial común es un captador .Dado que las cadenas de JavaScript son inmutables , los métodos de cadena no pueden mutar.
debería hacerte sentir incómodo. No modifica un literal de cadena. Descarta el resultado. Los analizadores de código estático a veces pueden detectar tales errores.
fuente
A veces, cuando se usa en el contexto de la programación funcional pura, he escuchado funciones que modifican el valor de entrada (y por lo tanto no son funciones puras) llamadas destructivas . Sin embargo, no estoy seguro de si este es el término correcto.
En su caso, diría:
fuente
¿Tal vez pura es la palabra que estás buscando?
replace()
es (o parece ser) puro porque no parece tener ningún efecto secundario (es decir, modificar la cadena) mientras quereverse()
es impuro porque cambia el estado de la matriz.fuente
Estos generalmente se separarían en funciones y métodos (donde los métodos son un subconjunto de funciones). Una función es una sección de código que se puede llamar de forma aislada, mientras que un método tiene un concepto de un 'contexto' actual en el que opera. La acción de un método cambia el estado de su contexto.
En la programación orientada a objetos, el contexto es la instancia en la que opera la función.
fuente
No sé si hay una respuesta oficial, pero aquí hay dos que te pueden gustar.
Procedimiento
Solo porque parecía una buena respuesta a esta pregunta , que se parece mucho a tu pregunta, por cierto, deberías echarle un vistazo.
Operación unaria en el lugar
Revise esta página: java.util.function . Proporciona una especie de nombre inventado para los delegados (firmas de entrada / salida) de varios prototipos, por ejemplo, un delegado que toma un argumento y no devuelve nada se llama consumidor .
Ahora, como estudiante astuto de OOP, debe saber que un método es solo una función que toma un parámetro oculto (
this
). Como se proporciona como referencia, sirve como parámetro de entrada y de salida.Según estos chicos de Java (y parecen bastante inteligentes), un delegado que acepta una sola entrada y devuelve un valor del mismo tipo se llama operador unario .
Ahora, en el caso de
array::Reverse()
, una matriz no es inmutable y potencialmente puede ocupar mucho espacio, por lo que es más eficiente y conveniente realizar la operación en el lugar. PorReverse()
lo tanto, es un operador unario en el lugar .Pero para mí, un "operador" es un símbolo especial (como el operador de suma, también conocido como
+
) o una palabra clave matemática comomod
. Por tanto, yo prefiero llamarlo una operac iones , produciendo en el lugar operación singular .fuente
Reverse()
no es un operador, un operador unario no tiene que devuelve un valor del mismo tipo (por ejemplo!
,delete
,typeof
), y los operadores no son delegados. Pero "in situ" es un buen término para un método que modifica su instancia. [No voté en contra, pero parece que alguien votó en contra de todas las respuestas a pesar de que todas son útiles.]Reverse()
es una operación unaria. Pero, en general, estoy de acuerdo en que todo esto es un poco extraño, pero estoy usando textualmente la terminología del documento vinculado , que parece haber sido escrito por algunas personas bastante inteligentes. Al menos es mejor que nada.