Perl 6的DEFINITE与定义的方法有什么区别?

bri*_*foy 11 perl6 raku

类型对象总是未定义的,但我已经看到了一些使用的测试.defined和一些使用的测试.DEFINITE.有什么情况可能会有所不同吗?我倾向于认为任何大写的方法都不适合日常工作,而是更喜欢.defined这项任务.

my $class = IntStr;

put '-' x 20;  # False
put $class.DEFINITE;
put $class.defined;

put '-' x 20;   # False
$class = Nil;
put $class.DEFINITE;
put $class.defined;

put '-' x 20;   # True
$class = '';
put $class.DEFINITE;
put $class.defined;
Run Code Online (Sandbox Code Playgroud)

在输出中,我正在寻找两种方法的答案不同的任何情况:

--------------------
False
False
--------------------
False
False
--------------------
True
True
Run Code Online (Sandbox Code Playgroud)

Eli*_*sen 14

.DEFINITE应该算是一个宏(就像.WHAT,.HOW等等).它在Actions中直接处理并转换为nqp::p6definite()op.

.defined是一种生活方式Mu,可以被你的课程覆盖.事实上,这是对覆盖Failure,这样的实例Failure可以在例如作为不定值作用的if陈述(和"处理"的失败).

my $a = Failure.new("foo");
say "bar" if $a;   # no output
say $a;            # outputs "(HANDLED) foo", but no longer throws
Run Code Online (Sandbox Code Playgroud)

所以回答你的问题:

my $a = Failure.new("foo");
say $a.DEFINITE;  # True
say $a.defined;   # False
Run Code Online (Sandbox Code Playgroud)