概要
ColdFusion 2016 に追加された言語の機能強化には、いくつかの小さな機能強化のほかに、セーフナビゲーション演算子("?.")とコレクションのサポートがあります。
セーフナビゲーション(?.)
セーフナビゲーション演算子を使用して、Struct のメンバーまたはオブジェクトの値にアクセスできます。
"." の代わりにセーフ演算子を使用すると、変数が定義されていない場合に例外がスローされません。
使用例 - 1
<cfoutput>employee?.getDesignation</cfoutput> or <cfoutput>employee?.getDesignation()</cfoutput>
このコードは、変数 employee が定義されていない場合でも例外をスローしません。employee が定義されている場合は、ドット演算子のように機能します。
セーフナビゲーションが未定義の値として評価され、その値が変数に割り当てられる場合、その変数を使用すると、例外が発生する可能性があります。例えば、<cfset x = employee?.getDesignation> というコードがあるとします。この例では、変数 employee が定義されていない場合、x は未定義として割り当てられます。
シンプルなコーディング
以前の ColdFusion バージョンでは、セーフコードを以下のように記述しました。
writeOutput(foo.bar());
else
writeOutput("not defined");
現在、ColdFusion 2016 では、次のように記述します。
writeOutput(foo?.bar());
連鎖
writeOutput(employee?.name?.firstname?.trim());
以下のいずれかが未定義/null の場合、このコードは値を出力しません。
employee OR
employee.name OR
employee.name.firstname.
writeOuptut(employee?.name.firstname.trim());
このコードは、employee が定義されていても、employee.name が未定義の場合は、例外をスローします。
使用例 - 2
現在のコード
<cffunction name="employee">
<cfreturn >
</cffunction>
<cfoutput>#employee()#</cfoutput> //空の文字列を出力する(デフォルトの動作)
<cfoutput>#employee().trim()#</cfoutput> //エラーをスローする - 値を使用する前に初期化する必要がある
セーフナビゲーション演算子コード
<cffunction name="employee">
<cfreturn >
</cffunction>
<cfoutput>#employee()?.trim()#</cfoutput> //何も出力しない
コレクションのサポート(順序付き)
StructNew("Ordered") は、挿入順序を保持する構造体を作成します。
構造体を作成するその他の方法では、後方互換性を維持して、通常の構造体を作成します。
現在は、構造体をループ処理している間に、ランダムな順序でキーが取得されます。ただし、StructNew("Ordered") を使用して構造体をループ処理すると、キーは挿入順序に従って取得されます。
その他のプロパティと関数は、通常の構造体として機能します。
例
<cfset str = StructNew("Ordered")>
この構造体を反復処理すると、値は挿入された順序で取得されます。
<!--- 構造体を作成し、その内容を設定します。 --->
<cfset val=StructInsert(departments, "John", "Sales")>
<cfset val=StructInsert(departments, "Tom", "Finance")>
<cfset val=StructInsert(departments, "Mike", "Education")>
<!--- テーブルを作成して内容を表示します。 --->
<cfoutput>
<table cellpadding="2" cellspacing="2">
<tr>
<td><b>Employee</b></td>
<td><b>Department</b></td>
</tr>
<!--- cfloop を使用して departments 構造体をループ処理します。 item 属性は構造体キーの名前を指定します。 --->
<tr>
<td>#person#</td>
<td>#Departments[person]#</td>
</tr>
</cfloop>
</table>
</cfoutput>
出力は次のようになります。
John Sales
Tom Finance
Mike Education
コレクションのサポート(ソート済み)
順序付きの構造体と同様、structNew("Sorted") などの structNew でソートされた順序タイプを渡す、ソート済みの構造体を作成できます。
structNew("Sorted") は、2 番目の引数(ソート順)を受け付けます。ソート順として使用できる値は、"Asc"、"Desc" または UDF です。
"Asc" または "Desc" は、大/小文字を区別せずにアルファベット順でソートします。
structNew のソート順(2 番目のパラメーター)のデフォルト値は "Asc" で、大/小文字を区別せずにアルファベットの昇順でソートします。
注意:
ソートは常にキーに適用されます。
デフォルトでは数字をソートする方法はありません。UDF を渡すと、数字のソート(または任意のカスタムソートなど)を実行できます。
例 - 1
<cfset str = structNew("sorted")>
デフォルトでは、これは、キーで大文字と小文字を区別せずにアルファベットの昇順でのソートを維持します。
例 - 2
<cfset str = structNew("sorted", "asc")>
昇順の場合は、2 番目のパラメーターに "asc" を渡します。
例 - 3
<cfset str = structNew("sorted", "desc")>
順序を元に戻すには、2 番目のパラメーターに "desc" を渡します。
例 - 4
カスタムソートでは、structSort の場合と同様に、2 番目のパラメーターに UDF を渡すことができます。structSort では、ソートは値に基づいて実行されますが、structNew では、キーに基づいて実行されます。
<cfscript> public numeric function numericDesc(x, y) { if(x < y) return (-1); else if(x == y) return 0; else if(x > y) return 1; } strSortedNum = structNew("sorted", numericDesc); strSortedNum.3 = "three"; strSortedNum.5 = "five"; strSortedNum.1 = "one"; strSortedNum.6 = "six"; strSortedNum.2 = "two"; strSortedNum.4 = "four"; </cfscript> <cfloop collection="#strSortedNum#" item="index"> <cfoutput>#index#: #strSortedNum[index]#</cfoutput><br> </cfloop>
出力:
1: one
2: two
3: three
4: four
5: five
6: six
スコープ検索
一般に、参照されている変数は、一致が検出されるまでに、様々なスコープで検索されます。関数、ローカルスコープ、変数スコープなどの一般的なスコープで変数が検出されない場合は、暗黙的なスコープで検索が続行され、時間が長くかかることがあります。暗黙的なスコープでの検索は、searchImplicitScopes という新しいアプリケーション設定を使用して無効にできます。これはブール値を受け付けます。
これを false に設定すると、スコープが指定されていない変数は、暗黙的なスコープで検索されません。
配列
参照渡し
配列はデフォルトで値渡しされます。配列の値渡しは、配列の参照渡しより低速です。現在は、passArrayByReference という新しいアプリケーション設定を使用して、配列の参照渡しを選択できます。これはブール値を受け付けます。
これを true に設定すると、配列が UDF 引数として渡される場合に参照渡しされます。
空白抑制
ColdFusion 2016 は、空白を新しい方法で抑制します。Administrator では現在、空白抑制を実行時に行うサーバーレベルの設定を使用して、コンパイル時に空白抑制を行うことができます。
その他の機能強化
ColdFusion 2016 は、以下のような機能強化を含みます。
ArrayFindNoCase
配列(1 番目の引数)は、文字列、ブール値または数値の配列である必要があります。検索するオブジェクト(2 番目の引数)は、文字列、ブール値または数値のいずれかである必要があります。そうでない場合は、例外をスローします。
replaceListNoCase
これは、大文字と小文字を区別しない replaceList です。
cfloop タグ
ファイルとリストの配列 cfloop に、新しい属性 "item" が導入されています。以前の cfloop は、index しかサポートせず、クリーンに機能しませんでした。現在は、item と index の両方でも、どちらか一方でも使用できます。
- item と index が存在する場合、item が要素を保持し、index がインデックスを保持します。
- item のみが存在する場合は、item が要素を保持します。
- index のみが存在する場合は、(後方互換性をサポートするために)index が要素を保持します。
cfcollection タグ
ColdFusion 2016 では、この属性は無視されます。すべてのコレクションは、ColdFusion Administrator の Solr_Home フィールドで指定された場所にある collections ディレクトリに作成されます。
その他の修正
4018168 |
Web サービスが配列を返すとき、クライアント側は、その配列を Object[] として受け取ります。そのため、ArrayAppend は、Object[] 全体を配列の要素として追加していました。Object[] から配列を作成して返すように Web サービスクライアントの動作が変更され、これにより、既存の Web サービスクライアントとの後方互換性に関して問題が発生します。 ArrayAppend 関数で、追加する 2 番目の引数が Object[] の場合は、Object[] を配列にマージできます。 |
3791418 |
自動登録を使用して RESTful Web サービスを登録すると、"useHost" 属性のデフォルト値が "true" に変更されます。 現在、REST サービスは、アプリケーションを初期化するホスト名で登録できます。そのため、それ以外のホストを介して REST サービスにアクセスすることはできません。 |