签名是对代码对象参数列表的静态描述。也就是说,它描述了调用代码或函数时需要传递哪些参数以及需要传递多少个参数。
将参数传递给签名会将包含在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
类型时,也会发生同样的问题。