Orden de prioridad de acceso a variables en metodos
Dentro del código de un método, si introducimos una variable tal cual, sin indicar a quien pertenece, el sistema realizará una búsqueda en el siguiente el orden de preferencias:
- Busca primero en variables locales y parámetros.
- Si no existe, busca entre los atributos del objeto actual.
- Si no existe, busca un objeto publico, una clase o una constante de usuario con ese nombre.
- Si no existe, provocará un fallo de variable no encontrada.
Ejemplos:
En este ejemplo, la variable local color tiene preferencia sobre cualquier otra entidad con el mismo nombre (el atributo color del objeto Prueba, un objeto publico llamado color o una constante de usuario llamada color también). Por esta razón, el valor a imprimir será null, ya que la variable local no ha sido inicializada con ningún valor todavía, y no "Verde" o "rojo".
const color = "Verde"
object Prueba
var color = "rojo"
def metodo()
local color
println color
end
endobject
def main
Prueba.metodo()
end
Dar prioridad a los atributos del propio objeto
Siguiendo el ejemplo anterior, si quisiéramos que tuviera preferencia el atributo color, es necesario utilizar el contexto especial #self que hace siempre referencia al objeto actual, que en esta caso sería Prueba. Es decir, dentro de todos los métodos del objeto Prueba, poner #self delante de sus atributos o métodos es equivalente a poner Prueba delante de los mismos.
En este ejemplo se accede directamente al atributo color del objeto Prueba y del objeto #self (que equivale a Prueba cuando se usa en los métodos del objeto Prueba) directamente, por lo que no hay duda posible: se imprime el texto "rojo".
const color = "Verde"
object Prueba
var color = "rojo"
def metodo()
local color
println #self.color
println Prueba.color
end
endobject
def main
Prueba.metodo()
end
Dar prioridad a objetos públicos o constantes
Siguiendo el ejemplo anterior, si quisiéramos que tuviera preferencia la constante color, es necesario utilizar el contexto especial #global. En el siguiente ejemplo se accede a la constante de usuario color, por lo que se imprime "Verde".
const color = "Verde"
object Prueba
var color = "rojo"
def metodo()
local color
println #global.color
end
endobject
def main
Prueba.metodo()
end
Lo mismo sucede si tuviéramos un objeto público o clase color: sería necesario utilizar el contexto especial #global. En el siguiente ejemplo se accede al atributo matiz del objeto publico color, por lo que se imprime "Oscuro".
object color
var matiz = "Oscuro"
endobject
object Prueba
var color = "rojo"
def metodo()
local color
println #global.color.matiz
end
endobject
def main
Prueba.metodo()
end
Dado que no pueden existir una constante de usuario con el mismo nombre que un objeto publico o clase, el contexto especial #global sirve para lo mismo en los dos casos.
Prioridad a variables locales
Las variables del contexto local ya tienen prioridad sobre los atributos del objeto y el contexto global, por lo que no es necesario utilizar nada para que el sistema utilice antes estar variables que otras. De todas formas, si por claridad se desea dar prioridad sería necesario utilizar el contexto especial #local. Ver contexto local para saber más sobre #local.
Resumen
El orden de prioridad se puede resumir de la siguiente manera
| 1 | » | 2 | » | 3 |
|---|---|---|---|---|
| Contexto local | Objeto actual | Contexto global | ||
#local | #self | #global |