代码之家  ›  专栏  ›  技术社区  ›  StevieD

正在获取“没有容器错误的值”

  •  0
  • StevieD  · 技术社区  · 4 年前

    得到这个:

    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 ?

    0 回复  |  直到 4 年前
        1
  •  13
  •   Elizabeth Mattijsen    4 年前

    问题是 .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 {
        ...
    }
    
        2
  •  0
  •   jubilatious1    4 年前

    也许下面是你想要的?通常,您通过 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
    

    上面,你只得到 1 元素当 发出啧啧的声音 ing,但是 26 读取时的元素 线 。从上面的代码中可以看出,没有必要 “…(分配) $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/