ラククローンオブジェクトが沈まない
class A {
has $.n; # If this method is uncommented then the clone won't be sunk # method clone { # my $clone = callwith(|%_);
# return $clone; # } method sink(-->Nil) { say "sinking...$!n" }
}
sub ccc(A:D $a) { $a.clone(n=>2) }
ccc(A.new(n=>1));
say 'Done';
上記のプリント:
sinking...2
Done
ただし、カスタムclone
メソッドが使用されている場合、返されたクローンccc
は何らかの理由で沈められません。私ならば、それは動作しますsink
、私は変更呼び出しサイトでの場合、または明示的my $clone = callwith(|%_)
にラインをmy $clone := callwith(|%_)
。これは予想されますか?それがこのように機能している理由は何ですか?
ありがとう!
回答
提出された、そしてまだ開いている年後のシンクバグがたくさんあります(そして、おそらく、提出されていないロードがあります)。
シンクコンテキストでスローされたブロックの最後の要素に対する私の回答で触れたように:
誰かが台所の流しを掃除する必要があります。つまり、Zoffixが暗黙の沈下/不要なヘルパーの問題で欠陥を残して中断したところを拾います。
Zoffixの結論は次のとおりです。
システムには非常に多くの問題があるので、何かが必要かどうかを示すために使用できるより良いものがないかどうか疑問に思っています。
2年早送りすると、より良いシステムが上陸することを願っています。で、最近の助成金報告jnthnは書いています:
Rakudoでこの作業を行っている現在のコードは、従うのが難しく、ひどく効率的ではありません。... RakuASTは言語をより高いレベルでモデル化し、QASTの生成をかなり後になるまで延期するため、シンク分析の問題に対するはるかにクリーンなソリューションが可能です。...私が作成したモデルは、沈下に関連するすべての要件を処理するのに十分な柔軟性があると楽観視しています
何が起こっているのかはまだわかりませんが、return
ステートメントを削除すると、複製されたオブジェクトが正しいsink
メソッドを呼び出すようになります。
私はそれのために問題を作成しました: https://github.com/rakudo/rakudo/issues/3855