role Metamodel::Stashing { }

警告:该角色是 Rakudo 实现的一部分,不是语言规范的一部分。

类型可能具有与之关联的 stash,它是一个命名哈希,包含该类型包的我们作用域的符号。在这种情况下,它们可以像命名空间一样使用;你可以使用它们的 WHO 属性或 :: 调度运算符获取它们的 stash

module Nested {
    module Namespace {
        constant Symbol = $?MODULE;
    }
}
 
say Nested::Namespace::Symbol;         # OUTPUT: «(Namespace)␤» 
say Nested.WHO<Namespace>.WHO<Symbol># OUTPUT: «(Namespace)␤» 

Metamodel::Stashing 是处理为类型创建和设置 stash 对象的元角色。使用此元角色的类型应支持命名,因此在编写执行此操作的自定义 HOW 时,请确保它们还执行 Metamodel::Naming

方法§

方法 add_stash§

method add_stash($type_obj)

为类型创建并设置 stash,返回 $type_obj

此方法通常在创建新类型时作为最后一步调用。例如,这是如何在仅支持命名和 stash 的最小 HOW 中使用它的

class WithStashHOW
    does Metamodel::Naming
    does Metamodel::Stashing
{
    method new_type(WithStashHOW:_: Str:D :$name! --> Mu{
        my WithStashHOW:D $meta := self.new;
        my Mu             $type := Metamodel::Primitives.create_type: $meta'Uninstantiable';
        $meta.set_name: $type$name;
        self.add_stash: $type
    }
}
 
my Mu constant WithStash = WithStashHOW.new_type: :name<WithStash>;
say WithStash.WHO# OUTPUT: «WithStash␤»