我怎样才能发现Perl 6类型的所有角色?

bri*_*foy 12 oop roles perl6 metamodel raku

随着.does我可以检查一个类型都有,我已经知道了作用.我想获得角色列表.继承有.^mro但我没有看到类似于元模型中的角色.

除此之外,给定一个"类型",如何判断它是被定义为类还是角色?

Bra*_*ert 13

.^roles
Run Code Online (Sandbox Code Playgroud)
say Rat.^roles; # ((Rational[Int,Int]) (Real) (Numeric))
Run Code Online (Sandbox Code Playgroud)

默认情况下,它包括每个角色,包括其他角色带来的角色.只获得第一级使用:!transitive

Rat.^roles(:!transitive); # ((Rational[Int,Int]))
Run Code Online (Sandbox Code Playgroud)

  • 你是在哪里找到那个东西的.我在文档中没有看到任何地方.我想我应该尝试一下. (2认同)
  • @briandfoy我看看Rakudo的每一次提交.例如,我读了提交,其中`:transitive`成为默认值. (2认同)

Jon*_*ton 9

第一个问题已经有了一个很好的答案.关于第二个,每个元对象都有一个archetypes方法,该方法又包含由该元类型表示的类型的一系列属性.这是因为Perl 6对新的元类型开放(可能更容易被认为是"类型类型"); 可能今天最广泛使用的例子是OO::Monitors.原型更侧重于人们可以用这种类型做什么.例如:

> role R { }; say "C: {.composable} I: {.inheritable}" given R.HOW.archetypes; 
C: 1 I: 0
> class C { }; say "C: {.composable} I: {.inheritable}" given C.HOW.archetypes; 
C: 0 I: 1
Run Code Online (Sandbox Code Playgroud)

可以反省可用属性集:

> Int.HOW.archetypes.^methods(:local)
(nominal nominalizable inheritable inheritalizable composable 
composalizable generic parametric coercive definite augmentable)
Run Code Online (Sandbox Code Playgroud)

例如,"名义上的"意味着"这可以作为名义类型","可扩展"意味着"它是否允许增加这种类型".像"可继承"这样的东西意味着"我可以继承这种类型" - 也就是说,即使我不能从这种类型继承,也可以将它变成我可以继承的类型.A role不是可继承的,但它是可继承的,对它的继承操作将产生角色的双关语.这就是在编写类似内容时发生的事情,这class C is SomeRole { }意味着Perl 6不仅对新类型的类型开放,而且那些新类型的类型可以描述他们想要如何工作,如果有的话,继承和组合.

可组合does可能是角色的主要定义属性,因此composable在询问"这是一个角色"时,属性可能是最好的.如另一个答案中所建议的那样,也可以查看元对象的类型,但是在表示角色时涉及多个元对象(短名称角色组,具有参数的该组的currying以及个人角色,加上支持组合过程的内部具体化形式).

> say (role RRR[::T] { }).HOW.^name
Perl6::Metamodel::ParametricRoleHOW
> say RRR.HOW.^name
Perl6::Metamodel::ParametricRoleGroupHOW
> say RRR[Int].HOW.^name
Perl6::Metamodel::CurriedRoleHOW
Run Code Online (Sandbox Code Playgroud)

因此,仅仅检查事物是否可组合就更加健壮.

> say (role RRR[::T] { }).HOW.archetypes.composable
1
> say RRR.HOW.archetypes.composable
1
> say RRR[Int].HOW.archetypes.composable
1
Run Code Online (Sandbox Code Playgroud)

  • @briandfoy来自Brad Gilbert的那个建议`.^ roles`并指出`:transitive`选项. (2认同)

mor*_*itz 6

除此之外,给定一个"类型",如何判断它是被定义为类还是角色?

类是元类的类型Metamodel::ClassHOW:

sub type-classify(Mu \t) {
    given t.HOW {
        return 'class' when Metamodel::ClassHOW;
        return 'role'  when Metamodel::ParametricRoleGroupHOW;
    }
    return 'other';
}
say type-classify(Int);         # class
say type-classify(Rational);    # role
say type-classify(Bool);        # other
Run Code Online (Sandbox Code Playgroud)