メソッド
4D.Method オブジェクトには、ソーステキストから作成され、実行可能なコードの一部分が格納されています。 4D.Method のメソッドは、プロジェクトの実行モード(インタープリター/コンパイル)に関わらず、常にインタープリターモードで実行されます。 この機能は特に、ダイナミックなコードスニペットのオン・ザ・フライな実行をサポートするように設計されてます。
4D.Method オブジェクトは、4D.Method.new() 関数で作成されます。
4D.Method オブジェクトは、 4D.Function クラスを継承します。 そのため、メソッドオブジェクトを実行するためには、以下のような方法があります:
- オブジェクトプロパティに
4D.Methodオブジェクトを入れ、プロパティ名の後に()演算子を使用する - または、
call()あるいはapply()関数を使用して4D.Methodオブジェクトを呼び出す。
Function オブジェクト内のコードを実行する の段落の例題を参照してください。
このクラスは、バイナリーでストリーム可能 です。
例題
基本的なダイナミックメソッド作成
var $myCode : Text
$myCode:="#DECLARE ($number1:Integer;$number2:Integer):Integer"+Char(13)+"return $number1*$number2"
var $o:={}
$o.multiplication:=4D.Method.new($myCode) // オブジェクトをプロパティにいれる
var $result2:=$o.multiplication(2;3) // 6
var $result3:=4D.Method.new($myCode).call(Null; 10; 5) // 50
メソッドコード内で This を使用する
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 は "Hello John"
テキストファイルをシンタックスチェックにかける
// テキストファイル内に保存されている4D メソッド
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
このメソッドは以下のようなコード内で呼び出されます:
var $myFile:=File("/DATA/BusinessRules.4dm")
var $myMethod:=4D.Method.new($myFile.getText())
// シンタックスエラーの検証
If ($myMethod.checkSyntax().success)
$myMethod.call()
End if
メソッドオブジェクト
4D.Method オブジェクトは以下のプロパティと関数を提供します:
| .apply() : any .apply( thisObj : Object { ; params : Collection } ) : any 対象の function オブジェクトを、引数をコレクションとして渡して実行し、その結果の値を返します |
| .call() : any .call( thisObj : Object { ; ...params : any } ) : any executes the function object to which it is applied, with one or more parameter(s) passed directly, and returns the resulting value |
.checkSyntax() : Object4D.Method オブジェクトのソースコードに対してシンタックスをチェックし、その結果のオブジェクトを返します |
.name : Textnew() コンストラクターの name 引数内で宣言されていれば、4D.Method オブジェクトの名前が格納されています |
| .source : Text 対象ファンクションのテキスト型のソースコード |
4D.Method.new()
履歴
| リリース | 内容 |
|---|---|
| 21 R3 | 追加 |
4D.Method.new( source : Text {; name : Text } ) : 4D.Method
| 引数 | 型 | 説明 | |
|---|---|---|---|
| source | Text | -> | テキストとして表現された、オブジェクトとしてカプセル化される4D メソッド |
| name | Text | -> | デバッガに表示するメソッド名。 省略した場合、メソッド名は "anonymous" と表示されます。 |
| 戻り値 | 4D.Method | <- | 新規メソッド共有オブジェクト |
説明
4D.Method.new() 関数は、 source 引数のコードからビルドされた新しい 4D.Method 型のオブジェクトを作成して返します。
source 引数には、メソッドの4D ソースコードをテキストとして渡します。 Char コマンドまたは エスケープシークエンスを使用することで、全ての行末文字(LF、CR、CRLF)がサポートされています。
オプションの name 引数には、4D デバッガーあるいはランタイムエクスプローラーに表示されるメソッドの名前を渡します。 この引数を省略した場合、メソッド名は、 "anonymous" として表示されます。
以下のような場合には、 name 引数を使用してメソッドに名前をつけることが推奨されます:
- デバッガのカスタムウォッチエリア 内で一貫したメソッド名を使用する(anonymous なメソッドはデバッガでは永続的ではありません)。
Method get pathやMethod resolve pathなどのコマンドを使用して揮発性のメソッドを管理する(anonymous なメソッドはパスを持ちません)。
返される4D.Method オブジェクトは、checkSyntax() を使用してチェックできる他、 ()、 .apply() あるいは .call() を使用して実行可能です。
命名された揮発性のメソッドオブジェクトはプロジェクトメソッドではありません。これらはディスクファイル内に保存はされず、EXECUTE METHOD などのコマンドで呼び出すことはできません。 その一方で、これらは4D.Function クラスを継承するため、 4D.Function オブジェクトが想定されているところであればどこでも使用可能です。
例題
var $m:=4D.Method.new("#DECLARE ($t : Text) : Text \nreturn Uppercase($t)")
var $res:=$m.call(Null; "hello world") //HELLO WORLD
.apply()
履歴
| リリース | 内容 |
|---|---|
| 21 R3 | 4D.Methods オブジェクトのサポート |
| 17 R3 | 追加 |
.apply() : any
.apply( thisObj : Object { ; params : Collection } ) : any
| 引数 | 型 | 説明 | |
|---|---|---|---|
| thisObj | Object | -> | 関数内での This コマンドによって返されるオブジェクト |
| params | Collection | -> | 関数に引数として渡される値のコレクション |
| 戻り値 | any | <- | 関数の実行結果の値 |
説明
.apply() 関数は、対象の function オブジェクトを、引数をコレクションとして渡して実行し、その結果の値を返します。
thisObj には、関数内で This として使用されるオブジェクトへの参照を渡すことができます。 This を使用せず、しかし引数を渡したい場合には、ここに Null を渡します。
任意の params 引数を使用することで、フォーミュラ内で引数として使用されるコレクションを渡すこともできます:
4D.Formulaオブジェクトには、引数は $1...$n でフォーミュラに渡されます。4D.Methodオブジェクトのようなその他の4D.Functionオブジェクトには、引数は宣言されたメソッド引数 内に渡されます。
.apply() は .call() と似ていますが、引数をコレクションとして渡す点が異なります。 これは計算された結果を渡すのに便利です。
例題
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()
履歴
| リリース | 内容 |
|---|---|
| 21 R3 | 4D.Methods オブジェクトのサポート |
| 17 R3 | 追加 |
.call() : any
.call( thisObj : Object { ; ...params : any } ) : any
| 引数 | 型 | 説明 | |
|---|---|---|---|
| thisObj | Object | -> | 関数内での This コマンドによって返されるオブジェクト |
| params | any | -> | 関数に引数として渡される値 |
| 戻り値 | any | <- | 関数の実行結果の値 |
説明
The .call() function executes the function object to which it is applied, with one or more parameter(s) passed directly, and returns the resulting value.
thisObj には、関数内で This として使用されるオブジェクトへの参照を渡すことができます。
任意の params 引数を使用することで、フォーミュラ内で引数として使用される値を渡すこともできます:
4D.Formulaオブジェクトには、引数は $1...$n でフォーミュラに渡されます。4D.Methodオブジェクトでは、引数は宣言されたメソッド引数 内に渡されます。
.call() は .apply() と似ていますが、引数を直接渡す点が異なります。
例題
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()
履歴
| リリース | 内容 |
|---|---|
| 21 R3 | 追加 |
.checkSyntax() : Object
| 引数 | 型 | 説明 | |
|---|---|---|---|
| 戻り値 | Object | <- | シンタックスチェックの結果オブジェクト |
説明
.checkSyntax() 関数は 4D.Method オブジェクトのソースコードに対してシンタックスをチェックし、その結果のオブジェクトを返します。
結果オブジェクトには、以下のプロパティが格納されています:
| プロパティ | 型 | 説明 | |
|---|---|---|---|
| success | Boolean | シンタックスエラーが何も検出されなかった場合にはTrue、それ以外の場合にはFalse | |
| errors | Object の Collection | 以下はerror または warningの場合にのみ返されます。 エラーまたは警告の詳細を格納したオブジェクトのコレクション | |
| [].isError | Boolean | エラーならTrue、それ以外の場合は警告 | |
| [].message | Text | エラーならTrue、それ以外の場合は警告 | |
| [].lineNumber | Integer | コード内でのエラーが発生した行番号 |
例題
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
履歴
| リリース | 内容 |
|---|---|
| 21 R3 | 追加 |
.name : Text
説明
.name プロパティには、new() コンストラクターの name 引数内で宣言されていれば、4D.Method オブジェクトの名前が格納されています。 それ以外の場合、プロパティは返されません。
このプロパティは 読み取り専用 です。
.source
履歴
| リリース | 内容 |
|---|---|
| 21 R3 | 4D.Methods オブジェクトのサポート |
| 18 R2 | 追加 |
.source : Text
説明
.source プロパティは、対象ファンクションのテキスト型のソースコードを格納します。
返される値は4D.Formula または4D.Method オブジェクトを作成するのに使用された元のテキストですが、再フォーマットされます。
このプロパティは 読み取り専用 です。
例題
var $myCode:="#DECLARE ():Real\n"+\
"return random*current time"
$m:=4D.Method.new($myCode)
$src:=$m.source //"#DECLARE() : Real\rreturn Random*Current time"