收到 "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
上面,当 slurp
ing 时你只得到 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' 来解决对每个元素的例程调用] .
知道了:
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
上面,当 slurp
ing 时你只得到 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' 来解决对每个元素的例程调用] .