首页 > 解决方案 > 通过 CALL-ME 清除沉没的电话

问题描述

在尝试提出沉没上下文中的地图示例时,我遇到了以下代码:

my $a = -> { 42 };
my $b = -> { "foo" };

$a;
$a();

($a,$b).map: { $_ };

第一次调用 $a 本身返回:

WARNINGS for /home/jmerelo/Code/raku/my-raku-examples/sunk-map.p6:
Useless use of $a in sink context (line 6)

但是,将 .() 或 () 放在后面,或者在地图中使用它们(我认为它是)接收器上下文不会导致任何警告。可能它不是接收器上下文,但我想知道为什么。

标签: raku

解决方案


$a;
$a();
($a,$b).foo ...

$a自己第一次调用

那不是“电话”。这只是提到它又名“使用”。(注意:这个,呃,使用“use”与语句use中的关键字无关。)use

/home/jmerelo/Code/raku/my-raku-examples/sunk-map.p6 的警告:在接收器上下文中无用地使用 $a(第 6 行)

正确的。只是这样提是没有用的。您不会对( 已分配函数)的值做任何事情。$a你只是把它扔在地板上。

但是,在地图中放置.()()落后,或在(我认为它是)接收器上下文中使用它们不会导致任何警告。

正确的。这些原因.CALL-ME在他们的左侧被调用。无论代码是否使用调用返回的任何值,这些都被理解为可能有用。因此,尽管处于接收器上下文中,但没有警告(尽管接收器上下文本身可能依赖于上下文,并且在编译器级别,它们甚至不被视为处于接收器上下文中;我不知道)。

参见我对 perl 中类似情况的评论


推荐阅读