在 Regex 中§
请参阅主要文档 在上下文中 了解方法 ACCEPTS
multi method ACCEPTS(Regex: Mu --> Match)multi method ACCEPTS(Regex: @)multi method ACCEPTS(Regex: %)
将正则表达式与传入的参数进行匹配。如果参数是 Positional
,则返回任何列表项的第一个成功匹配项。如果参数是 Associative
,则返回任何键的第一个成功匹配项。否则,它将参数解释为 Str
并与其进行匹配。
对于 Positional 和 Associative 匹配,如果失败,则返回 Nil
。
在 Map 中§
请参阅主要文档 在上下文中 了解方法 ACCEPTS
multi method ACCEPTS(Map: Positional )multi method ACCEPTS(Map: Cool )multi method ACCEPTS(Map: Regex )multi method ACCEPTS(Map: Any )
如果右侧是 Map
,则在智能匹配中使用。
如果主题类似列表 (Positional
),则如果列表中的任何元素作为 Map 中的键存在,则返回 True。
如果主题的类型是 Cool
(字符串、整数等),则如果主题作为键存在,则返回 True。
如果主题是正则表达式,则如果任何键与正则表达式匹配,则返回 True。
作为后备,主题被强制转换为列表,并应用 Positional
行为。
在列表中§
请参阅主要文档 在上下文中 了解方法 ACCEPTS
multi method ACCEPTS(List: )
如果 $topic
是 Iterable
,则根据两个 Iterable
的内容是否匹配返回 True
或 False
。调用者中的 Whatever
元素与 $topic
Iterable
相应位置的任何元素匹配。 HyperWhatever
匹配任意数量的任何元素,包括没有元素
say (1, 2, 3) ~~ (1, *, 3); # OUTPUT: «True»say (1, 2, 3) ~~ (9, *, 5); # OUTPUT: «False»say (1, 2, 3) ~~ ( **, 3); # OUTPUT: «True»say (1, 2, 3) ~~ ( **, 5); # OUTPUT: «False»say (1, 3) ~~ (1, **, 3); # OUTPUT: «True»say (1, 2, 4, 5, 3) ~~ (1, **, 3); # OUTPUT: «True»say (1, 2, 4, 5, 6) ~~ (1, **, 5); # OUTPUT: «False»say (1, 2, 4, 5, 6) ~~ ( ** ); # OUTPUT: «True»say () ~~ ( ** ); # OUTPUT: «True»
此外,如果调用者或 $topic
是惰性 Iterable
,则返回 False
,除非 $topic
与调用者是同一对象,在这种情况下返回 True
。
如果 $topic
不是 Iterable
,则如果调用者没有元素或其第一个元素是 Match
对象(此行为支持 m:g//
智能匹配),则返回调用者,否则返回 False
。
在同形异义词中§
请参阅主要文档 在上下文中 了解方法 ACCEPTS
multi method ACCEPTS(Allomorph: Any \a)
如果 a
参数是 Numeric
(包括另一个 同形异义词),则检查调用者的 Numeric
值是否 ACCEPTS a
。如果 a
参数是 Str
,则检查调用者的 Str
值是否 ACCEPTS a
。如果 a
参数是其他任何内容,则检查调用者的 Numeric
和 Str
值是否 ACCEPTS
a
。
say "5.0" ~~ <5>; # OUTPUT: «False»say 5.0 ~~ <5>; # OUTPUT: «True»say <5.0> ~~ <5>; # OUTPUT: «True»
在 Any 中§
有关方法 ACCEPTS,请参阅上下文的原始文档
multi method ACCEPTS(Any: Mu )
用法
EXPR.ACCEPTS(EXPR);
如果 $other === self
(即,它检查对象标识),则返回 True
。
许多内置类型会覆盖此项以进行更具体的比较。
在角色 Setty 中§
有关方法 ACCEPTS,请参阅上下文的原始文档
method ACCEPTS()
如果 $other
和 self
包含所有相同的元素且没有其他元素,则返回 True
。
在角色 Baggy 中§
有关方法 ACCEPTS,请参阅上下文的原始文档
method ACCEPTS( --> Bool)
如果右侧是 Baggy
,则在智能匹配中使用。
如果右侧是类型对象,即 Baggy
,则如果 $other
does Baggy
,则该方法返回 True
,否则返回 False
。
如果右侧是 Baggy
对象,则仅当 $other
具有与调用者相同的元素(权重相同)时,才返回 True
。
my = bag <eggs bacon>;say ~~ Baggy; # OUTPUT: «True»say .does(Baggy); # OUTPUT: «True»my = (eggs => 1, bacon => 1).Mix;say ~~ ; # OUTPUT: «True»my = (eggs => 1, bacon => 2).Bag;say ~~ ; # OUTPUT: «False»
在 Range 中§
有关方法 ACCEPTS,请参阅上下文的原始文档
multi method ACCEPTS(Range: Mu \topic)multi method ACCEPTS(Range: Range \topic)multi method ACCEPTS(Range: Cool \got)multi method ACCEPTS(Range: Complex \got)
指示 Range
是否包含(与)另一个 Range
重叠。例如
my = Range.new( 3, 5 );my = Range.new( 1, 10 );say .ACCEPTS( ); # OUTPUT: «False»say .ACCEPTS( ); # OUTPUT: «True»say ~~ ; # OUTPUT: «False» (same as $p.ACCEPTS( $r )say ~~ ; # OUTPUT: «True» (same as $r.ACCEPTS( $p )
无限 Range
始终包含任何其他 Range
,因此
say 1..10 ~~ -∞..∞; # OUTPUT: «True»say 1..10 ~~ -∞^..^∞; # OUTPUT: «True»
类似地,具有开放边界的 Range
通常包括其他范围
say 1..2 ~~ *..10; # OUTPUT: «True»say 2..5 ~~ 1..*; # OUTPUT: «True»
还可以使用非数字范围,例如基于字符串的范围
say 'a'..'j' ~~ 'b'..'c'; # OUTPUT: «False»say 'b'..'c' ~~ 'a'..'j'; # OUTPUT: «True»say 'raku' ~~ -∞^..^∞; # OUTPUT: «True»say 'raku' ~~ -∞..∞; # OUTPUT: «True»say 'raku' ~~ 1..*; # OUTPUT: «True»
使用整数 Range
与 Cool
(字符串)进行智能匹配时,ACCEPTS
方法利用 before 和 after 运算符来检查 Cool
值是否与范围重叠
say 1..10 ~~ '5'; # OUTPUT: «False»say '5' before 1; # OUTPUT: «False»say '5' after 10; # OUTPUT: «True»say '5' ~~ *..10; # OUTPUT: «False»
在上面的示例中,由于 '5'
字符串在 10
整数值之后,因此 Range
不与指定的值重叠。
与 Mu
实例(即,通用实例)匹配时,使用 cmp 运算符。
在角色 Numeric 中§
有关方法 ACCEPTS,请参阅上下文的原始文档
multi method ACCEPTS(Numeric: )
如果 $other
可以强制转换为 Numeric
并且在数值上等于调用者(或两者都计算为 NaN
),则返回 True
。
在 Whatever 中§
有关方法 ACCEPTS,请参阅上下文的原始文档
multi method ACCEPTS(Whatever: Mu )multi method ACCEPTS(Whatever: Mu )
如果调用者是 实例,则始终返回 True
。如果调用者是类型对象,则执行类型检查。
say 42 ~~ (*); # OUTPUT: «True»say 42 ~~ Whatever; # OUTPUT: «False»
在 Mu 中§
有关方法 ACCEPTS,请参阅上下文的原始文档
multi method ACCEPTS(Mu: )
ACCEPTS
是使用 中缀 ~~ 运算符进行智能匹配的方法,并在右侧(匹配器)上调用 given/when。
Mu:U
多值执行类型检查。如果 $other
符合调用者(始终是类型对象或失败),则返回 True
。
say 42 ~~ Mu; # OUTPUT: «True»say 42 ~~ Int; # OUTPUT: «True»say 42 ~~ Str; # OUTPUT: «False»
请注意,没有针对已定义调用者的多值;这是为了允许 连接 的自动线程化,当没有可用于分派的直接候选者时,这将作为后备机制发生。
在签名中§
有关 方法 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»
在 IO::Path 中§
有关 方法 ACCEPTS 的详细信息,请参见 上下文中的主要文档
multi method ACCEPTS(IO::Path: Cool --> Bool)
如果需要,将参数强制转换为 IO::Path
。如果两个路径上的 .absolute
方法返回相同的字符串,则返回 True
。注意:如果两个路径以不同的方式构造并且从未完全解析,则表面上指向同一资源的两个路径可能不会智能匹配为 True
say "foo/../bar".IO ~~ "bar".IO # False
原因是上面两个路径在完全解析后可能指向不同的资源(例如,如果 foo
是符号链接)。在智能匹配之前解析路径以检查它们是否指向同一资源
say "foo/../bar".IO.resolve(:completely) ~~ "bar".IO.resolve(:completely) # True
在枚举 Bool 中§
有关 方法 ACCEPTS 的详细信息,请参见 上下文中的主要文档
method ACCEPTS(Bool: --> Bool)
用于智能匹配比较。当右侧为 True
时,始终返回 True
,当匹配的右侧为 False
时,始终返回 False
。特别是,ACCEPTS
始终返回调用它的实例,即智能匹配的右侧。例如
my = Bool.new( True );# when True on the right side returns# always TrueTrue ~~ ; # TrueFalse ~~ ; # True= Bool.new( False );# when False on the right side# returns always FalseFalse ~~ ; # FalseTrue ~~ ; # False
在 Str 中§
有关 方法 ACCEPTS 的详细信息,请参见 上下文中的主要文档
multi method ACCEPTS(Str: )
在 Pair 中§
有关 方法 ACCEPTS 的详细信息,请参见 上下文中的主要文档
multi method ACCEPTS(Pair $: )multi method ACCEPTS(Pair $: Pair )multi method ACCEPTS(Pair $: Mu )
如果 %topic
是 Associative
,则使用调用者的键在其中查找值,并检查调用者的值 .ACCEPTS
该值
say %(:42a) ~~ :42a; # OUTPUT: «True»say %(:42a) ~~ :10a; # OUTPUT: «False»
如果 $topic
是另一个 Pair
,检查调用者的键和值 .ACCEPTS
分别接受 $topic
的键和值
say :42a ~~ :42a; # OUTPUT: «True»say :42z ~~ :42a; # OUTPUT: «False»say :10a ~~ :42a; # OUTPUT: «False»
如果 $topic
是任何其他值,调用者 Pair
的键被视为方法名。此方法在 $topic
上被调用,其 Bool
结果与调用者 Pair
的 Bool
值进行比较。例如,质数可以使用 smartmatch 进行测试
say 3 ~~ :is-prime; # OUTPUT: «True»say 3 ~~ is-prime => 'truthy'; # OUTPUT: «True»say 4 ~~ :is-prime; # OUTPUT: «False»
此表单还可以用于检查同一对象(例如 IO::Path
)上多个方法的 Bool
值,方法是使用 Junction
s
say "foo" .IO ~~ :f & :rw; # OUTPUT: «False»say "/tmp".IO ~~ :!f; # OUTPUT: «True»say "." .IO ~~ :f | :d; # OUTPUT: «True»
在代码中§
查看主要文档 在上下文中 了解 方法 ACCEPTS
multi method ACCEPTS(Code: Mu )
通常调用代码对象并将 $topic
作为参数传递。但是,当在不接受参数的代码对象上调用时,代码对象将被调用而不带参数,并且 $topic
被丢弃。返回调用的结果。