出现“没有容器的值”错误

Ste*_*ieD 12 raku

收到:

for $config.IO.slurp.lines <-> $l {
  $l .= trim;
  ...
}
Run Code Online (Sandbox Code Playgroud)

得到这个:

t/01-basic.rakutest ..3/5
Parameter '$l' expects a writable container (variable) as an argument,
but got '# karabiner config file' (Str) as a value without a container.
  in sub generate_file at...
Run Code Online (Sandbox Code Playgroud)

$l我已经阅读了有关容器的文档,但除了可能分配给标量变量之外,它没有说明我在这种情况下可以做什么,这似乎很糟糕。有什么方法可以容器化$l吗?

Eli*_*sen 13

问题实际上是.lines不生产容器。因此<->,使用 ,您将绑定到值,而不是容器。有多种方法可以通过按照您的建议进行容器化来解决此问题:

for $config.IO.slurp.lines -> $l is copy {
    $l .= trim;
    ...
}
Run Code Online (Sandbox Code Playgroud)

但只有当您想对 进行更多更改时,这才有意义$l。如果这实际上只是修剪您收到的线路,您可以即时执行此操作:

for $config.IO.slurp.lines>>.trim -> $l {
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要进行更多预处理$l,请使用.map

for $config.IO.slurp.lines.map({
    .trim.subst("foo","bar",:g)
}) -> $l {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 对于像我这样不知道的人来说,“&gt;&gt;”是超级运算符:https://docs.raku.org/language/operators#Hyper_operators (4认同)