メインコンテンツまでスキップ
バージョン: 次へ

メソッド

4D.Method オブジェクトには、ソーステキストから作成され、実行可能なコードの一部分が格納されています。 4D.Method のメソッドは、プロジェクトの実行モード(インタープリター/コンパイル)に関わらず、常にインタープリターモードで実行されます。 この機能は特に、ダイナミックなコードスニペットのオン・ザ・フライな実行をサポートするように設計されてます。

4D.Method オブジェクトは、4D.Method.new() 関数で作成されます。

4D.Method オブジェクトは、 4D.Function クラスを継承します。 そのため、メソッドオブジェクトを実行するためには、以下のような方法があります:

  • オブジェクトプロパティに4D.Method オブジェクトを入れ、プロパティ名の後に () 演算子を使用する
  • または、 call() あるいは apply() 関数を使用して 4D.Method オブジェクトを呼び出す。

Function オブジェクト内のコードを実行する の段落の例題を参照してください。

info

このクラスは、バイナリーでストリーム可能 です。

例題

基本的なダイナミックメソッド作成

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

.checkSyntax() : Object
4D.Method オブジェクトのソースコードに対してシンタックスをチェックし、その結果のオブジェクトを返します
.name : Text
new() コンストラクターの name 引数内で宣言されていれば、4D.Method オブジェクトの名前が格納されています
.source : Text
対象ファンクションのテキスト型のソースコード

4D.Method.new()

履歴
リリース内容
21 R3追加

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

引数説明
sourceText->テキストとして表現された、オブジェクトとしてカプセル化される4D メソッド
nameText->デバッガに表示するメソッド名。 省略した場合、メソッド名は "anonymous" と表示されます。
戻り値4D.Method<-新規メソッド共有オブジェクト

説明

4D.Method.new() 関数は、 source 引数のコードからビルドされた新しい 4D.Method 型のオブジェクトを作成して返します。

source 引数には、メソッドの4D ソースコードをテキストとして渡します。 Char コマンドまたは エスケープシークエンスを使用することで、全ての行末文字(LF、CR、CRLF)がサポートされています。

オプションの name 引数には、4D デバッガーあるいはランタイムエクスプローラーに表示されるメソッドの名前を渡します。 この引数を省略した場合、メソッド名は、 "anonymous" として表示されます。

tip

以下のような場合には、 name 引数を使用してメソッドに名前をつけることが推奨されます:

返される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 R34D.Methods オブジェクトのサポート
17 R3追加

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

引数説明
thisObjObject->関数内での This コマンドによって返されるオブジェクト
paramsCollection->関数に引数として渡される値のコレクション
戻り値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 R34D.Methods オブジェクトのサポート
17 R3追加

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

引数説明
thisObjObject->関数内での This コマンドによって返されるオブジェクト
paramsany->関数に引数として渡される値
戻り値any<-関数の実行結果の値

説明

.call() 関数は、対象の function オブジェクトを、一つまたはそれ以上の引数を直接渡して実行し、その結果の値を返します。

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 オブジェクトのソースコードに対してシンタックスをチェックし、その結果のオブジェクトを返します。

結果オブジェクトには、以下のプロパティが格納されています:

プロパティ説明
successBooleanシンタックスエラーが何も検出されなかった場合にはTrue、それ以外の場合にはFalse
errorsObject の Collection以下はerror または warningの場合にのみ返されます。 エラーまたは警告の詳細を格納したオブジェクトのコレクション
[].isErrorBooleanエラーならTrue、それ以外の場合は警告
[].messageTextエラーならTrue、それ以外の場合は警告
[].lineNumberIntegerコード内でのエラーが発生した行番号

例題

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 R34D.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"