Variables, literales y tipos
14 min
identificadores los identificadores son nombres de variables, funciones y etiquetas también se aplican a los métodos de objetos de brightscript (es decir, funciones) y a las interfaces (que aparecen después de un operador de punto " ") los identificadores tienen las siguientes reglas deben comenzar con un carácter alfabético (a z) pueden consistir en caracteres alfabéticos, números o el símbolo de guion bajo (" ") no distinguen entre mayúsculas y minúsculas pueden tener cualquier longitud no pueden ser una palabra reservada docid\ eadllluwb1vxx nrobbch ( solo variables ) pueden terminar con una declaración de tipo opcional ("$" para una cadena, "%" para un entero, "!" para un float, "#" para un double) ejemplos a boy5 super man$ 42% tipos brightscript admite tanto tipado dinámico como tipos declarados esto significa que cada valor tiene un tipo determinado en tiempo de ejecución, pero también se puede indicar que las variables siempre contengan un valor de un tipo especificado si se asigna un valor a una variable que tiene un tipo especificado, el tipo del valor se convertirá al tipo de la variable si es posible si la conversión es imposible, se producirá un error en tiempo de ejecución una variable que no termina con una declaración de tipo puede cambiar su tipo dinámicamente por ejemplo, la instrucción a=4 creará un entero, mientras que una instrucción posterior que especifique que a="hola" cambiará el tipo de la variable a a una cadena brightscript admite los siguientes tipos booleano true o false entero un número entero con signo de 32 bits flotar el formato de número de punto flotante más pequeño compatible con el hardware o el software doble el formato de número de punto flotante más grande compatible con el hardware o el software aunque double es un tipo comprendido intrínsecamente, se implementa internamente con el objeto rointrinsicdouble cadena una secuencia de caracteres ascii (no utf 8) brightscript utiliza dos estados de cadena intrínsecos cadenas constantes una instrucción como s="astring" creará una cadena constante intrínseca instancias de rostring una vez que una cadena se utiliza en una expresión, se convierte en una instancia de rostring por ejemplo, la instrucción s = s + "bstring" hará que la cadena intrínseca s se convierta en una instancia de rostring si esto va seguido de la instrucción s2 = s , el valor de s2 será una referencia a s , no una copia de esta el comportamiento de las cadenas con recuento de referencias es nuevo en la versión 3 0 de brightscript objeto una referencia a un objeto brightscript (es decir, un componente nativo) tenga en cuenta que la función type() no devolverá "object", sino el tipo de objeto en su lugar (por ejemplo, rolist , rovideoplayer ) tenga en cuenta también que no existe un tipo separado para los objetos intrínsecos de brightscript todos los objetos intrínsecos de brightscript se basan en el tipo de objeto roassociativearray interfaz una interfaz en un objeto brightscript si se utiliza un operador de punto " " en un tipo de interfaz, el miembro debe ser estático (ya que no hay contexto de objeto) no válido un tipo que solo puede tener un valor no válido este tipo se devuelve en varias instancias cuando ningún otro tipo es válido (por ejemplo, al indexar un arreglo que nunca se ha enviado) también se puede asignar a una variable con la instrucción var = invalid los siguientes son ejemplos de diferentes tipos la instrucción ? es un atajo para imprimir , mientras que la función type() devuelve una cadena que identifica el tipo de la expresión pasada brightscript> ?type(1) integer brightscript> ?type(1 0) float brightscript> ?type("hello") string brightscript> ?type(createobject("rolist")) rolist brightscript> ?type(1%) integer brightscript> b!=1 brightscript> ?type(b!) float brightscript> c$="hello" brightscript> ?type(c$) string brightscript> d="hello again" brightscript> ?type(d) string brightscript> d=1 brightscript> ?type(d) integer brightscript> d=1 0 brightscript> ?type(d) float brightscript>e=invalid brightscript>?type(e) invalid caracteres de declaración de tipo se puede usar una declaración de tipo al final de una variable o literal para fijar su tipo las variables con el mismo identificador pero tipos separados son variables distintas por ejemplo, definir a$ y a% crearía dos variables independientes carácter tipo ejemplos $ string a$, zz$ % integer a1%, sum% ! precisión simple (float) b!, n1! # precisión doble (double) a#, 1/3#, 2# literales (constantes) los siguientes son tipos literales válidos tipo boolean verdadero o falso tipo invalid no válido solamente tipo string una cadena entre comillas (p ej , "esto es una cadena" ) tipo integer un entero en formato hexadecimal (p ej , hff ) o decimal (p ej , 255 ) tipo float un número con un decimal (p ej , 2 01 ), en notación científica (p ej , 1 23456e+30 ), o con un designador de tipo float (p ej , 2! ) tipo double un número en notación científica que contiene un símbolo de exponente de precisión doble (p ej , 1 23456789d 12 ) o con una declaración de tipo double (p ej , 2 3# ) tipo function similar al formato de variable (p ej , myfunction ) tipo integer line num – el número de línea fuente actual literales de matriz el \[] operador de matriz se puede usar para declarar una matriz puede contener literales (constantes) o expresiones x = 5 myarray = \[] myarray = \[ 1, 2, 3] myarray = \[ x+5, true, 1<>2, \["a","b"]] literales de arreglos asociativos el operador de arreglo asociativo { } puede utilizarse para definir un arreglo asociativo puede contener literales (constantes) o expresiones aa = { } aa = {key1 "value", key2 55, key3 5+3 } los arreglos y arreglos asociativos también pueden definirse con el siguiente formato aa = { myfunc1 afunction myval1 "the value" } retorno de objeto no válido muchos métodos (es decir, funciones) que devuelven objetos también pueden devolver invalid (por ejemplo, en los casos en los que no hay ningún objeto para devolver) en estos casos, la variable que acepta el resultado debe tiparse dinámicamente, ya que puede asignársele cualquiera de los dos tipos el siguiente código devolverá una incompatibilidad de tipos a$ es una cadena que tiene una declaración de tipo string y, por lo tanto, no puede contener invalid l = \[] a$ = l pop() números tipado dinámico las siguientes reglas determinan cómo se tipan dinámicamente los enteros, doubles y floats si una constante contiene 10 o más dígitos, o si d se utiliza en el exponente, el número es double agregar una declaración de tipo # también fuerza a que una constante sea double si el número no es de doble precisión y contiene un punto decimal, el número es float expresar un número en notación científica usando el exponente e también fuerza a que una constante sea float si ninguna de las condiciones anteriores es verdadera para una constante, el número es integer conversión de tipos cuando se realizan operaciones con uno o dos números, el resultado debe tiparse como integer, float o double cuando se realiza una operación de suma (+), resta ( ) o multiplicación ( ), el resultado tendrá el mismo grado de precisión que el operando más preciso por ejemplo, multiplicar un integer por un double devolverá un número que es double solo cuando ambos operandos sean integer el resultado será un número integer si el resultado de dos operandos integer está fuera del rango de 32 bits, la operación y el retorno se llevarán a cabo con doubles la división (/) opera usando las mismas reglas anteriores, excepto que nunca puede realizarse a nivel integer cuando ambos operadores son integer, la operación y el retorno se llevarán a cabo con floats las operaciones de comparación (p ej , <, >, =) convertirán los números al mismo tipo antes de compararlos el tipo menos preciso siempre se convertirá al tipo más preciso conversión de tipos y precisión cuando un número float o double se convierte al tipo integer, se redondea hacia abajo se utiliza el entero más grande que no sea mayor que el número esto también sucede cuando se llama a la función int sobre un número cuando un número double se convierte al tipo float, se redondea 4/5 el dígito menos significativo se redondea hacia arriba si la parte fraccionaria es >=5 (de lo contrario, se deja sin cambios) cuando un número float se convierte al tipo double, solo los siete dígitos más significativos serán precisos