라쿠 복제 된 개체가 침몰하지 않음
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