、あなたは構文または構造の基本的な要素を省略し、それらは暗黙のデフォルト値で満たされることを期待することができます多くの場所があります。 Data1
とData2
の違いについての質問に対する答えは、同じ機能を持たない暗黙のデフォルトの2つの例と関係しています。
Data2
クラスには、new create() => _x = 0
という単一のコンストラクタがあり、暗黙的なデフォルトの受信者機能はref
です。つまり、暗黙的にnew ref create() => _x = 0
に展開されます。
Data1
クラスにはコンストラクタがありません。したがって、Ponyは暗黙的なデフォルトコンストラクタを作成します。これはnew iso create()
です。フィールド宣言の_x = 0
も暗黙的にコンストラクタの本体に転送されますが、それはあなたの質問の範囲外です。作成されたオブジェクトは、Data1 iso
に割り当てることができるタイプData1 iso^
、であろうため
したがって、この場合には、let d1: Data1 iso = Data1
を割り当てます。代入保証を解除することなくData2 iso
に割り当てることはできません。の割り当ては作成されたオブジェクトのタイプがData2 ref^
であるため機能しません。
Data2
コンストラクタをnew iso create()
に変更することは、サンプルコードを作成するための最良のソリューションです。コンストラクタの暗黙の既定の機能としてiso
を使用しません。コンストラクタへのパラメータに追加の制約を課すためです(すべて送信可能でなければならない)。
完全性のために、発信者側に別の方法があることに注意してください。 recover
ブロックにコンストラクタコールを配置すると、保証がより強い機能に「持ち上げる」ことができます(たとえば、ref
からiso
まで)。これは、recover
ブロックが、その中で使用されているオブジェクト参照(たとえば、リカバリブロックに渡されるすべての参照が送信可能でなければならないなど)に他の制約を強制し、解除する保証を維持するためです。この割り当ては次のようになります。
let d2: Data2 iso = recover Data2 end
非常に詳細な回答はありがとうございます。私はそのようなものを期待していました。デフォルトのコンストラクタの場合は、デフォルトが異なります。 最初の解決策は間違いなく良く見えます。私は自分自身で見つけたが、そうすることは慣習的であるかどうかは分かりませんでした。 – aav