【问题标题】:Raku cloned object not sunk乐克隆物体没有沉没
【发布时间】:2020-08-20 05:55:51
【问题描述】:
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(|%_),它就可以工作。这是预期的吗?为什么会这样?

谢谢!

【问题讨论】:

    标签: clone raku sink


    【解决方案1】:

    有许多已提交且在多年后仍处于开放状态的接收器错误(我怀疑还有尚未提交的负载)。

    正如my answer to Last element of a block thrown in sink context 中提到的:

    有人需要清洁厨房水槽,即从 Zoffix 因Flaws in implied sinkage / &unwanted helper 问题中断的地方继续工作。

    Zoffix 的结论是:

    因此,鉴于系统存在如此多的问题,我只是想知道是否没有更好的方法可以用来指示是否需要某些东西。

    快进 2 年,一个更好的系统有望落地。在a recent grant reportjnthn 中写道:

    当前在 Rakudo 中执行此工作的代码难以遵循,而且效率不高。 ...由于 RakuAST 在更高级别上对语言进行建模并将 QAST 的生成推迟到很晚,因此可以更清洁地解决水槽分析问题。 ...我很乐观,我创建的模型将足够灵活,可以处理所有与下沉相关的要求

    【讨论】:

      【解决方案2】:

      我还不确定发生了什么,但删除 return 语句会使克隆对象调用正确的 sink 方法。

      我为它创建了一个问题:https://github.com/rakudo/rakudo/issues/3855

      【讨论】:

      • 这是一个错误,我明白了。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2019-10-24
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-27
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多