签名是对代码对象参数列表的静态描述。也就是说,它描述了调用代码或函数时需要传递哪些参数以及需要传递多少个参数。
将参数传递给签名会将包含在Capture中的参数绑定到签名。
有关签名文字的信息,请参见此处。
方法§
方法 params§
method params(Signature: --> Positional)
返回构成签名的Parameter对象列表。
方法 arity§
method arity(Signature: --> Int)
返回满足签名所需的最小位置参数数。
方法 count§
method count(Signature: --> Real)
返回可以绑定到签名的最大位置参数数。如果有 slurpy 位置参数,则返回 Inf。
方法 returns§
无论签名的返回约束是什么
:(, --> Int).returns # OUTPUT: «(Int)»
方法 ACCEPTS§
multi method ACCEPTS(Signature: Signature )multi method ACCEPTS(Signature: Capture )multi method ACCEPTS(Signature: Mu \topic)
如果$topic是Signature,则如果$topic接受的任何内容也将被调用者接受,则返回True,否则返回False
:(, ) ~~ :(, , ?); # OUTPUT: «True»:(Int ) ~~ :(Str); # OUTPUT: «False»
$topic是Capture,如果它可以绑定到调用者,则返回True,即,如果具有调用者Signature的函数可以使用$topic调用
\(1, 2, :foo) ~~ :(, , :foo()); # OUTPUT: «True»\(1, :bar) ~~ :(); # OUTPUT: «False»
最后,带有Mu \topic的候选将topic转换为Capture并遵循与Capture $topic相同的语义
<a b c d> ~~ :(Int ); # OUTPUT: «False»42 ~~ :(Int); # OUTPUT: «False» (Int.Capture throws)set(<a b>) ~~ :(:, :); # OUTPUT: «True»
由于where 子句不可内省,因此该方法无法确定两个签名ACCEPTS是否接受相同类型的where约束参数。此类比较将返回False。这包括带有文字的签名,这些签名只是where约束的语法糖
say :(42) ~~ :($ where 42) # OUTPUT: «False»
方法 Capture§
method Capture()
签名对象(6.d、2019.03 及更高版本)的运行时创建§
Signature.new(params => (...), returns => Type, arity => 1, count => 1.Num)
在某些情况下,特别是在使用元对象协议时,以编程方式创建Signature对象是有意义的。为此,您可以使用以下命名参数调用new方法
参数
此签名中 Parameter 对象的列表。
返回
返回值应匹配的任何约束。默认为 Mu,这实际上意味着没有返回值约束检查。
元数
满足签名所需的最小位置参数数。默认为使用 params 参数给定的 Parameter 对象数。
计数
可以绑定到签名的最大位置参数数。如果未指定,则默认为 arity。如果存在 slurpy 位置参数,则指定 Inf。
警告:虽然 count 参数的逻辑类型为整数,但分配给它的值必须明确为 Num 类型。如果使用任何其他类型,则 new 方法将静默失败并返回一个空签名。当分配给 arity 参数的值不是 Int 类型时,也会发生同样的问题。
类型图§
Signature 的类型关系