我想知道.^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
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- object。Perl6::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)
KnowHOWPerson随后显示3个或更多链接的.HOWs(并以a结尾.^name)KnowHOW。
KnowHOW是HOW对象中的“最高” ,它决定了通用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。该响应是显示传递给它的对象的类的名称。
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |