作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
模块一个 有一个成员变量名 c
, 带有 WHERE 子句:
unit class A;
my \MAXVALUE = 1000_000;
has $.c where 0 < * < MAXVALUE;
method gist() {
"$!c";
}
套装
拉库利布 环境变量:
set RAKULIB="d:\scripts\Raku\A\lib" # Windows
export RAKULIB="/opt/scripts/Raku/A/lib" # Linux
像这样使用模块A:
use A;
my $a = A.new(c => 1);
say $a;
但得到类型检查错误:
Type check failed in binding to parameter '<anon>'; expected Any but got Mu (Mu)
in whatevercode at D:\scripts\Raku\Raku\A\lib\.precomp\C6EB86CB837D3BCAAA3D85B66CE337C820700C08\6D\6DCD4CE23D88E2EE9568BA546C007C63D9131C1B line 1
in block <unit> at basic.rakutest line 3
这是一个错误吗?
raku -v
This is Rakudo version 2020.05.1 built on MoarVM version 2020.05
implementing Raku 6.d.
最佳答案
打高尔夫球至: BEGIN say 1 < Mu
显示基本相同的错误消息。
在您的代码中,MAXVALUE
用值 Mu
初始化在编译时。您必须更改您的代码,以便评估 ... < MAXVALUE
紧随其后 MAXVALUE
已被初始化为除 Mu
以外的值.
在这个答案的其余部分:
my
开始。 :
my constant MAXVALUE = 1000_000;
问题解决了。
where
中的变量/符号/表达式如果子句在
WhateverCode
expression 中,将在编译时评估它们。 .
{ ... }
语法),情况可能并非如此。如果您的代码中的行:
has $.c where 0 < * < MAXVALUE;
改为:
has $.c where { 0 < $_ < MAXVALUE }
那么你的代码就可以工作了。
has
添加显式初始值线...
has $.c where { 0 < $_ < MAXVALUE } = 10;
^^^^ Explicit initialization
...然后错误将返回,因为现在
where
由于链式 react ,在编译期间调用子句:
where
查看。where
编译时的子句;MAXVALUE
待评估——它包含 Mu
在编译时,导致错误返回。has
有编译期和运行期两个阶段。变量:
has
的默认值。变量确定。三种常见的场景是:has
陈述has $foo;
Any
has $foo where some-condition;
<anon>
has $foo = 42;
42
has
的值该特定实例的变量被设置,可能将它们初始化为类默认值以外的值。BEGIN say 'code compile-time, start, outside class';
say 'code run-time, start, outside class';
sub init (*%_) { say "initializing {|%_}" }
class foo {
has $.bar;
has $.baz where init(baz => $_);
has $.buz where init(buz => $_) = 42;
say 'run-time, at end of class';
BEGIN say 'compile-time, at end of class';
}
BEGIN say 'compile-time, outside class again';
say 'run-time, outside class again';
say foo.new(buz => 99);
显示:
code compile-time, start, outside class
compile-time, at end of class
initializing buz 42
compile-time, outside class again
code run-time, start, outside class
run-time, at end of class
run-time, outside class again
initializing buz 99
foo.new(bar => Any, baz => <anon>, buz => 99)
注意三个
has
的完成初始化完全构建的实例中的变量:
bar => Any
.baz => <anon>
.say my Int $var;
显示 (Int)
,因为有类型约束但没有显式初始化值的变量的默认值是类型约束对应的类型对象,而say my $var where 1;
显示 (<anon>)
,反射(reflect)了 where
的匿名性质约束(与 subset
相比)。所以has $.baz where init(baz => $_);
导致默认值 (<anon>)
.buz => 99
.has
变量,其中一个 initializing ...
显示了一行——而且,重要的是,有两行,而不是一行:compile-time, at end of class
之后,即当编译器到达类声明的结束 curl 时。这是 Raku 做类(class)作文的时候,还有 buz
获取默认值 42
.foo.new(buz => 99);
期间,它在运行时构建类的实例,来自 initializing 99
.I'm not myself able to provide a coherent explanation ... whether it's considered a bug. I do currently consider the error message LTA.
Type check failed in binding to parameter '<anon>'; expected Any but got Mu (Mu)
in whatevercode at ... A\lib ... line 1
in block <unit> at ... line 3
Type check failed ...
where
检查失败。它被称为“类型检查”。鉴于 Raku 对“类型”这个词的正常使用,我认为这很好。 ... in binding to parameter '<anon>';
我不确定“参数”指的是什么,也不确定 '<anon>'
. imhh(在我的谦虚假设中)“参数”指的是 infix:«<»
的参数功能和 '<anon>'
到存储在 $.c
中的值在匿名之前的编译时where
在运行时尝试约束。<where clause>
而不是 <anon>
将是可行的和适当的?expected Any but got Mu (Mu)
默认情况下,has
变量期望 Mu
,不是 Any
.所以这条消息似乎不是指$.c
.所以,就像我对“参数”的假设一样,我认为这是关于 infix:«<»
的一个参数。功能。but got Mu (Mu)
您可以非常确定初始化某些值失败是问题的一部分,这里确实是这种情况。in whatevercode
爆炸发生在 WhateverCode
,所以这部分对于知道什么是 WhateverCode
的人很有用是。WhateverCode
是的,这部分很神秘。我想 in WhateverCode
而不是 in whatevercode
将是一个值得的改进。也许in WhateverCode (eg '* < 42')
,其中 '* < 42' 被固定为字面意思,而不是作为实际源代码,因为我认为这是不可行的,会更好吗?at ... A\lib ...
我省略的路径部分( ...
)既有用(完整)又糟糕(非人类友好的长字符串)。Type check failed ... got Mu (Mu)
in whatevercode at A\lib line 1
(Full path to A\lib: D:\scripts\Raku\Raku\A\lib\.precomp\
C6EB86CB837D3BCAAA3D85B66CE337C820700C08\
6D\6DCD4CE23D88E2EE9568BA546C007C63D9131C1B)
... line 1
“第 1 行”大概是指 whatevercode
中的第 1 行或 A\lib
中的第 1 行.无论哪种方式,它都不是特别有用。A\lib
,然后使其准确指向 whatevercode
.in block <unit> at line 3
这很有用。关于where-clause - 无法在 CLASS 中使用带有 WHERE 子句的无符号变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66437935/
我是一名优秀的程序员,十分优秀!