Raku 类型层次结构的根。关于名称的起源,请参阅维基百科上的 Mu (negative)。也可以说 Raku 中有很多未定义的值,而 Mu
是最未定义的值。
请注意,大多数类不直接派生自 Mu
,而是派生自 Any
。
方法§
方法迭代器§
method iterator(--> Iterator)
通过应用其 .list
方法将调用者强制转换为 list
,并对其使用 iterator
。
my = Mu.iterator;say .pull-one; # OUTPUT: «(Mu)»say .pull-one; # OUTPUT: «IterationEnd»
方法定义§
multi method defined( --> Bool)
在类型对象上返回 False
,否则返回 True
。
say Int.defined; # OUTPUT: «False»say 42.defined; # OUTPUT: «True»
一些类型(如 Failure
)会覆盖 defined
,即使对于实例也是如此,也会返回 False
sub fails() ;say fails().defined; # OUTPUT: «False»
例程定义§
multi defined(Mu --> Bool)
调用对象上的 .defined
方法并返回其结果。
例程 isa§
multi method isa(Mu --> Bool)multi method isa(Str --> Bool)
如果调用者是类 $type
的实例、子集类型或 $type
的派生类(通过继承),则返回 True
。 does
类似,但包括角色。
my = 17;say .isa("Int"); # OUTPUT: «True»say .isa(Any); # OUTPUT: «True»;my = 0 but Truish;say .^name; # OUTPUT: «Int+{Truish}»say .does(Truish); # OUTPUT: «True»say .isa(Truish); # OUTPUT: «False»
例程 does§
method does(Mu --> Bool)
当且仅当调用者符合类型 $type
时,返回 True
。
my = Date.new('2016-06-03');say .does(Dateish); # OUTPUT: «True» (Date does role Dateish)say .does(Any); # OUTPUT: «True» (Date is a subclass of Any)say .does(DateTime); # OUTPUT: «False» (Date is not a subclass of DateTime)
与 isa
不同,后者仅对超类返回 True
,does
包括超类和角色。
say .isa(Dateish); # OUTPUT: «False»
使用智能匹配运算符 ~~ 是更习惯的替代方法。
my = Date.new('2016-06-03');say ~~ Dateish; # OUTPUT: «True»say ~~ Any; # OUTPUT: «True»say ~~ DateTime; # OUTPUT: «False»
例程 Bool§
multi Bool(Mu --> Bool)multi method Bool( --> Bool)
在类型对象上返回 False
,否则返回 True
。
许多内置类型会将其覆盖为 False
,以表示空集合、空 字符串 或数字零
say Mu.Bool; # OUTPUT: «False»say Mu.new.Bool; # OUTPUT: «True»say [1, 2, 3].Bool; # OUTPUT: «True»say [].Bool; # OUTPUT: «False»say %( hash => 'full' ).Bool; # OUTPUT: «True»say .Bool; # OUTPUT: «False»say "".Bool; # OUTPUT: «False»say 0.Bool; # OUTPUT: «False»say 1.Bool; # OUTPUT: «True»say "0".Bool; # OUTPUT: «True»
方法 Capture§
method Capture(Mu: --> Capture)
返回一个 Capture
,其命名参数对应于调用者的公共属性
.new.Capture.say; # OUTPUT: «\(:bar("something else"), :foo(42))»
方法 Str§
multi method Str(--> Str)
返回调用者的字符串表示形式,旨在供机器读取。方法 Str
会对类型对象发出警告,并生成空字符串。
say Mu.Str; # Use of uninitialized value of type Mu in string context.my = [2,3,1];say .Str # OUTPUT: «2 3 1»
例程 gist§
multi gist(+args --> Str)multi method gist( --> Str)
返回调用者的字符串表示形式,经过优化以供人类快速识别。因此,列表将被截断为 100 个元素。使用 .raku
获取所有元素。
Mu
中的默认 gist
方法会对已定义的调用者重新分派到 raku 方法,并对类型对象调用者返回括号中的类型名称。许多内置类会将实例的情况覆盖为更具体的内容,这可能会截断输出。
gist
是 say 隐式调用的方法,因此 say $something
和 say $something.gist
通常会生成相同的输出。
say Mu.gist; # OUTPUT: «(Mu)»say Mu.new.gist; # OUTPUT: «Mu.new»
方法 perl§
multi method perl(Mu:)
对调用者调用 .raku
。由于语言名称已更改为 Raku,因此此方法已弃用,并且可能在不久的将来消失。请改用 .raku
。
方法 raku§
multi method raku(Mu:)multi method raku(Mu:)
对于类型对象,如果 .raku
尚未从 Mu
中重新定义,则返回其名称,否则对类型对象的名称调用 .raku
。
say Str.raku; # OUTPUT: «Str»
对于普通对象,它将按照惯例返回一个对象表示形式,该表示形式可通过 EVAL
使用来重建该对象的 value。
say (1..3).Set.raku; # OUTPUT: «Set.new(1,2,3)»
方法 item§
method item(Mu \item:) is raw
强制在 item 上下文中对调用者进行求值并返回其 value。
say [1,2,3].item.raku; # OUTPUT: «$[1, 2, 3]»say %( apple => 10 ).item.raku; # OUTPUT: «${:apple(10)}»say "abc".item.raku; # OUTPUT: «"abc"»
方法 self§
method self(--> Mu)
返回对其调用的对象。
方法 clone§
multi method clone(Mu: *)multi method clone(Mu: *)
此方法将克隆类型对象,或在使用任何参数调用它时终止。
say Num.clone( :yes )# OUTPUT: «(exit code 1) Cannot set attribute values when cloning a type object in block <unit>»
如果使用 value 对象调用它,它将创建调用者的浅层克隆,包括私有属性的浅层克隆。可以通过命名参数(其名称与属性名称匹配)为公共属性提供备用 value。
my = Point2D.new(x => 2, y => 3);say ; # OUTPUT: «Point(2, 3)»say .clone(y => -5); # OUTPUT: «Point(2, -5)»
请注意,.clone
不会进一步浅层复制 @.
和 %.
sigiled 属性,并且如果修改,修改仍然可以在原始对象中使用
my = Foo.new;with my = .clone# Hash and Array attribute modifications in clone appear in original as well:say ;# OUTPUT: «Foo.new(foo => 42, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, …»say ;# OUTPUT: «Foo.new(foo => 70, bar => ["Z", "Y"], baz => {:X("W"), :Z("Y")}, …».boo.(); # OUTPUT: «Hi».boo.(); # OUTPUT: «Bye»
要克隆它们,您可以实现自己的 .clone
,该 .clone
克隆适当的属性并将新 value 传递给 Mu.clone
,例如,通过 nextwith
。
my = Bar.new( :42quux );with my = .clone# Hash and Array attribute modifications in clone do not affect original:say ;# OUTPUT: «Bar.new(quux => 42, foo => ["a", "b"], bar => {:a("b"), :c("d")})»say ;# OUTPUT: «Bar.new(quux => 42, foo => ["Z", "Y"], bar => {:X("W"), :Z("Y")})»
需要 |%_
来吸收其余的属性,这些属性原本会通过浅层复制进行复制。
方法 new§
multi method new(*)
用于构造(创建 + 初始化)某个类的对象的新默认方法。此方法仅期望命名参数,然后使用这些参数来使用同名访问器初始化属性。
类可以提供自己的 new
方法来覆盖此默认方法。
如果存在,new
会触发一个对象构造机制,该机制会调用继承层次结构中每个类的名为 BUILD
的子方法。有关更多信息,请参阅 有关对象构造的文档。
方法 bless§
method bless(* --> Mu)
低级对象构造方法,通常从 new
中调用,隐式从默认构造函数中调用,或者在您创建自己的构造函数时显式调用。bless
使用命名参数初始化属性并返回创建的对象,创建与调用者相同类型的新对象。
通常在自定义 new
方法实现中调用
my = Point.new(-1, 1);
在此示例中,我们声明此 new
方法以避免在创建对象时使用对的额外语法。self.bless
返回对象,而对象又由 new
返回。new
被声明为 multi 方法
,以便我们仍然可以使用默认构造函数,如下所示:Point.new( x => 3, y => 8 )
。
有关更多详细信息,请参阅 有关对象构造的文档。
方法 CREATE§
method CREATE(--> Mu)
分配与调用者相同类型的新对象,而不初始化任何属性。
say Mu.CREATE.defined; # OUTPUT: «True»
方法 print§
multi method print(--> Bool)
使用 .Str
方法将值打印到 $*OUT
,而不会在末尾添加换行符。
"abc\n".print; # OUTPUT: «abc»
方法 put§
multi method put(--> Bool)
将值打印到 $*OUT
,在末尾添加换行符,并在必要时使用 .Str
方法将非 Str
对象字符串化。
"abc".put; # OUTPUT: «abc»
方法 say§
multi method say()
say 42; # OUTPUT: «42»
因此,say
实际执行的操作被推迟到实际子类。在 大多数情况下,它对对象调用 .gist
,返回一个紧凑的字符串表示形式。
在非接收器上下文中,say
始终会返回 True
。
say (1,[1,2],"foo",Mu).map: so *.say ;# OUTPUT: «1[1 2]foo(Mu)(True True True True)»
但是,此行为只是约定俗成的,您不应该相信它适用于您的代码。然而,它有助于解释某些行为。
say
首先在 *.say
中打印,但最外层的 say
正在打印 so
操作返回的 True
值。
方法 ACCEPTS§
multi method ACCEPTS(Mu: )
ACCEPTS
是使用 中缀 ~~ 运算符进行智能匹配的方法,并在右侧(匹配器)上调用 given/when。
Mu:U
multi 执行类型检查。如果 $other
符合调用者(始终是类型对象或失败),则返回 True
。
say 42 ~~ Mu; # OUTPUT: «True»say 42 ~~ Int; # OUTPUT: «True»say 42 ~~ Str; # OUTPUT: «False»
请注意,对于已定义的调用者没有多重;这是为了允许自动线程化连接,当没有可用的直接候选者可调度时,它作为后备机制发生。
方法 WHICH§
multi method WHICH(--> ObjAt)
返回类型为ObjAt
的对象,它唯一标识该对象。值类型覆盖此方法,该方法确保两个等效对象从WHICH
返回相同返回值。
say 42.WHICH eq 42.WHICH; # OUTPUT: «True»
方法 WHERE§
method WHERE(Mu:)
返回表示对象内存地址的Int
。请注意,在 Raku 的 Rakudo 实现中,以及其他实现中,对象的内存位置不是对象生命期的固定值。因此,它对应用程序的使用有限,并且仅用作调试工具。
方法 WHY§
multi method WHY(Mu: --> Pod::Block::Declarator)
返回附加的 Pod::Block::Declarator。
例如
sub cast(Spell )say .WHY;# OUTPUT: «Initiate a specified spell normally(do not use for class 7 spells)»
有关将 Pod 附加到变量、类、函数、方法等的详细信息,请参阅Pod 声明符块。
特征 is export§
multi trait_mod:<is>(Mu \type, :!)
将类型标记为已导出,即对外部用户可用。
my is export
模块或类的用户会自动获取所有标记为is export
的导入符号。
有关更多详细信息,请参阅导出和选择性导入模块。
方法 return§
method return()
方法return
将停止子例程或方法的执行,运行所有相关的移相器,并将调用者作为返回值提供给调用者。如果提供了返回类型约束,则会对其进行检查,除非返回值为Nil
。会引发控制异常,可以使用CONTROL捕获该异常。
sub f ;say f(); # OUTPUT: «any(1, 2, 3)»
方法 return-rw§
与方法return
相同,但return-rw
会向调用者返回一个可写容器(有关更多详细信息,请参阅此处:return-rw
)。
方法 emit§
method emit()
react# OUTPUT:# received Str (foo)# received Int (42)# received Rat (0.5)
方法 take§
method take()
返回封闭收集块中的调用者。
sub insert(, +)say insert ':', <a b c>;# OUTPUT: «(a : b : c)»
例程 take§
sub take(\item)
获取给定项并将其传递到封闭的 gather
块。
my = 6;my = 49;gather for ^.say; # six random values
例程 take-rw§
sub take-rw(\item)
将给定项返回到封闭的 gather
块,而不会引入新的容器。
my = 1...3;sub f();for f() ;say ;# OUTPUT: «[2 3 4]»
方法 so§
method so()
在布尔语境中评估项(因此,例如,折叠连接),并返回结果。它是 not
的相反,并且等效于 ?
运算符。
可以类似于英语句子使用此方法:“如果如此,则执行此操作”。例如,
my = <-a -e -b -v>;my = any() eq '-v' | '-V';if .so# OUTPUT: «Verbose option detected in arguments»
在这种情况下,$verbose-selected
变量包含一个 Junction
,其值为 any(any(False, False), any(False, False), any(False, False), any(True, False))
。那实际上是一个真值;因此,否定它将产生 False
。该结果的否定将是 True
。so
在幕后执行所有这些操作。
方法 not§
method not()
在布尔语境中评估项(例如,导致连接的最终评估),并否定结果。它是 so
的相反,其行为等效于 !
运算符。
my = <-a -e -b>;my = any() eq '-v' | '-V';if .not# OUTPUT: «Verbose option not present in arguments»
由于还有 not
的前缀版本,因此此示例的读法更好
my = <-a -e -b>;my = any() eq '-v' | '-V';if not# OUTPUT: «Verbose option not present in arguments»