考虑这些子程序都采用一个命名参数.命名参数应该是可选的,我没有看到任何说法有例外.
没有类型限制,没有问题; 命名参数不是必需的.使用可以接受类型对象的类型约束(没有注释:U,和:_),没有问题.
Parameter '$quux' of routine 'quux' must be an object instance of type 'Int',
not a type object of type 'Int'. Did you forget a '.new'?
in sub quux at /Users/brian/Desktop/type.p6 line 16
in block <unit> at /Users/brian/Desktop/type.p6 line 37
Run Code Online (Sandbox Code Playgroud)
对于需要定义值(带注释:D)的类型约束,命名参数不再是可选的.也就是说,对于任何其他定义,我不必提供值.随着:D我必须提供一个值.我宁愿不遗漏,:D因为我想要的价值必须定义.
来自签名文档:
通常,类型约束仅检查传递的值是否是正确的类型.
但是,我没有传递任何价值.我认为这些约束只对作业有影响.因为我没有明确地提供一个值来分配我期望没有任何分配也没有问题.Rakudo 2017.10的情况并非如此.这导致我以各种令人讨厌的方式解决这个问题.这与我的问题有关Perl 6块是一个参数还是没有?我试图区分零和一个参数的情况.
我可以通过分配默认值来解决这个问题,但在某些情况下,没有默认值是有意义的.Bool例如,A 很容易,但确定的Int是什么?无论是什么,都会有一些神奇的价值,会使代码变得复杂和分散注意力.我已经完成了这个,Perl 6有一个Infinite Int,但我侥幸逃脱,因为Inf在这种情况下作为有效值.
sub foo ( :$foo ) { …Run Code Online (Sandbox Code Playgroud) my @s=<1 2 3 2 3 4>;
say reduce {$^a < $^b}, @s;
say [<] @s;
# --------
# True
# False
Run Code Online (Sandbox Code Playgroud)
我的问题有两个方面:首先,为什么归约元<运算符对运算符的处理方式不同?似乎归约元操作估计使用了一个变量,在从true到false的第一个更改中,保留了该更改,原因是:
say [\<] @s;
# ----------
# (True True True False False False)
Run Code Online (Sandbox Code Playgroud)
其次,我也想在reduce函数中使用它,即,在reduce函数的花括号内引入一些代码,以使其产生与reduce元运算符相同的结果。我该怎么做?谢谢。
我想在映射例程中使用数组的索引。例如,这个 Raku 代码:
raku -e 'my @a = "First", "Second", "Third", "First"; say @a.map({ "Index of $_ is: ;" })'
印刷:
(Index of First is: ; Index of Second is: ; Index of Third is: ; Index of First is: ;)
是否可以获取数组的索引,例如:
(Index of First is: 0; Index of Second is: 1; Index of Third is: 2; Index of First is: 3;)
谢谢!
该^parameterize方法允许用一些给定的信息(例如角色)来参数化一个类.
my role A[::T = Mu] { }
my class B {
method ^parameterize(Mu \base, Mu \type) {
my \what := base.^mixin(A[type]);
what.^set_name(base.^name ~ '[' ~ type.^name ~ ']');
what
}
}
dd B[Int]; # B[Int]
dd B[Int].^roles; # (A[Int],)
Run Code Online (Sandbox Code Playgroud)
但是,我还没有找到一种方法来制作非参数化版本的B无参数化版本的角色A.
dd B; # B
dd B.^roles; # (), want to see (A[Mu],)
Run Code Online (Sandbox Code Playgroud)
我试图添加一个^compose方法,但只有在参数化类时才会调用它.
建议非常欢迎!
我想在前端Web服务器后面运行perl6 / raku Cro应用程序作为服务。
cro runsegfaults和重新启动后,仅运行将无法处理重新启动。
以前,在perl5中我使用过FastCGI-但是Cro::HTTP::Server的Cro::HTTP::Server.new().start()习惯用法似乎与FastCGI :: Native的while $fcgi.accept() {}示例不兼容。
由service.p6生成的cro stub确实具有SIGINT处理程序,但是我不确定这是否足以在systemctl服务中指向它,即
[Service]
ExecStart = /path/to/service.p6
Run Code Online (Sandbox Code Playgroud)
人们目前如何托管Cro应用程序?
我已经搜索了 Raku 文档和几本书和教程以及几篇 Stackoverflow 帖子,以了解如何干净地从列表/数组中删除项目,即没有(Any)代替已删除的元素
my @s = <3 18 4 8 92 14 30>;
my $item = 8;
my $index = @s.first($item, :k);
@s[$index]:delete;
Run Code Online (Sandbox Code Playgroud)
这导致[3 18 4 (Any) 92 14 30],因此我无法对其进行任何操作,例如我无法对其进行应用[+]。
有没有办法从列表/数组中删除一个项目而没有(Any)?
我使用 Raku 进行一些计算,因为它有很好的数字类型。但是,我在使用“.raku”时遇到问题
say (1/6+1/6).raku
#<1/3>
Run Code Online (Sandbox Code Playgroud)
我们得到这个。然而,
say (1/10+1/10).raku
#0.2
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?我期待 <1/5>。发生什么了?
你如何使用 Raku 发出 HTTP 请求?我正在寻找与此 Python 代码等效的代码:
import requests
headers = {"User-Agent": "python"}
url = "http://example.com/"
payload = {"hello": "world"}
res = requests.get(url, headers=headers)
res = requests.post(url, headers=headers, json=payload)
Run Code Online (Sandbox Code Playgroud) 我有以下 Raku 代码:
class Thing {
method close {
say "closed";
}
};
for 1..1000 {
my $x will leave { .close } = Thing.new;
}
Run Code Online (Sandbox Code Playgroud)
运行它,我收到错误:
Lexical with name '$x' does not exist in this frame
in block <unit> at c.raku line 7
Run Code Online (Sandbox Code Playgroud)
有趣的是,这只发生在迭代次数足够多的情况下(500 或 100,我没有收到任何错误消息)。
如果我将循环的主体更改为
my $x = Thing.new;
LEAVE $x.close;
Run Code Online (Sandbox Code Playgroud)
然后一切正常,也没有错误。
这里发生了什么?我误解了will leave构造吗?(在我看来,这两个版本应该是等效的。)
编辑:进一步观察——多次运行代码时,错误出现不确定性。这表明问题在某种程度上与垃圾收集有关,但我仍然对这里实际发生的事情感到困惑。
我正在使用 Rakudo v2021.03。
class A { has $.name; };
class B is A { submethod BUILD { $!name = 'foo' } };
Run Code Online (Sandbox Code Playgroud)
这段代码看起来很自然,但会抛出错误。
Attribute $!name not declared in class B
Run Code Online (Sandbox Code Playgroud)
是的,它没有在 class 中声明B,但我们在部分构造的对象中B::BUILD,并且文档说bless creates the new object, and then walks all subclasses in reverse method resolution order。所以在这个阶段,类的$!name属性应该是已知的B,对吧?
有没有办法在对象构造过程中设置父类属性而不使用new方法?我知道这new可以解决问题,但是BUILD有很多语法糖和BUILD/TWEAK感觉比解析 中的低级blessing更 DWIMy 和直接new。