APLデータバインディングの構文



APLデータバインディングの構文

APLデータバインディングの式はJSON文字列内に記述され、“${expression}”の形式を取ります。文字列内では、"${2}+${2} = ${2+2}"のように、任意の数の式を記述できます。式は現在のデータバインディングコンテキストで評価されます。データバインディングコンテキストはブール値、数値、文字列、配列、オブジェクト、null値、および定義済みのリソースへの参照をサポートするグローバルディクショナリーです。

サポートされる値の型

文字列リテラル

文字列は一重または二重の引用符を使用して定義します。開始と終了の引用符はセットで使用する必要があります。引用符、キャリッジリターン、改行はエスケープ処理で表現できます。

	${"Double-quoted string"}
	${'Single-quoted string'}
	${"Inner quote: \" or '"}

式は文字列の中に入れ子にすることもできます。

	${"2たす2は${2+2}"}

数値

正の数、負の数、および浮動小数点数がサポートされます。指数表記には対応していません。JavaScriptでは、すべての数値は倍精度型です。

ブール値

truefalseのブール値がサポートされています。

	${true}
	${false}

null

null定数がサポートされています。

	${null}

リソース

定義済みのリソースをデータバインディングコンテキストで表すには予約文字「@」を使用します。次に例を示します:

${@myBlue}
${@isLandscape ? @myWideValue : @myNarrowValue}

データバインディングで使用されるリソースはAPLパッケージで定義します。

Truthyと強制

truthy値とは、真偽を判定するコンテキストで評価したときにtrueと見なされる値です。false0""null値を除くすべての値はtrueと見なされます。

演算子

APLでは、算術、論理、比較、三項の演算子をサポートしています。

算術演算子

加算、減算、乗算、除算、剰余の標準的な算術演算子がサポートされています。

${1+2}  // 3
${1-2}  // -1
${1*2}  // 2
${1/2}  // 0.5
${1%2}  // 1.

加算演算子は、左オペランドか右オペランドが文字列の場合、文字列を連結する演算子としても使用できます。

${27+""}      // '27'
${1+" dog"}   // '1 dog'
${"have "+3}  // 'have 3'

剰余演算子はJavaScriptの場合と同じように機能します。つまり、次のようになります。

${10 % 3}  // 1
${-1 % 2}  // -1
${3 % -6}  // 3
${6.5 % 2} // 0.5

論理演算子

標準的なAND、OR、NOTの論理演算子がサポートされています。

${true || false}   // true
${true && false}   // false
${!true}           // false

&&は、第1オペランドがfalseと見なされる場合は第1オペランドを返し、そうでない場合は第2オペランドを返します。||演算子は、第1オペランドがtrueと見なされる場合は第1オペランドを返し、そうでない場合は第2オペランドを返します。

${7 && 2}    // 2
${null && 3} // null
${7 || 2}    // 7
${0 || -16}  // 0

比較演算子

比較演算子はブール値を返します。

${1 < 2}
${75 <= 100}
${3 > -1}
${4 >= 4}
${myNullValue == null}
${(2>1) == true}
${1 != 2}

比較演算子は配列やオブジェクトには適用しません。

??演算子はnull合体演算子です。オペランドがnullでない場合は左オペランドを返し、そうでない場合は右オペランドを返します。

${person.name ?? person.surname ?? 'Hey, you!'}

三項演算子

三項条件演算子${a ? b : c}は左オペランドを評価します。trueと評価した場合は、中央のオペランドを返します。そうでない場合は、右オペランドを返します。

${person.rank > 8 ? 'General' : 'Private'}

配列とオブジェクトへのアクセス

配列

配列へのアクセスには[]演算子を使用します。この場合、オペランドは整数でなければなりません。配列は、配列の長さを返す.length演算子もサポートしています。配列の範囲外の要素にアクセスすると、nullを返します。

${myArray[4]}     // 配列の5番目の要素(0から始まるインデックス)
${myArray.length} // 配列の長さ
${myArray[-1])}   // 配列の最後の要素

負のインデックスを渡すと、配列を後ろから数えます。

${a[-1] == a[a.length - 1]}  // True

オブジェクト

オブジェクトはドット演算子と[]配列アクセス演算子での文字列値の使用をサポートします。

${myObject.name}    // myObjectの「name」プロパティ
${myObject['name']} // myObjectの「name」プロパティ

プロパティを定義していない場合は、nullが返されます。

nullに対してドットまたは[]演算子を呼び出すとnullを返します。

${myNullObject.address.zipcode}  // nullが返される

関数の呼び出し

データバインディングではビルトイン関数の一部をサポートしています。関数の形式は次のとおりです:

functionName( arg1, arg2, … )

関数に引数を持たせるかどうかは任意です。関数は単一の値を返します。以下に、いくつかの関数表現を示します。

${Math.floor(1.1)}       // 1
${Math.ceil(1.2)}        // 2
${Math.round(1.2)}       // 1
${Math.min(1,2,3,4)}     // 1
${Math.max(1,2,3,4)}     // 4
${String.toUpperCase('Hello')}    // HELLO
${String.toLowerCase('Hello')}    // hello
${String.slice('Hello', 1, -1)}   // ell

ビルトイン関数

APLでは、算術関数と文字列関数の一部をビルトイン関数として提供しています。

プロパティ 説明
Math.abs(x) 絶対値xを返します。 ${Math.abs(-2.3)} == 2.3
Math.acos(x) xのアークコサインです。 ${Math.acos(1)} == 0
Math.asin(x) xのアークサインです。 ${Math.asin(0)} == 0
Math.atan(x) xのアークタンジェントです。 ${Math.atan(1)} == 0.7853981633974483
Math.ceil(x) x以上の最小の整数を返します。 ${Math.ceil(2.3)} == 3
Math.clamp(x,y,z) y<xの場合はx、y>zの場合はz、それ以外の場合はyを返します。 ${Math.clamp(1, 22.3, 10)} == 10
Math.cos(x) xのコサインです。 ${Math.cos(0)} == 1
Math.floor(x) x以下の最大の整数を返します。 ${Math.floor(2.3)} = 2
Math.max(x1,x2,…) 最大の引数を返します。 ${Math.max(2,3)} == 3
Math.min(x1,x2,…) 最小の引数を返します。 ${Math.min(2,3)} == 2
Math.PI PI(円周率)の値です。 3.141592653589793
Math.random() 0と1の間の乱数です。 ${Math.random()} == 0.7113654073137101(実際に返される乱数はこれとは異なります)
Math.round(x) xに最も近い整数を返します。 ${Math.round(2.3)} == 2
Math.sign(x) xのサインです。-1、0、1のいずれかになります。 ${Math.sign(-43.1) == -1}
Math.sin(x) xのサインです。 ${Math.sin(Math.PI/6)} == 0.5
Math.sqrt(x) xの平方根です。 ${Math.sqrt(9)} == 3
Math.tan(x) xのタンジェントです。 ${Math.tan(Math.PI/4)} == 0.5
String.slice(x,y[,z]) インデックスyからインデックスzまでのxのサブセットを返します。zが省略された場合、文字列の残りが返されます。yが負の数の場合、文字列の最後から抽出されます。 ${String.slice('berry', 2, 4)} == "rr" ${String.slice('berry', -2)} == "ry"
String.toLowerCase(x) 小文字に変換されたxが返されます。 ${String.toLowerCase('bEn')} == "ben"
String.toUpperCase(x) 大文字に変換されたxが返されます。 ${String.toUpperCase('bEn')} == "BEN"