标记。^在Perl 6中是什么意思?

kee*_*yan 8 perl6 raku

我想知道.^Perl 6中sigil的含义。

put "\"10\" : ", "10".^name; 
say "Type : ", (10.Str).^name;
say $object.^parents;
say $object.^methods;
Run Code Online (Sandbox Code Playgroud)

在此代码段中,这.^是什么意思?是name父类的方法还是属性?还是有不同的含义?

Eli*_*sen 10

$foo.^bar
Run Code Online (Sandbox Code Playgroud)

有效地用于以下方面的语法糖:

$foo.HOW.bar($foo)
Run Code Online (Sandbox Code Playgroud)

换句话说,bar$foo对象(.HOW)的元类上调用方法,并将该对象作为第一个参数传递(以便该方法知道它应在其上工作的元类的实例)。

例如:

say "Hello world".^name                     # Str
say "Hello world".HOW.name("Hello world");  # Str
Run Code Online (Sandbox Code Playgroud)

另请参阅:https : //docs.raku.org/language/operators#index-entry-methodop_.%5E

  • 实际上是`$ foo.HOW.bar($ foo)`,否则如果想实现基于原型的OO就没有用了。 (2认同)

rai*_*iph 8

TL; DR详细阐述了Liz的答案以及奖金部分,即HOW stack

$foo.^bar
Run Code Online (Sandbox Code Playgroud)

.^bar方法的调用是“高阶编程”,代码上工作$foo作为一种编程架构。

是有效的语法糖

^“语法糖”,因为它简短而简单,是“高级” 的助记符

$foo.HOW.bar($foo)
Run Code Online (Sandbox Code Playgroud)

因此,而不是$foo.^bar调用bar分配的对象方法/必然会$foo如常用于方法调用,该bar方法,而不是调用在对象的HOW对象(HOW的简称ħ igher ö刻申W¯¯ orkings或ħö bjects W¯¯扫)。

HOW对象的常规措辞是“元对象”

换句话说,请在物件bar中继类别$foo.HOW)上呼叫方法

Afaik .HOW对象通常是一个具体实例,而不是类型对象形式的。因此,bar通常在元对象而不是元上调用该方法。

因此,例如,最后用a say 42.HOW表示,而不是。因此将调用该meta- objectPerl6::Metamodel::ClassHOW.new.new(ClassHOW)42.^bar.bar

并将对象作为第一个参数传递(以便该方法知道它应该在其上工作的元类实例)。

Afaik传递了对象,因此该方法知道它必须处理的对象,并且不太可能成为元类的实例。

例如:

say "String".HOW.name("String"); # Str
Run Code Online (Sandbox Code Playgroud)

"String"Str该类的实例,它是"String".WHAT,而不是其.HOW

.WHAT是对象的类型。为了使您的头脑有些分离,可能.HOW更像是类型的“种类”

如何堆栈

class Person { method name { "Fred {rand}" } }

say Person.HOW.HOW.HOW.HOW.HOW.HOW.^name;  # KnowHOW
say Person.HOW.HOW.HOW.^name;              # KnowHOW
say Person.HOW.HOW.^name;                  # NQPClassHOW
say Person.HOW.^name;                      # Perl6::Metamodel::ClassHOW
say Person.^name;                          # Person
say Person.name;                           # Fred 0.7356364351848212
Run Code Online (Sandbox Code Playgroud)

KnowHOW

Person随后显示3个或更多链接的.HOWs(并以a结尾.^nameKnowHOW

KnowHOWHOW对象中的“最高” ,它决定了通用6model对象的行为。

KnowHOW与编程语言和面向对象无关。它不了解类或接口之类的东西。它只是“知道”如何做一些事情,而最重要的事情之一就是它知道如何获得对其元对象的引用。

在的独特情况下KnowHOW,其元对象就是自身。这就是为什么.HOW第三次之后的额外通话实际上是nops

鉴于,“雄鹿停止了” KnowHOW,它必须具有“金属上”的实现。这是针对特定的后端,如KnowHOW中MoarVM的6model bootstrap.c码码约其创建的文档)。

NQPClassHOW

在下一级别,接近Perl 6的是NQP,它是一种用于编写包括自身和Perl 6在内的编程语言的编程语言。

NQPClassHow是NQP的一部分。这是一个实现“类”构造的(元)对象。

NQP不如Perl 6复杂。(实际上,它基本上是Perl 6的一个子集。)例如,如果代码是标准的完整P6对象,则该代码say foo将始终有效foo。相反,有时如果foo不是NQP对象则不会。因此,我们必须首先编写这些内容。第二个不起作用:

say Person.HOW.HOW.^name; # NQPClassHOW
say Person.HOW.HOW;       # Died with X::Method::NotFound
Run Code Online (Sandbox Code Playgroud)

Perl6::Metamodel::ClassHOW

最后,我们得出了完整的P6元类是Rakudo元模型的一部分。

这是此类的实例,它响应中的name方法调用say Person.^name。该响应是显示传递给它的对象的类的名称。