Método
Un objeto 4D.Method contiene un fragmento de código que se crea a partir de la fuente de texto y puede ser ejecutado. Los métodos 4D.Method siempre se ejecutan en modo interpretado, independientemente del modo de ejecución del proyecto (interpretado/compilado). Esta funcionalidad está especialmente diseñada para permitir la ejecución dinámica y sobre la marcha de fragmentos de código.
Un objeto 4D.Method se crea con la función 4D.Method.new().
Los objetos 4D.Method heredan de la clase 4D.Function. Así, para ejecutar el objeto método, puede:
- almacenar un objeto
4D.Methoden una propiedad del objeto y utilizar el operador()después del nombre de la propiedad, - o llamar directamente al objeto
4D.Methodusando la funcióncall()oapply()en él.
Ver ejemplos en el párrafo Ejecución de código en los objetos Function.
Esta clase es streamable en binario.
Ejemplos
Creación de un método dinámico de base
var $myCode : Text
$myCode:="#DECLARE ($number1:Integer;$number2:Integer):Integer "+Char(13)+"return $number1*$number2"
var $o:={}
$o.multiplication:=4D.Method.new($myCode) //poner objeto en una propiedad
var $result2:=$o.multiplication(2;3) // 6
var $result3:=4D.Method.new($myCode).call(Null; 10; 5) // 50
Uso de This dentro del código del método
var $myCode:="#DECLARE ($str1:text):text"+Char(13)+"return $str1+This.name"
var $o:={name: "John"}
$o.concat:=4D.Method.new($myCode)
var $result : Text
$result:=$o.concat("Hello ") // $result is "Hello John"
Utilizar un archivo de texto con comprobación sintáctica
//Método 4d almacenado en un archivo de texto
var $newBusinessRules:=New shared object
Use ($newBusinessRules)
$newBusinessRules.taxRate:=0.2
$newBusinessRules.discountFormula:="price * quantity * discountRate"
$newBusinessRules.approvalThreshold:=10000
$newBusinessRules.freeShippingThreshold:=150
$newBusinessRules.defaultCurrency:="EUR"
End use
Use (Storage)
Storage.businessRules:=$newBusinessRules
End use
Este método se llama en el código:
var $myFile:=File("/DATA/BusinessRules.4dm")
var $myMethod:=4D.Method.new($myFile.getText())
// Verificación de errores de sintaxis
If ($myMethod.checkSyntax().success)
$myMethod.call()
End if
Objeto Método
Los objetos 4D.Method ofrecen las siguientes propiedades y funciones:
| .apply() : any .apply( thisObj : Object { ; params : Collection } ) : any ejecuta el objeto función al que se aplica, pasando los parámetros como una colección, y devuelve el valor resultante |
| .call() : any .call( thisObj : Object { ; ...params : any } ) : any ejecuta el objeto función al que se aplica, con uno o más parámetros pasados directamente, y devuelve el valor resultante |
| .checkSyntax() : Object verifica la sintaxis del código fuente del objeto 4D.Method y devuelve un objeto resultado |
| .name : Text contiene el nombre del objeto 4D.Method, si fue declarado en el parámetro name del constructor new() |
| .source : Text contiene el código fuente de la función como texto |
4D.Method.new()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R3 | Añadidos |
4D.Method.new( source : Text {; name : Text } ) : 4D.Method
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| source | Text | -> | Representación textual de un método 4D a encapsularse como un objeto |
| name | Text | -> | Nombre del método a mostrar en el depurador. Si se omite, el nombre del método se mostrará como "anonymous" |
| Resultado | 4D.Method | <- | Nuevo método objeto compartido |
Descripción
La función 4D.Method.new() crea y devuelve un nuevo objeto 4D.Method construido a partir del código source.
En el parámetro source, pase el código fuente 4D del método como texto. Todos los caracteres de fin de línea son soportados (LF, CR, CRLF) utilizando el comando Char o una secuencia de escape.
En el parámetro opcional name, pase el nombre del método que se mostrará en el depurador 4D o en el explorador Runtime. Si omite este parámetro, el nombre del método aparecerá como "anonymous".
Se recomienda nombrar explícitamente su método si lo desea:
- utilizar nombre de método persistente en la ventana de evaluación del depurador (los métodos anónimos no son persistentes en el depurador).
- manipular el método volátil utilizando comandos como
Method get pathyMethod resolve path(los métodos anónimos no tienen rutas).
El objeto 4D.Method resultante puede ser verificado utilizando checkSyntax() y ejecutado utilizando (), .apply() o .call().
Los objetos método volátiles con nombre no son métodos proyecto, no se almacenan en archivos disco y no pueden ser llamados por comandos como EXECUTE METHOD. Por otra parte, dado que heredan de la clase 4D.Function, pueden utilizarse siempre que se espere un objeto 4D.Function.
Ejemplo
var $m:=4D.Method.new("#DECLARE ($t : Text) : Text \nreturn Uppercase($t)")
var $res:=$m.call(Null; "hello world") //HELLO WORLD
.apply()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R3 | Soporte de objetos 4D.Methods |
| 17 R3 | Añadidos |
.apply() : any
.apply( thisObj : Object { ; params : Collection } ) : any
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| thisObj | Object | -> | Objeto a devolver por el comando This en la función |
| params | Collection | -> | Colección de valores que se pasarán como parámetros a la función |
| Resultado | any | <- | Valor de la ejecución de la función |
Descripción
La función .apply() ejecuta el objeto función al que se aplica, pasando los parámetros como una colección, y devuelve el valor resultante.
En el parámetro thisObj, puede pasar una referencia al objeto que se utilizará como This en la función. Pasa Null si no quiere utilizar This pero quiere enviar parámetros.
Puede pasar una colección para utilizarla como parámetros en la función utilizando el parámetro opcional params:
- en los objetos
4D.Formula, los parámetros se pasan en $1...$n en la fórmula. - en los otros objetos
4D.Functioncomo los objetos4D.Method, los parámetros se pasan en parámetros declarados.
Tenga en cuenta que .apply() es similar a .call() excepto que los parámetros se pasan como una colección. Esto puede ser útil para pasar los resultados calculados.
Ejemplo
var $coll:=[10; 2]
var $myCode:="#DECLARE ($number1:Integer;$number2:Integer):Integer\n"+\
"return $number1*$number2"
$m:=4D.Method.new($myCode; "m_multiple")
var $result:=$m.apply(Null; $coll) //20
.call()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R3 | Soporte de objetos 4D.Methods |
| 17 R3 | Añadidos |
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| thisObj | Object | -> | Objeto a devolver por el comando This en la función |
| params | any | -> | Valores a pasar como parámetros a la función |
| Resultado | any | <- | Valor de la ejecución de la función |
Descripción
La función .call() ejecuta el objeto función al que se aplica, con uno o más parámetros pasados directamente, y devuelve el valor resultante.
En el parámetro thisObj, puede pasar una referencia al objeto que se utilizará como This en la función.
Puede pasar valores que se utilizarán como parámetros en la función utilizando el parámetro opcional params:
- en los objetos
4D.Formula, los parámetros se pasan en $1...$n en la fórmula. - en los objetos
4D.Method, los parámetros se pasan en parámetros declarados.
Tenga en cuenta que .call() es similar a .apply() excepto que los parámetros se pasan directamente.
Ejemplo
var $m : 4D.Method
var $myCode:="#DECLARE ($number1:Integer;$number2:Integer):Integer\n"+\
"return $number1*$number2"
$m:=4D.Method.new($myCode; "m_multiple")
var $result:=$m.call(Null; 10; 5) //50
.checkSyntax()
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R3 | Añadidos |
.checkSyntax() : Object
| Parámetros | Tipo | Descripción | |
|---|---|---|---|
| Resultado | Object | <- | Objeto resultado de verificación sintáctica |
Descripción
La función .checkSyntax() verifica la sintaxis del código fuente del objeto 4D.Method y devuelve un objeto resultado.
El objeto devuelto contiene las siguientes propiedades:
| Propiedad | Tipo | Descripción | |
|---|---|---|---|
| success | Boolean | True si no se ha detectado ningún error de sintaxis, false en caso contrario | |
| errors | Colección de objetos | Disponible sólo en caso de error o de warning. Colección de objetos que describen errores o advertencias | |
| [].isError | Boolean | Error si es True, sino warning | |
| [].message | Text | Mensaje de error o advertencia | |
| [].lineNumber | Integer | Número de línea del error en el código |
Ejemplo
var $m : 4D.Method
var $check : Object
$m:=4D.Method.new("var $a:=2026\r$a:=current date")
$check:=$m.checkSyntax()
If ($check.success=False)
ALERT("Syntax error: "+$check.errors[0].message)
End if
.name
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R3 | Añadidos |
.name : Text
Descripción
La propiedad .name contiene el nombre del objeto 4D.Method, si fue declarado en el parámetro name del constructor new(). En caso contrario, no se devuelve la propiedad.
Esta propiedad es de solo lectura.
.source
Historia
| Lanzamiento | Modificaciones |
|---|---|
| 21 R3 | Soporte de objetos 4D.Methods |
| 18 R2 | Añadidos |
.source : Text
Descripción
La propiedad .source contiene el código fuente de la función como texto.
El valor devuelto es el texto original utilizado para crear el objeto 4D.Formula o 4D.Method pero reformateado.
Esta propiedad es de solo lectura.
Ejemplo
var $myCode:="#DECLARE ():Real\n"+\
"return random*current time"
$m:=4D.Method.new($myCode)
$src:=$m.source //"#DECLARE() : Real\rreturn Random*Current time"