class Variable {}

变量具有丰富的编译时信息,但在运行时,对变量的访问通常作用于其中存储的值,而不是变量本身。变量的运行时类是 Scalar

Variable 保存特性可用于内省和操作变量的编译时信息。

特性§

特性为默认值§

设置变量初始化时的默认值,以及在向其分配 Nil 时重置为该值。特性参数在编译时求值。闭包不会执行您期望的操作:它们按原样存储,需要手动调用。

my Int $x is default(42);
say $x;     # OUTPUT: «42␤» 
$x = 5;
say $x;     # OUTPUT: «5␤» 
# explicit reset: 
$x = Nil;
say $x;     # OUTPUT: «42␤»

特性 is default 还可以与数组和哈希等下标元素一起使用

my @array is default'N/A' );
@array[22].say;  # OUTPUT: N/A 
@array = Nil;
@array.say;      # OUTPUT: [N/A] 
@array[4].say;   # OUTPUT: N/A 
 
my %hash is default'no-value-here' );
%hash<non-existent-key>.say# OUTPUT: no-value-here 
%hash<foo> = 'bar';
%hash<>.say;                 # OUTPUT: {foo => bar} 
%hash<wrong-key>.say;        # OUTPUT: no-value-here 

特性为动态§

multi trait_mod:<is>(Variable:D:$dynamic)

将变量标记为动态,即,可以从内部动态作用域访问,而无需位于内部词法作用域中。

sub introspect() {
    say $CALLER::x;
}
my $x is dynamic = 23;
introspect;         # OUTPUT: «23␤» 
{
    # not dynamic 
    my $x;
    introspect()    # dies with an exception of X::Caller::NotDynamic 
}

is dynamic 特性是创建和访问动态变量的一种相当繁琐的方式。一种更简单的方法是使用 * twigil

sub introspect() {
    say $*x;
}
my $*x = 23;
introspect;         # OUTPUT: «23␤» 
{
    # not dynamic 
    my $x;
    introspect()    # dies with an exception of X::Dynamic::NotFound 
}

特性为§

multi trait_mod:<of>(Mu:U $targetMu:U $type)

设置绑定到变量的容器的类型约束。

my $i of Int = 42;
$i = "forty plus two";
CATCH { default { say .^name' '.Str } }
# OUTPUT: «X::TypeCheck::Assignment Type check failed in assignment to $i; expected Int but got Str ("forty plus two")␤»

您可以使用编译时定义的任何值作为类型约束,包括常量

constant \T = Int;
my $i of T = 42;

这等效于前面的定义。

方法§

方法名称§

method name(Variable:D: str)

返回变量的名称,包括符号。

类型图§

Variable 的类型关系
raku-type-graph Variable Variable Any Any Variable->Any Mu Mu Any->Mu

展开上方的图表