收到 "value without a container" 错误

Getting "value without a container" error

知道了:

for $config.IO.slurp.lines <-> $l {
  $l .= trim;
  ...
}

得到这个:

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...

我已经阅读了有关容器的文档,但除了可能将 $l 分配给标量变量外,它并没有说明我在这种情况下可以做什么,这看起来很老套。有没有办法将 $l 容器化?

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

for $config.IO.slurp.lines -> $l is copy {
    $l .= trim;
    ...
}

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

for $config.IO.slurp.lines>>.trim -> $l {
    ...
}

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

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

也许下面就是您想要的?通常,您可以通过 slurp 读取文件,您可以轻松地处理它的大小,或者如果您希望懒惰地一次一行地接收输入,则可以通过 lines 读取文件:

my $config = 'alphabet_one_letter_per_line.txt';

my $txt1 = $config.IO.slurp; 
$txt1.elems.say; #1
$txt1.print; #returns alphabet same as input

my $txt2 = $config.IO.lines;
$txt2.elems.say; #26
$txt2.join("\n").put; #returns alphabet same as input

上面,当 slurping 时你只得到 1 个元素,但是当读 lines 时你得到 26 个元素。从上面的代码可以看出,不需要 "...(assign) $l 到标量变量..." 因为不需要创建 (临时变量)$l.

您可以将文本存储在 @txt 个数组中,并获得与上述相同数量的元素。你可以像你一直在做的那样在你存储的文本上调用例程(下面的例子继续 $txt2 上面的例子):

$txt2.=map(*.uc);
say $txt2;

示例输出:

(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)

[注意,这个问题似乎引发了关于使用 $txt2.=map(*.uc);$txt2.=uc; 的问题。我的经验法则很简单:如果我正在处理的数据结构有多个元素,我 map 使用 * 'whatever-star' 来解决对每个元素的例程调用] .

https://docs.raku.org/