myk*_*hal 7 introspection raku
是否可以访问 Raku 地图代码块和/或任何代码中的“被调用者”(“this”)?
例如,如果想计算算术平均值
my $data = <1 10 0 7 2> ;
say $data.sum
/ $data ; # or @$data, same as $data.elems in this numeric context
# OUTPUT: «4?»
Run Code Online (Sandbox Code Playgroud)
分数相加
say $data.map(* / $data).sum
# OUTPUT: «4?»
Run Code Online (Sandbox Code Playgroud)
喜欢
<1 10 0 7 2>.map({ $_ / $this }).sum # but there's no $this
Run Code Online (Sandbox Code Playgroud)
或者
<1 10 0 7 2>.map( * / $this ).sum
Run Code Online (Sandbox Code Playgroud)
如果没有,是否有一种惯用的方法可以仅通过对<…>数据文字的一系列方法调用或不同的方式来实现,而无需将数据存储在变量中?
据我所知,没有。您需要能够知道迭代器将产生多少个值。
在引擎盖下, afoo.map: &callable基本上是 a:
my $iterator = foo.iterator;
callable($iterator.pull-one) until iterator exhausted;
Run Code Online (Sandbox Code Playgroud)
请注意,此时所有关于迭代器源的知识都丢失了:只有一个迭代器产生值。
某些类型的迭代器(所谓的PredictiveIterators可以告诉您它仍然可以产生多少个值,而无需实际产生它们。但大多数迭代器都无法做到这一点。
我想从技术上讲,可以map检查它是否得到了 aPredictiveIterator并设置了一个动态变量,其中包含它将产生的值的数量,然后您可以在&callable.
尽管如此,我认为这并不值得对所有 maps 和for循环进行额外检查,因此我认为不会接受针对此类功能的 PR。
你可以这样做,通过 andthen
<1 10 0 7 2>
andthen .sum / .elems
andthen .say
Run Code Online (Sandbox Code Playgroud)
或者
<1 10 0 7 2>
andthen .map: * / .elems
andthen .sum
andthen .say
Run Code Online (Sandbox Code Playgroud)