stringtranslate.com

esto (programación de computadoras)

this , self y Me son palabras clave que se usan en algunos lenguajes de programación informática para referirse al objeto, clase u otra entidad de la que forma parte el código que se está ejecutando actualmente. La entidad a la que se hace referencia depende, por lo tanto, del contexto de ejecución (por ejemplo, qué objeto tiene su método llamado). Los distintos lenguajes de programación usan estas palabras clave de formas ligeramente diferentes. En los lenguajes en los que una palabra clave como "this" es obligatoria, la palabra clave es la única forma de acceder a los datos y métodos almacenados en el objeto actual. Cuando son opcionales, estas palabras clave pueden desambiguar variables y funciones con el mismo nombre.

Programación orientada a objetos

En muchos lenguajes de programación orientados a objetos , (también llamado o ) es una variable que se utiliza en métodos de instancia para hacer referencia al objeto en el que están trabajando. El primer lenguaje orientado a objetos, SIMULA 67 , solía hacer referencia explícita al objeto local. [1] : 4.3.2.3  C++ y los lenguajes que derivan en estilo de él (como Java , C# , D y PHP ) también suelen utilizar . Smalltalk y otros, como Object Pascal , Perl , Python , Ruby , Rust , Objective-C , DataFlex y Swift , utilizan . Visual Basic de Microsoft utiliza .thisselfMethis thisselfMe

El concepto es similar en todos los lenguajes: es usualmente una referencia o punterothis inmutable que se refiere al objeto actual; el objeto actual es a menudo el código que actúa como 'padre' o 'invocador' de la propiedad , método , subrutina o función que contiene la palabra clave. Después de que un objeto se construye o instancia correctamente, es siempre una referencia válida. Algunos lenguajes lo requieren explícitamente; otros usan el alcance léxico para usarlo implícitamente para hacer visibles los símbolos dentro de su clase. O alternativamente, el objeto actual al que se hace referencia puede ser un objeto de código independiente que ha llamado a la función o método que contiene la palabra clave . Tal cosa sucede, por ejemplo, cuando un controlador de eventos de JavaScript adjunto a una etiqueta HTML en una página web llama a una función que contiene la palabra clave almacenada en el espacio global fuera del objeto de documento; en ese contexto, se referirá al elemento de página dentro del objeto de documento, no al objeto de ventana que lo encierra. [2]thisthisthisthisthisthis

En algunos lenguajes, por ejemplo C++, Java y Raku this, o selfes una palabra clave y la variable existe automáticamente en los métodos de instancia. En otros, por ejemplo, Python, Rust y Perl 5, el primer parámetro de un método de instancia es una referencia de este tipo. Debe especificarse explícitamente. En Python y Perl, el parámetro no necesita necesariamente ser nombrado thiso self; el programador puede nombrarlo libremente como cualquier otro parámetro. Sin embargo, por convención informal, el primer parámetro de un método de instancia en Perl o Python es nombrado self. Rust requiere que se llame al objeto self &selfo self, dependiendo de si la función invocada toma prestado el invocante o lo mueve, respectivamente.

Los métodos estáticos en C++ o Java no están asociados a instancias sino a clases, y por lo tanto no pueden usar this, porque no hay ningún objeto. En otros lenguajes, como Ruby, Smalltalk, Objective-C o Swift, el método está asociado a un objeto de clase que se pasa como this, y se denominan métodos de clase . Para los métodos de clase, Python usa clspara acceder al objeto de clase .

Sutilezas y dificultades

Cuando se utiliza el alcance léxico para inferir this, el uso de thisen el código, si bien no es ilegal, puede generar alarmas para un programador de mantenimiento, aunque todavía hay usos legítimos de thisen este caso, como hacer referencia a variables de instancia ocultas por variables locales del mismo nombre, o si el método desea devolver una referencia al objeto actual, es decir this, a sí mismo.

En algunos compiladores (por ejemplo GCC ), los punteros a métodos de instancia de C++ se pueden convertir directamente a un puntero de otro tipo, con un thisparámetro de puntero explícito. [3]

Recursión abierta

La semántica de envío de this, es decir, que las llamadas a métodos de thisse envían dinámicamente, se conoce como recursión abierta y significa que estos métodos pueden ser reemplazados por clases u objetos derivados. Por el contrario, la recursión directa nombrada o la recursión anónima de una función utiliza la recursión cerrada , con envío estático. Por ejemplo, en el siguiente código de Perl para el factorial, el token __SUB__es una referencia a la función actual:

utilizar la función ":5.16" ; sub { mi $x = shift ; $x == 0 ? 1 : $x * __SUB__ -> ( $x - 1 ); }                    

Por el contrario, en C++ (usando un explícito thispara mayor claridad, aunque no es necesario) se thisvincula al objeto mismo, pero si el método de clase se declaró "virtual", es decir, polimórfico en la base, se resuelve mediante envío dinámico para que las clases derivadas puedan anularlo.

unsigned int factorial ( unsigned int n ) { si ( n == 0 ) devuelve 1 ; de lo contrario devuelve n * esto -> factorial ( n - 1 ); }                 

Este ejemplo es artificial ya que se trata de una recursión directa, por lo que anular el factorialmétodo anularía esta función; ejemplos más naturales son cuando un método en una clase derivada llama al mismo método en una clase base, o en casos de recursión mutua. [4] [5]

El problema de la clase base frágil se ha achacado a la recursión abierta, con la sugerencia de que la invocación de métodos por thisdefecto se realiza mediante recursión cerrada (despacho estático) en lugar de recursión abierta (despacho dinámico), utilizando solo la recursión abierta cuando se solicita específicamente; las llamadas externas (sin utilizar this) se enviarían dinámicamente como de costumbre. [6] [7] La ​​forma en que esto se resuelve en la práctica en el JDK es a través de una cierta disciplina de programación; esta disciplina ha sido formalizada por C. Ruby y GT Leavens; consta de las siguientes reglas: [8]

Implementaciones

C++

Las primeras versiones de C++ permitían thiscambiar el puntero; al hacerlo, un programador podía cambiar el objeto en el que estaba trabajando un método. Esta característica se eliminó con el tiempo y ahora thisen C++ es un valor r . [9]

Las primeras versiones de C++ no incluían referencias y se ha sugerido que si hubieran estado en C++ desde el principio, thishabrían sido una referencia, no un puntero. [10]

C++ permite que los objetos se destruyan a sí mismos con la declaración del código fuente: delete this.

DO#

La palabra clave thisen C# funciona de la misma manera que en Java para los tipos de referencia. Sin embargo, dentro de C# los tipos de valor tienen una semántica bastante diferente , thisya que es similar a una referencia de variable mutable común y puede incluso aparecer en el lado izquierdo de una asignación.

Un uso de thisen C# es permitir la referencia a una variable de campo externo dentro de un método que contiene una variable local que tiene el mismo nombre. En tal situación, por ejemplo, la declaración var n = localAndFieldname;dentro del método asignará el tipo y valor de la variable local localAndFieldnamea n, mientras que la declaración var n = this.localAndFieldname;asignará el tipo y valor de la variable de campo externo a n. [11]

D

En D, this en una clase, una estructura o un método de unión hace referencia a una referencia inmutable de la instancia del agregado que la contiene. Las clases son tipos de referencia y las estructuras y uniones son tipos de valor. En la primera versión de D, la palabra clave thisse utiliza como un puntero a la instancia del objeto al que está vinculado el método, mientras que en D2 tiene el carácter de un refargumento de función implícito.

Dylan

En el lenguaje de programación Dylan , que es un lenguaje orientado a objetos que admite métodos múltiples y no tiene un concepto de this, el envío de un mensaje a un objeto se mantiene en la sintaxis. Las dos formas siguientes funcionan de la misma manera; las diferencias son solo azúcar sintáctica .

objeto.metodo(param1, param2)

y

método (objeto, parámetro1, parámetro2)

Torre Eiffel

Dentro de un texto de clase, el tipo actual es el tipo obtenido de la clase actual . Dentro de las características (rutinas, comandos y consultas) de una clase, se puede usar la palabra clave Currentpara hacer referencia a la clase actual y sus características. El uso de la palabra clave Currentes opcional, ya que la palabra clave Currentestá implícita simplemente al referirse abiertamente al nombre de la característica de la clase actual. Por ejemplo: Uno podría tener una característica 'foo' en una clase MY_CLASS y hacer referencia a ella mediante:

 clase MI_CLASE  característica -- Acceso   foo : ENTERO   mi_funcion : ENTERO  hacer Resultado := foo   fin  fin

[12]

La línea n.° 10 (arriba) tiene la referencia implícita Currentmediante la llamada al simple 'foo'.

La línea n.° 10 (abajo) tiene la referencia explícita a Currentla llamada a 'Current.foo'.

 clase MI_CLASE  característica -- Acceso   foo : ENTERO   mi_funcion : ENTERO  hacer Resultado := Actual . foo   fin  fin

Cualquiera de los dos enfoques es aceptable para el compilador, pero se prefiere la versión implícita (por ejemplo, x := foo) ya que es menos detallada.

Al igual que en otros idiomas, hay ocasiones en las que Currentes obligatorio el uso de la palabra clave, como por ejemplo:

 clase MI_CLASE  característica -- Acceso   mi_comando -- Crear MY_OTHER_CLASS con 'Actual' local x : MI_OTRA_CLASE  hacer crear x . make_with_something ( Actual )   fin  fin

En el caso del código anterior, la llamada en la línea n.° 11 a make_with_something pasa la clase actual pasando explícitamente la palabra clave Current.

Java

La palabra clave thises una palabra clave del lenguaje Java que representa la instancia actual de la clase en la que aparece. Se utiliza para acceder a las variables y métodos de la clase.

Dado que todos los métodos de instancia son virtuales en Java, thisnunca pueden ser nulos. [13]

JavaScript

En JavaScript, que es un lenguaje de programación o scripting ampliamente utilizado en navegadores web, thises una palabra clave importante, aunque su evaluación depende de dónde se utilice.

Para solucionar los diferentes significados de thislas funciones anidadas, como los controladores de eventos DOM, en JavaScript es común guardar la thisreferencia del objeto que llama en una variable (comúnmente llamada thato self) y luego usar la variable para hacer referencia al objeto que llama en funciones anidadas.

Por ejemplo:

// En este ejemplo, $ es una referencia a la biblioteca jQuery $ ( ".element" ). hover ( function () { // Aquí, tanto this como that apuntan al elemento bajo el cursor del mouse. var that = this ; $ ( this ). find ( '.elements' ). each ( function () { // Aquí, this apunta al elemento DOM que se está iterando. // Sin embargo, that todavía apunta al elemento bajo el cursor del mouse. $ ( this ). addClass ( "highlight" ); }); });             

Cabe destacar que JavaScript utiliza ambos thisy la palabra clave relacionada self[17] (a diferencia de la mayoría de los otros lenguajes que tienden a emplear uno u otro), y selfestá restringido específicamente a los trabajadores web. [18]

Finalmente, como una forma confiable de hacer referencia específica al objeto global (ventana o equivalente), JavaScript presenta la globalThispalabra clave. [19]

Lua

En Lua, selfse crea como azúcar sintáctico cuando se definen funciones utilizando el :operador. [20] Al invocar un método utilizando :, el objeto que se está indexando se dará implícitamente como el primer argumento de la función que se está invocando.

Por ejemplo, las siguientes dos funciones son equivalentes:

 objeto  local =  {}función  obj . foo ( arg1 ,  arg2 )  print ( arg1 ,  arg2 )  -- no se puede usar "self" aquí finfunción  obj : bar ( arg )  print ( self ,  arg )  -- "self" es un primer argumento implícito antes del fin de arg-- Todas las funciones se pueden invocar de ambas formas, con "." o con ":"obj : foo ( "Foo" ) -- equivalente a obj.foo(obj, "Foo") obj .bar ( obj ,  " Bar " ) -- equivalente a obj :bar("Bar")  

Lua en sí no está orientado a objetos, pero cuando se combina con otra característica llamada metatablas, su uso selfpermite a los programadores definir funciones de una manera similar a la programación orientada a objetos.

Potencia Shell

En PowerShell, la variable automática $_ especial contiene el objeto actual en el objeto de canalización. Puede utilizar esta variable en comandos que realizan una acción en cada objeto o en objetos seleccionados en una canalización. [21]

"uno" ,  "dos" ,  "tres"  |  %  {  write $_  }

También a partir de PowerShell 5.0, que agrega una sintaxis formal para definir clases y otros tipos definidos por el usuario, [22] $this la variable describe la instancia actual del objeto.

Pitón

En Python, no existe una palabra clave para this. Cuando se llama a una función miembro en un objeto, se invoca la función miembro con el mismo nombre en la clase object del objeto, y el objeto se vincula automáticamente al primer argumento de la función. Por lo tanto, el primer parámetro obligatorio de los métodos de instancia es this; este parámetro se denomina convencionalmente self, pero puede tener cualquier nombre.

En los métodos de clase (creados con el classmethoddecorador), el primer argumento se refiere al objeto de clase en sí, y se denomina convencionalmente cls; estos se utilizan principalmente para constructores heredables, [23] donde el uso de la clase como parámetro permite subclasificar el constructor. En los métodos estáticos (creados con el staticmethoddecorador), no existe ningún primer argumento especial.

Óxido

En Rust, los tipos se declaran por separado de las funciones asociadas a ellos. Las funciones diseñadas para ser análogas a los métodos de instancia en lenguajes orientados a objetos más tradicionales deben tomar explícitamente selfcomo su primer parámetro. Estas funciones pueden luego ser invocadas usando instance.method()sintaxis simple. Por ejemplo:

estructura  Foo { bar : i32 , }  impl Foo { función new () -> Foo { Foo { bar : 0 , } } función referir ( & self ) { println! ( " { } " , self.bar ) ; } función mutar ( & mut self , baz : i32 ) { self.bar = baz ; } función consumir ( self ) { self.refer ( ) ; } }                               

Esto define un tipo, Foo, que tiene cuatro funciones asociadas. La primera, Foo::new(), no es una función de instancia y debe especificarse con el prefijo de tipo. Las tres restantes toman un selfparámetro de diversas maneras y se pueden llamar en una Fooinstancia utilizando la sintaxis de notación de puntos, que es equivalente a llamar al nombre de la función calificada por tipo con un primer parámetro explícito self.

let mut foo = Foo :: new (); // debe llamarse como una función de tipo especificado foo . refer (); // imprime "0". Foo::refer() tiene acceso de solo lectura a la instancia foo foo . mutate ( 5 ); // muta foo en su lugar, permitido por la especificación &mut, necesita que foo sea declarado mut foo . consume (); // imprime "5" y destruye foo, ya que Foo::consume() toma plena propiedad de sí mismo        // equivalente a foo.refer() Foo :: refer ( foo ); // error de compilación: foo está fuera del alcance 

Ser

El lenguaje del yo recibe su nombre de este uso de "yo".

Xbase++

Selfse utiliza estrictamente dentro de los métodos de una clase. Otra forma de referirse a Selfes usar ::.

Véase también

Referencias

  1. ^ Dahl, Ole-Johan ; Myhrhaug, Bjørn; Nygaard, Kristen (1970). "Lenguaje base común, Centro de Computación de Noruega".
  2. ^ Powell, Thomas A, y Schneider, Fritz, 2012. JavaScript: The Complete Reference, tercera edición. McGraw-Hill. Capítulo 11, Manejo de eventos , pág. 428. ISBN 978-0-07-174120-0 
  3. ^ Uso de la colección de compiladores GNU (GCC): funciones miembro enlazadas
  4. ^ "Recursión cerrada y abierta", Ralf Hinze, julio de 2007
  5. ^ Recursión abierta, Lambda lo último
  6. ^ "Recursión abierta selectiva: una solución al problema de la clase base frágil", Jonathan Aldrich
  7. ^ "Recursión abierta selectiva: una solución al problema de la clase base frágil", Lambda the Ultimate
  8. ^ Aldrich, Jonathan y Kevin Donnelly. "Recursión abierta selectiva: razonamiento modular sobre componentes y herencia". SAVCBS 2004 Especificación y verificación de sistemas basados ​​en componentes (2004): 26. Citando la solución adoptada por JDK C. Ruby y GT Leavens. "Creación segura de subclases correctas sin ver el código de la superclase". En Object-Oriented Programming Systems, Languages, and Applications, octubre de 2000. doi :10.1145/353171.353186 también disponible como informe técnico TR #00-05d
  9. ^ ISO/IEC 14882:2003(E): Lenguajes de programación - C++ . ISO/IEC. 2003.
  10. ^ Stroustrup: Preguntas frecuentes sobre técnicas y estilos de C++
  11. ^ De Smet, Bart, 2011. C# 4.0 Unleashed. Sams Publishing, Indianápolis, EE. UU. Capítulo 4, Fundamentos del lenguaje , pág. 210. ISBN 978-0-672-33079-7 
  12. ^ NOTA: Los números de línea son solo para fines de referencia. Eiffel no tiene números de línea en el texto de la clase. Sin embargo, hay una opción de número de línea en el IDE de Eiffel Studio, que se puede activar opcionalmente para fines de referencia (por ejemplo, programación en pares, etc.).
  13. ^ Barnes, D. y Kölling, M. Objects First with Java . "...la razón para usar esta construcción [this] es que tenemos una situación que se conoce como sobrecarga de nombres : el mismo nombre que se usa para dos entidades diferentes... Es importante entender que los campos y los parámetros son variables separadas que existen independientemente una de la otra, aunque compartan nombres similares. Un parámetro y un campo que comparten un nombre no es un problema en Java". [ cita requerida ]
  14. ^ Crockford, Douglas, 2008. JavaScript: The Good Parts . O'Reilly Media Inc. y Yahoo! Inc. Capítulo 4, Funciones , pág. 28. ISBN 978-0-596-51774-8 
  15. ^ Powell, Thomas A, y Schneider, Fritz, 2012. JavaScript: The Complete Reference, tercera edición. McGraw-Hill. Capítulo 5, Funciones , págs. 170-171. ISBN 978-0-07-174120-0 
  16. ^ Goodman, Danny, con Morrison, Michael, 2004. Biblia de JavaScript, quinta edición. Wiley Publishing, Inc., Indianápolis, EE. UU. Capítulo 33, Funciones y objetos personalizados , pág. 987. ISBN 0-7645-5743-2 
  17. ^ Red de desarrolladores de Mozilla: Window.self
  18. ^ Red de desarrolladores de Mozilla: API de Web Worker
  19. ^ Red de desarrolladores de Mozilla: globalThis
  20. ^ "Programación en Lua: 16".
  21. ^ msdn. "PowerShell: Acerca de las variables automáticas". docs.microsoft.com . Consultado el 22 de marzo de 2018 .
  22. ^ msdn. "about_Classes". docs.microsoft.com . Consultado el 17 de diciembre de 2018 .
  23. ^ Unificación de tipos y clases en Python 2.2, Guido van Rossum, "Anulación del método __new__"

Lectura adicional