Saltar al contenido principal
Versión: 21 R3 BETA

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.Method en una propiedad del objeto y utilizar el operador () después del nombre de la propiedad,
  • o llamar directamente al objeto 4D.Method usando la función call() o apply() en él.

Ver ejemplos en el párrafo Ejecución de código en los objetos Function.

Entrada de blog relacionada
info

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
LanzamientoModificaciones
21 R3Añadidos

4D.Method.new( source : Text {; name : Text } ) : 4D.Method

ParámetrosTipoDescripción
sourceText->Representación textual de un método 4D a encapsularse como un objeto
nameText->Nombre del método a mostrar en el depurador. Si se omite, el nombre del método se mostrará como "anonymous"
Resultado4D.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".

tip

Se recomienda nombrar explícitamente su método si lo desea:

El objeto 4D.Method resultante puede ser verificado utilizando checkSyntax() y ejecutado utilizando (), .apply() o .call().

nota

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
LanzamientoModificaciones
21 R3Soporte de objetos 4D.Methods
17 R3Añadidos

.apply() : any
.apply( thisObj : Object { ; params : Collection } ) : any

ParámetrosTipoDescripción
thisObjObject->Objeto a devolver por el comando This en la función
paramsCollection->Colección de valores que se pasarán como parámetros a la función
Resultadoany<-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.Function como los objetos 4D.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
LanzamientoModificaciones
21 R3Soporte de objetos 4D.Methods
17 R3Añadidos

.call() : any
.call( thisObj : Object { ; ...params : any } ) : any

ParámetrosTipoDescripción
thisObjObject->Objeto a devolver por el comando This en la función
paramsany->Valores a pasar como parámetros a la función
Resultadoany<-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
LanzamientoModificaciones
21 R3Añadidos

.checkSyntax() : Object

ParámetrosTipoDescripción
ResultadoObject<-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:

PropiedadTipoDescripción
successBooleanTrue si no se ha detectado ningún error de sintaxis, false en caso contrario
errorsColección de objetosDisponible sólo en caso de error o de warning. Colección de objetos que describen errores o advertencias
[].isErrorBooleanError si es True, sino warning
[].messageTextMensaje de error o advertencia
[].lineNumberIntegerNú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
LanzamientoModificaciones
21 R3Añ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
LanzamientoModificaciones
21 R3Soporte de objetos 4D.Methods
18 R2Añ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"