小编Ste*_*ieD的帖子

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

收到:

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吗?

raku

12
推荐指数
1
解决办法
152
查看次数

如何使用 EVAL 将参数传递给子例程?

我正在尝试使用 Raku 并试图弄清楚如何使用子命令编写程序。当我跑步时./this_program blah

#! /usr/bin/env raku
use v6;

sub MAIN($cmd, *@subcommands) {
    $cmd.EVAL;
}

sub blah() { say 'running blah'; };
Run Code Online (Sandbox Code Playgroud)

我得到running blah输出。

但这是我所得到的。我尝试过各种方法,但没有看到明显的方法来传递@subscommands给该blah函数。

我什至不确定这是否EVAL是可行的方法,但我找不到任何其他解决方案。

raku

12
推荐指数
2
解决办法
526
查看次数

如何为类创建工厂?出现“未声明名称”错误

我有这个代码:

class kg is Dimension {
    method new() {
        return self.bless(
                :type('mass'),
                :abbr('kg'),
                :multiplier(Multiplier.new(
                        numerator =>   1.0,
                        denominator => Quantity.new(1000.0, 'g')))),
    }
}

class mg is Dimension {
    method new() {
        return self.bless(
                :type('mass'),
                :abbr('mg'),
                :multiplier(Multiplier.new(
                        numerator =>   1000.0,
                        denominator => Quantity.new(1.0, 'g')))),
    }
}

Run Code Online (Sandbox Code Playgroud)

我将添加更多类似的课程。我不想单独阐明所有这些类,而是想学习如何创建一个可以从简单数据结构创建这些类的工厂。

我该怎么做呢?我阅读了元对象协议文档,但我不知道如何根据文档页面顶部和中间的示例为我的类动态指定不同的名称。

我试过:

constant A := Metamodel::ClassHOW.new_type( name => 'A' );
A.^add_method('x', my method x(A:) { say 42 });
A.^add_method('set', my method set(A: Mu \a) { A.^set_name(a) });
A.^compose;

my $bar = A; …
Run Code Online (Sandbox Code Playgroud)

raku

11
推荐指数
3
解决办法
385
查看次数

约束类属性的推荐方法?

我有一个带有字符串属性的类。该属性表示文件的路径。我想在构造对象之前确保该文件存在。将来,我可能还想对文件进行额外的检查,例如它的格式是否正确。

无论如何,如果该文件不存在,我想抛出一个描述性异常。

经过一番尝试和错误后,我想出了这个:

unit class Vim::Configurator;
sub file-check($file) {
    die (X::IO::DoesNotExist.new(:path($file), :trying('new'))) if !$file.IO.f.Bool;
    return True;
}

has Str:D $.file is required where file-check($_);
Run Code Online (Sandbox Code Playgroud)

但众所周知,有不止一种方法可以做到这一点。

另一种选择是将约束逻辑放入neworbuild方法中。这没问题,但这感觉很老套,我想我更喜欢将每个属性的逻辑与第一个示例中的属性一起拼写出来。

第三种选择:

has Str:D $.file is required where *.IO.f.Bool == True;
Run Code Online (Sandbox Code Playgroud)

这很好而且简洁,但是抛出的错误非常难以理解。

第四个选项是使用subset以下内容来约束属性:

subset Vim::Configurator::File where *.IO.f.Bool == True;

unit class Vim::Configurator;
has Vim::Configurator::File $.file is required;
Run Code Online (Sandbox Code Playgroud)

这里抛出的错误消息也不是最大的。另外,我觉得很奇怪。

我确信还有其他方法可以给这只猫剥皮,我想知道其他人在做什么,以及是否有比上述任何方法更好的方法。谢谢。

raku

9
推荐指数
2
解决办法
181
查看次数

新方法中的默认值导致对象构造以意外的方式工作

有人可以帮助我理解以下行为吗?

class Box {
    has $.data;

    multi method new($d) {
        say  'here';
        self.bless(data => $d);
    }
}

# construct object with the custom new()
my $box = Box.new('hi');
say $box.data;

# construct object using default new()
my $box2 = Box.new(data => 'be');
say $box2.data;
Run Code Online (Sandbox Code Playgroud)

这输出:

