引数
メソッドや関数にデータを渡す必要がしばしば発生します。 これは引数によって容易にできます。
概要
引数 (または パラメーター) とは、メソッドや関数が処理に必要とするデータのことです。 引数 と パラメーター は厳密には違うものですが、このマニュアルでは同義語として使用されています。 引数は、ビルトインの 4Dコマンドにも渡されます。 以下の例は、“Hello” という文字列を引数としてビルトインの ALERT
コマンドへ渡します:
ALERT("Hello")
メソッドやクラス関数に引数を渡す場合も同様におこないます。 たとえば、getArea()
クラス関数が 2つの引数を受け取る場合、このクラス関数を呼び出すには以下のように書きます:
$area:=$o.getArea(50;100)
また、プロジェクトメソッド DO SOMETHING
が3つの引数を受け取る場合、このメソッドを呼び出すには以下のように書きます:
DO_SOMETHING($WithThis;$AndThat;$ThisWay)
入力引数は、セミコロン (;) で区切ります。
メソッドを実行する専用コマンドを利用するときも、同じ原則で引数を渡します。
EXECUTE METHOD IN SUBFORM("Cal2";"SetCalendarDate";*;!05/05/20!)
// サブフォーム "Cal2" のコンテキストにおいて SetCalendarDate を実行し
// その際に引数として日付リテラル !05/05/20! を渡します
メソッドやクラス関数からデータを 返す こともできます。 以下は、文字列のデータ長を返すビルトインの Length
コマンドを用いたステートメントです。 このステートメントでは、Length
関数が MyLength という変数に値を返します。
MyLength:=Length("How did I get here?")
どのようなサブルーチンでも値を返すことができます。 各メソッドやクラス関数につき、定義できる戻り値は一つだけです。
入力および出力値は呼び出し時に 評価 され、その値はそれぞれ自動的にサブルーチン (呼び出されたメソッドまたはクラス関数) 内のローカル変数に格納されます。 パラメーターは、呼び出されるコード内で 宣言 する必要があります。
引数が連番のローカル変数 ($0、$1 など) に自動的にコピーされ、C_TEXT($1;$2)
のようなコンパイラー指示子を使って宣言される従来のシンタックスは、4D 20 R7 より 非推奨 となりました。
パラメーターの 宣言
呼び出されたメソッドやクラス関数において、引数の値はローカル変数に代入されます。 通常、引数は パラメーター名 とその データ型 をコロン (:) で区切って宣言します。
- クラス関数の場合、引数は関数のプロトタイプとともに宣言されます。つまり、
Function
またはClass Constructor
キーワードを使うときに宣言されます。 - メソッドの場合 (プロジェクトメソッド、フォームオブジェクトメソッド、データベースメソッド、トリガー)、引数はメソッドコード先頭の
#DECLARE
キーワードを使って宣言されます。
例:
Function getArea($width : Integer; $height : Integer) -> $area : Integer
//myProjectMethod
#DECLARE ($i : Integer) -> $myResult : Object
次のルールが適用されます:
- 宣言文はメソッドや関数のコードの先頭に位置していなければなりません。宣言文より前に置けるのはコメントと改行のみであり、それ以外の場合にはエラーが表示されます。
- 引数名は必ず
$
文字で始まり、プロパティ名の命名規則 に準拠している必要があります。 - 複数のパラメーター (およびその型) を宣言する場合は、それらをセミコロン (;) で区切ります。
- 複数行シンタックスがサポートされています ("\" 文字を使用)。
たとえば、getArea()
関数に 2つの引数を渡して呼び出す場合:
$area:=$o.getArea(50;100)
クラス関数において、引数の値はそれぞれ対応するパラメーターに代入されます:
// クラス: Polygon
Function getArea($width : Integer; $height : Integer)-> $area : Integer
$area:=$width*$height
パラメーターの型が宣言されていない場合には、
Variant
型として定義されます。
データベースメソッドを含むすべての 4Dメソッドにおいて #DECLARE
キーワードの使用がサポートされています。 たとえば、On Web Authentication
データベースメソッドにおいて、次のように名前付き引数を宣言できます:
// On Web Authentication データベースメソッド
#DECLARE ($url : Text; $header : Text; \
$BrowserIP : Text; $ServerIP : Text; \
$user : Text; $password : Text) \
-> $RequestAccepted : Boolean
$entitySelection:=ds.User.query("login=:1"; $user)
// ハッシュパスワードを確認...
戻り値
関数の戻り値は、入力パラメーターリストに矢印 (->) を追加し、それに続けて宣言します。 例:
Function add($x : Variant; $y : Integer) -> $result : Integer
矢印と出力変数名を省略して、コロン (:) 記号の後に戻り値のデータ型だけを指定した場合には、戻り値は return文 を使って管理します。 例:
Function add($x : Variant; $y : Integer): Integer
return $x+$y
戻り値を含む引数の宣言をおこなうのは、一度だけです。 特に、同じ型であっても、同じ引数を入力と出力の両方として宣言することはできません。 例:
// 無効な宣言
Function myTransform ($x : Integer) -> $x : Integer
// エラー: $x が2回宣言されています
サポートされているデータ型
名前付き引数の場合、var
キーワードでサポートされている データ型 (クラスオブジェクト含む) を使用できます。 例:
Function saveToFile($entity : cs.ShapesEntity; $file : 4D.File)
テーブルや配列の式は ポインターを介した参照として 渡す必要があります。
初期化
引数は宣言されると、その型に対応するデフォルト値 に初期化されます。別の値が代入されない限り、セッション中はこの値が保持されます。
return {expression}
履歴
リリース | 内容 |
---|---|
19 R4 | 追加 |
return
文は、関数やメソッドの実行を終了させ、呼び出し元に式を返すために使用します。
たとえば、次の関数は引数 $x の 2乗を返します。$x は数値です。
Function square($x : Integer) -> $result : Integer
return $x * $x
内部的に、return x
は myReturnValue:=x
を実行し、呼び出し元に戻ります。 return
が式なしで使われた場合、関数またはメソッドは宣言された戻り値の型 (あれば)の null値を返し、それ以外の場合には undefined です。
return
文は、戻り値 の標準的なシンタックスと併用することができます (戻り値は宣言された型でなくてはなりません)。 ただし、return
はコードの実行を直ちに終了させることに注意が必要です。 例:
Function getValue -> $v : Integer
$v:=10
return 20
// 20 が返されます
Function getValue -> $v : Integer
return 10
$v:=20 // 実行されません
// 10 が返 されます
引数の間接参照 (${N})
4Dメソッドおよび関数は、可変長の引数を受け取ることができます。 For...End for
ループや Count parameters
コマンド、引数の間接参照シンタックス を使って、これらの引数を扱うことができます。 メソッド内で、間接参照は ${N}
のように表示します。ここの N
は数値式です。
可変長引数の使い方
引数の数値を合計した結果を、引数として渡された表示形式で返すようなメソッドを考えてみましょう。 合計される数値の数は、メソッドが呼ばれるたびに変わります。 このメソッドでは 数値と表示形式を引数としてメソッドに渡さなければなりません。
以下は MySum
メソッドです:
#DECLARE($format : Text) -> $result : Text
$sum:=0
For($i;2;Count parameters)
$sum:=$sum+${$i}
End for
$result:=String($sum;$format)
このメソッドの引数は正しい順序で渡す必要があります。最初に表示形式、次に可変個の数値引数です。
Result:=MySum("##0.00";125,2;33,5;24) // "182.70"
Result:=MySum("000";1;2;200) // "203"
0、1、またはそれ以上のパラメーターを宣言してある場合でも、任意の数の引数を渡すことができます。 呼び出されたコード内では、${N}
シンタックスを使って引数を利用でき、可変長引数の型はデフォルトで バリアント です (可変長引数の記法 を使ってこれらを宣言できます)。 Count parameters
コマンドを使用して、パラメーターが存在することをあらかじめ確認しておく必要があります。 例:
// foo メソッド
#DECLARE($p1: Text;$p2 : Text; $p3 : Date)
For($i;1;Count parameters)
ALERT("param "+String($i)+" = "+String(${$i}))
End for
このメソッドは次のように呼び出せます:
foo("hello";"world";!01/01/2021!;42;?12:00:00?) // 追加 の引数が受け渡されます
引数の間接参照は以下の条件を守ることにより、正しく動作します: 引数の一部のみを間接参照する場合、直接参照する引数の後に間接参照引数を配置するようにします。
可変長引数の宣言
可変長引数を宣言することは必須ではありません。 宣言なしの可変長引数は自動的に バリアント型となります。
ただし、コード実行中に型が一致しないエラーを回避するために、関数のプロトタイプ、クラスコンストラクター、およびメソッドで "..." を使用して可変長のパラメーターを宣言できます (可変長引数)。 "..." に続いて型を指定することで、引数の型を指定します。
#DECLARE ( ... : Text ) // 可変長の Text型引数
Function myfunction ( ... : Text)
複数のパラメーターを宣言する場合は、可変長の表記は最後に使用する必要があります。例:
#DECLARE ( param: Real ; ... : Text )
Function myfunction (var1: Integer ; ... : Text)