概要

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 しかサポートせず、クリーンに機能しませんでした。現在は、itemindex の両方でも、どちらか一方でも使用できます。

  • itemindex が存在する場合、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 サービスにアクセスすることはできません。

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

法律上の注意   |   プライバシーポリシー