Function
Function オブジェクトについて
4D.Function
オブジェクトにはコードが格納されて います。このコードは ()
演算子を使用して、または apply()
や call()
関数を使用して呼び出すことができます。 4D では 3種類の Function
オブジェクトが利用できます:
- ネイティブ関数 (
collection.sort()
やfile.copyTo()
などの 4Dクラスにビルトインされた関数)。 - ユーザー関数 (ユーザークラス において Function キーワードを使って作成されたもの)。
- フォーミュラ関数 (4Dフォーミュラを実行するもの)。
Formula オブジェクト
Formula あるいは Formula from string コマンドを使用すると、4D.Function
オブジェクト を作成することができ、それによってあらゆる 4D式やテキストとして表されたコードを実行することが可能です。
Formulaオブジェクトは、オブジェクトプロパティに格納することができます。
var $f : 4D.Function
$f:=New object
$f.message:=Formula(ALERT("Hello world"))
このようなプロパティは "オブジェクト関数"、つまり親オブジェクトに紐づいた関数です。 オブジェクトプロパティに保存されている関数を実行するには、プロパティ名のあとに () をつけます:
$f.message() // "Hello world" を表示します
大カッコを使用したシンタックスもサポートされます:
$f["message"]() // "Hello world" と表示します
たとえ引数を受け取らなかったとしても (後述参照)、オブジェクト関数を実行するためにはカッコ ( ) をつけて呼び出す必要があるという点に注意してください。 オブジェクトプロパティのみを呼び出した場合、フォーミュラへの新しい参照が返されます (そしてフォーミュラは実行はされません):
$o:=$f.message // $o にはフォーミュラオブジェクトが返されます
apply()
および call()
関数を使って関数を実行することもできます:
$f.message.apply() // "Hello world!" を表示します
引数の受け渡し
フォーミュラには、順番引数シンタックス $1, $2...$n を使用して引数を渡すことができます。 たとえば:
var $f : Object
$f:=New object
$f.message:=Formula(ALERT("Hello "+$1))
$f.message("John") // "Hello John" を表示します
あるいは、.call() 関数を使用して:
var $f : Object
$f:=Formula($1+" "+$2)
$text:=$f.call(Null;"Hello";"World") // "Hello World" を返します
$text:=$f.call(Null;"Welcome to";String(Year of(Current date))) // "Welcome to 2019" (例) を返します
単一メソッド用の引数
利便性のために、フォーミュラが単一のプロジェクトメソッドから作成された場合には、引数はフォーミュラオブジェクトの初期化では省略することができます。 省略された引数は、フォーミュラを呼び出す時に一緒に渡すことができます。 例:
var $f : 4D.Function
$f:=Formula(myMethod)
// ここで Formula(myMethod($1;$2) と書く必要はありません
$text:=$f.call(Null;"Hello";"World") // "Hello World" を返します
$text:=$f.call() // "How are you?" を返します
//myMethod
#DECLARE ($param1 : Text; $param2 : Text)->$return : Text
If(Count parameters=2)
$return:=$param1+" "+$param2
Else
$return:="How are you?"
End if
引数はメソッド内において、呼び出し時に指定した順で受け取られます。
概要
.apply() : any .apply( thisObj : Object { ; formulaParams : Collection } ) : any 対象の Formula オブジェクトを実行し、その結果の値を返しま す |
.call() : any .call( thisObj : Object { ; ...params : any } ) : any 対象の Formula オブジェクトを実行し、その結果の値を返します |
.source : Text 対象フォーミュラのテキスト型のソース式を格納します |
Formula
履歴
リリース | 内容 |
---|---|
17 R6 | 名称変更 (New formula -> Formula) |
17 R3 | 追加 |
Formula ( formulaExp : Expression ) : 4D.Function
引数 | 型 | 説明 | |
---|---|---|---|
formulaExp | 式 | -> | オブジェクトとして返されるフォーミュラ |
戻り値 | 4D.Function | <- | フォーミュラを格納しているネイティブな Function オブジェクト |
|
説明
Formula
コマンドは、 formulaExp の式に基づいた 4D Function
オブジェクトを作成します. formulaExp には単一の値のようにシンプルなものから、引数を持つプロジェクトメソッドのように複雑なものまで指定することができます。
フォーミュラがオブジェクトとして存在することで、コマンドやメソッドに対して引数 (計算された属性) として渡したり、"コンポーネントとホストデータベース間で共有" として宣言せずとも様々なコンポーネントから実行したりできるようになります。 呼び出されたフォーミュラオブジェクトは、それを作成したデータベースあるいはコンポーネントのコンテキストにおいて評価されます。
返されたフォーミュラは以下の方法で呼び出すことが可能です:
.call()
あるいは.apply()
関数- オブジェクト記法シンタックス (Formula オブジェクト 参照)
var $f : 4D.Function
$f:=Formula(1+2)
$o:=New object("myFormula";$f)
// フォーミュラを呼び出す 3つの方法
$f.call($o) // 3 を返します
$f.apply($o) // 3 を返します
$o.myFormula() // 3 を返します
フォーミュラには 引数 を渡すことができます (例題4 参照)。
フォーミュラの実行対象となるオブジェクトを指定することができます (例題5 参照)。 このオブジェクトのプロパティは、This
コマンドでアクセス可能です。
formulaExp がローカル変数を使用する場合、返されるフォーミュラオブジェクトの作成時にその値がそこにコピーされ保存されます。 実行時、フォーミュラはそのローカル変数の現在値ではなく、コピーされた値を使用します。 ローカ ル変数として配列を使用することはサポートされていない点に注意してください。
Formula
によって作成されたオブジェクトは、たとえばデータベースのフィールドや Blob ドキュメントなどに保存可能です。
例題 1
単純なフォーミュラの例:
var $f : 4D.Function
$f:=Formula(1+2)
var $o : Object
$o:=New object("f";$f)
$result:=$o.f() // 3 を返します
例題 2
ローカル変数を使用するフォーミュラの例:
$value:=10
$o:=New object("f";Formula($value))
$value:=20
$result:=$o.f() // 10 を返します
例題 3
引数を用いたシンプルなフォーミュラの例:
$o:=New object("f";Formula($1+$2))
$result:=$o.f(10;20) // 30 を返します