weak (プリミティブ)
パッケージ: CURL.LANGUAGE.COMPILER

追加メモリが必要な場合にクリアできるフィールドを指定します。

説明

field 宣言で使用することにより、実行環境で追加メモリが必要な場合にフィールドを null に設定し、そのメモリを解放することができます。フィールドの型は、値 null を許可する型であることが必要です。したがって、次のいずれかになります。



ウィーク ポインタに含まれる値は、その値が変数または非ウィーク フィールドに含まれる場合を除き、Curl メモリ マネージャにより常時開放できます。この理由から、値を別のフィールドまたは変数に保存していなければウィーク フィールドには非 null 値が含まれると想定してはいけません。これを調べる便利な方法の 1 つには、if-non-null を使用し、値を保存してテストします。

{if-non-null value = my-obj.my-weak-field then
    {do-something-with value}
}


これは拡張機能で、計算されたデータのメモリ使用量を最適化する目的だけに使用されます。ほとんどの開発者は、ウィーク フィールドを使用する必要はありません。

メモリの管理およびウィーク フィールドについての詳細は、Curl 開発者ガイドの「メモリの管理」の章を参照してください。

次の例は、ウィーク フィールドを使用して別の (非ウィーク) フィールドから計算された値をキャッシュする方法を示しています。キャッシュされたフィールドは、メモリ マネージャがキャッシュ後にメモリを収集する場合、再計算が必要になる可能性があります。


例: 計算された値をキャッシュするためのウィーク フィールドの使用
{define-class CachedDateString
  field public constant date:DateTime = {DateTime}

  field private weak _date-str:#String

  {getter public {date-str}:String
    {return
        {if-non-null str = self._date-str then
            || Return previously computed value.
            str
         else
            || Compute and cache new value before
            || returning it.
            let str:String = {format "%s", self.date}
            set self._date-str = str
            str
        }
    }
  }
}

{let d:CachedDateString = {CachedDateString}}

{value d.date-str}{br}
{value d.date-str}{br}
{garbage-collect} || value may be recomputed after collection
{value d.date-str}