here
hi
be
Run Code Online (Sandbox Code Playgroud)

好的,完美,正是预期的那样。但是,更改代码,以便新方法$d具有如下所示的默认值:

class Box {
    has $.data;

    multi method new($d = '') {   # we give $d a default value now
        say  'here';
        self.bless(data => $d);
    }
}

my $box = …
Run Code Online (Sandbox Code Playgroud)

raku

9
推荐指数
2
解决办法
153
查看次数

$BASH_VERSION 在 macOS 上报告旧版本的 bash,这是一个应该修复的问题吗?

我安装了自制软件的 bash 包。当我打开一个新外壳时:

bash --versionGNU bash, version 5.0.7(1)-release (x86_64-apple-darwin18.5.0)

which bash/usr/local/bin/bash按预期给出。

但:

echo $BASH_VERSION 产量 3.2.57(1)-release

我想知道这是否是我应该为可能使用此环境变量的脚本解决的问题。

macos bash

8
推荐指数
3
解决办法
1186
查看次数

如何使用“|c”捕获默认参数?

我这里有这个功能:

my @modifiers = <command option>;
sub triple(|c(Str:D $app1!, Str:D $app2!, Str:D $key! where .chars == 1, Str:D $mod where ($mod ~~ any @modifiers) = 'command' )) {
    print_template(|c);
}

sub print_template(*@values) {
   ...work done here...
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,如果我在没有第四个参数的情况下调用它,例如triple 'App1', 'App2', 'p';,默认$mod参数不会传递给print_template参数。

有办法做到这一点吗?

对于完整的上下文,这是这里的玩具程序:https://paste.debian.net/1226675/

raku

8
推荐指数
2
解决办法
150
查看次数

如何在不重新启动的情况下使 Raku Grammar Preview 从“收集结果”中解脱出来?

我正在使用 Comma IDE 中的 Raku Grammar 功能。它太酷了。我可以通过无限的尝试和错误来编码,这是我最擅长的。

然而,它经常卡住(可能每 5 到 10 分钟一次)。这可能是我的错误代码的结果。

不管怎样,有没有一种方法可以在不重新启动 IDE 的情况下重置它?我尝试过改变我的语法。有时这有效,但通常无效。

谢谢。

raku commaide

8
推荐指数
1
解决办法
114
查看次数

Comma IDE 可以自动折叠 POD 吗?

我正在使用 Comma IDE 的付费版本。我希望能够自动折叠 POD。我正在使用 ideavim 插件,但这似乎没有提供解决方案。我还尝试按照 https://www.jetbrains.com/help/idea/surrounding-blocks-of-code-with-language-constructs 上的说明使用“环绕”功能(option-ctrl-t)。 html但这似乎不适用于 Comma。

我能做的最好的事情就是选择 Pod 部分,右键单击,选择“折叠”,然后选择“折叠选择”。虽然这可行,但它不太理想,因为它不是自动的,并且当您使用 ideavim 浏览文件时使用“j”或“k”键将光标向下穿过折叠时,它们很容易弹出打开。

谢谢。

ideavim raku commaide

8
推荐指数
1
解决办法
86
查看次数

用嵌入代码替换 YouTube HTML 链接

我正在用 Markdown 编写网页,并使用md2html工具将它们转换为 HTML。我想处理输出 HTML 文件并找到任何 YouTube 链接,如下所示:

<a href="https://www.youtube.com/watch?v=abcdefgh887">https://www.youtube.com/watch?v=abcdefgh887</a>

并将其替换为嵌入代码:

<iframe width="560" height="315" src="https://www.youtube.com/embed/abcdefgh887?controls=0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

我对语法进行了一些尝试,主要是为了熟悉它们,但得出的结论是,这可能不是完成这项工作的理想工具。另外,我更喜欢使用可以轻松适应其他类似任务的现有模块,而不是推出自己的半生不熟的解决方案。

Perl5 对于此类事情有一些很好的工具,但我想使用纯 Raku 解决方案,这样我可以了解更多 Raku。

对于解决这个问题的好方法有什么建议吗?

raku

7
推荐指数
1
解决办法
152
查看次数

标签 统计

raku ×9

commaide ×2

bash ×1

ideavim ×1

macos ×1