inicio | documentación | contacto
Version para imprimir Imprimir
Inicio » Documentación » Orden de prioridad de acceso a variables en metodos

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:

  1. Busca primero en variables locales y parámetros.
  2. Si no existe, busca entre los atributos del objeto actual.
  3. Si no existe, busca un objeto publico, una clase o una constante de usuario con ese nombre.
  4. 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
Última modificación: miércoles 14 de mayo de 2008 15:35:49
Fecha de creación: jueves 27 de diciembre de 2007 8:51:54
Categorías: