类型对象总是未定义的,但我已经看到了一些使用的测试.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)