【问题标题】:Impossible to put a map in sink context无法将地图放在接收器上下文中
【发布时间】:2020-02-12 08:25:56
【问题描述】:

我正在尝试查看在接收器上下文中投掷地图的方式。在这段代码中

class Sunk {
    has $.titanic;
    method sink {
        say "Sinking $!titanic";
    }
}

Sunk.new( :titanic($_) ) for 1..3;

(1..3).map: { Sunk.new( :titanic($_) ) };

for 循环有效地接收所有创建的,map 没有。知道为什么吗?

roast:https://github.com/perl6/roast/blob/b9bfe1844db25f65a4aeb351a0107f83689cb5c2/S04-statements/sink.t#L27-L32 中的这个测试应该可以作为一个测试。而且地图实际上是在一个接收器上下文中,但我不明白它是如何“像下沉一样运行”的。它只是运行。

【问题讨论】:

    标签: raku


    【解决方案1】:

    在您的示例中,map 返回一个Seq,其中包含Sunk 对象。整个Seq 被沉没,它有效地调用Seq.iterator.sink-all,它沉没它的所有元素:它只是通过调用pull-oneSeq 拉空,直到IterationEnd 返回.

    【讨论】:

      【解决方案2】:

      我不会解释太多,将大部分内容留到最后。

      我正在尝试查看在接收器上下文中投掷地图的方式。

      添加--> Nil 作为块的返回值:

      (1..3).map: -> $_ --> Nil { Sunk.new( :titanic($_) ) }
      

      for 循环有效地接收所有创建的,map 没有。

      默认情况下,块运行:

      • 所有语句,但在接收器上下文中的最后一个。

      • 接收器上下文中的最后一个语句not。 (最后一个语句是块的返回值,因此认为将其扔到水槽中是不合适的。)

      您的代码没有为您的 map 调用更改此默认值,因此该块的最后一条语句(它唯一的语句)不在接收器上下文中。 (在块的签名中添加--> Nil 会将最后一条语句放回接收器上下文中。)

      此默认方案的例外涉及某种语句关键字。 for 就是其中之一——它将其语句或块中的最后一条语句置于接收器上下文中。 (要撤消该操作,使最后一条语句在接收器上下文中不是,您可以编写类似$ = do for ... 的内容。)

      这个烘焙测试应该可以作为一个测试。而map 实际上是在接收器上下文中,但我看不出它是如何“像下沉一样运行”的。它只是运行。

      我对@9​​87654321@ 和测试感到困惑。所以,抱歉,我帮不上那个忙。


      为了准备这个答案,我进行了数小时的研究。以下是我找到并依赖的一些作品,以及我的简短笔记。

      以下许多链接都指向特定的 IRC 日志行。我对其中大部分内容的意图是,您阅读每一行后面的一些对话框,以最大限度地提高您从中获得的东西(即使它很混乱,因为我认为即使这样也可能会有所帮助,正如我接下来解释的那样)。

      请考虑至少阅读下面的摘要,并单击一些链接,然后在此答案下发布 cmets 以在此处引发进一步讨论,看看我们是否可以更清楚。

      【讨论】:

      • 非常感谢您的回答,但在您的示例中,地图返回的每个元素都被扔到接收器上下文中,而不是地图本身。我认为@elizabeth-mattijsen 的回答确实很到位。
      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 2023-01-14
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多