ここは旧式の4DドキュメントWebサイトです。最新のアップデートされたドキュメントを読むには新サイトをご利用下さい→ developer.4d.com

ホーム

 
4D v19.8
Formula

Formula 


 

Formula ( formulaExp ) -> 戻り値 
引数   説明
formulaExp  in オブジェクトとして返されるフォーミュラ
戻り値  オブジェクト in フォーミュラを格納しているネイティブなオブジェクト

説明   

Formula は、formulaExp 引数の式に基づいたフォーミュラオブジェクトを作成します。 formulaExp 引数は単一の値のようにシンプルなものから、引数を持つプロジェクトメソッドのように複雑なものまで指定することができます。

オブジェクトとしてのフォーミュラを使用することで、コマンドやメソッドに対して引数(計算された属性)として渡すことや、"コンポーネントとホストデータベース間で共有"として宣言することなく様々なコンポーネントから実行することができるようになります。呼び出されたとき、フォーミュラオブジェクトは、それを作成したデータベースあるいはコンポーネントのコンテキストにおいて評価されます。

返されたフォーミュラは以下の方法で呼び出すことが可能です:

 C_OBJECT($f)
 $f:=Formula(1+2)
 $o:=New object("myFormula";$f)
 
  //フォーミュラを呼び出す3つの方法
 $f.call($o// 3 を返す
 $f.apply($o// 3 を返す
 $o.myFormula() // 3 を返す

オブジェクトは以下の例題5 のように、それが実行されたフォーミュラをもって特定することができます。オブジェクトのプロパティは、This コマンドを使用することでアクセス可能です。

formulaExp がローカル変数を使用する場合、その値は返されるフォーミュラオブジェクトが作成されたときにそこにコピーされ保存されます。実行時、フォーミュラはそのローカル変数のカレントの値ではなく、コピーされた値を使用します。配列をローカル変数として使用することはサポートされていないという点に注意してください。

Formula によって作成されたオブジェクトは、例えばデータベースのフィールドやBlob ドキュメントなどに保存可能です。

フォーミュラには、標準の$1, $2...,$n 機構を使用して引数を渡すことができます。例えば、以下のように書くことができます:

 C_OBJECT($f)
 $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" などを返す(一例)

利便性のために、フォーミュラが単一のプロジェクトメソッドから作成された場合には、引数はフォーミュラオブジェクトの初期化では省略することができます。フォーミュラを呼び出す時に一緒にそれを渡すだけで使用できます。例:

 C_OBJECT($f)
 $f:=Formula(myMethod)
  //ここで Formula(myMethod($1;$2) と書く必要はない
 $text:=$f.call(Null;"Hello";"World") // "Hello World" を返す
 $text:=$f.call() // "How are you?" を返す
 
  // myMethod
 C_TEXT($0;$1;$2)
 If(Count parameters=2)
    $0:=$1+" "+$2
 Else
    $0:="How are you?"
 End if

引数はメソッド内において、$1, $2... で呼び出し時に指定した順で受け取られます。

注: フォーミュラ内で使用される引数 $n と、フォーミュラ内で呼び出されたmethod が受け取る引数 $n とを混同しないように注意してください。

単純なフォーミュラを使用する場合を考えます:

 C_OBJECT($f)
 $f:=Formula(1+2)
 
 C_OBJECT($o)
 $o:=New object("f";$f)
 
 $result:=$o.f() // 3 を返す

ローカル変数を使用するフォーミュラの場合を考えます:

 $value:=10
 $o:=New object("f";Formula($value))
 $value:=20
 
 $result:=$o.f() // 10 を返す

引数を用いたシンプルなフォーミュラの場合を考えます:

 $o:=New object("f";Formula($1+$2))
 $result:=$o.f(10;20) // 30 を返す

引数を用いたプロジェクトメソッドを使用するフォーミュラの場合を考えます:

 $o:=New object("f";Formula(myMethod))
 $result:=$o.f("param1";"param2") // $result:=myMethod("param1";"param2") と同等

This を使用する場合を考えます:

 $o:=New object("fullName";Formula(This.firstName+" "+This.lastName))
 $o.firstName:="John"
 $o.lastName:="Smith"
 $result:=$o.fullName() // "John Smith" を返す

オブジェクト記法を使用してフォーミュラを呼び出す場合を考えます:

 C_OBJECT($calc;$feta;$robot)
 $robot:=New object("name";"Robot";"price";543;"quantity";2)
 $feta:=New object("name";"Feta";"price";12.5;"quantity";5)
 
 $calc:=Formula(This.total:=This.price*This.quantity)
 
  // フォーミュラをオブジェクトプロパティに設定する
 $feta.calc:=$calc
 $robot.calc:=$calc
 
  // フォーミュラを呼び出す
 $feta.calc() // $feta={name:Feta,price:12.5,quantity:5,total:62.5,calc:"[object Formula]"}
 $robot.calc() // $robot={name:Robot,price:543,quantity:2,total:1086,calc:"[object Formula]"}



参照 

4D Blog - Formula: More power behind simplicity
4D Blog - Formula: Think outside the box
4D Blog - Write your own methods for objects
Formula from string
formula.source

 
プロパティ 

プロダクト: 4D
テーマ: フォーミュラ
番号: 1597

This command can be run in preemptive processes

 
ページの目次 
 
履歴 

初出: 4D v17 R3
名称変更: 4D v17 R6 (Formula)

 
ARTICLE USAGE

ランゲージリファレンス ( 4D v19)
ランゲージリファレンス ( 4D v19.1)
ランゲージリファレンス ( 4D v19.4)
ランゲージリファレンス ( 4D v19.5)
ランゲージリファレンス ( 4D v19.6)
ランゲージリファレンス ( 4D v19.7)
ランゲージリファレンス ( 4D v19.8)