在列表中§
请参阅例程 first的上下文中的主要文档 in context
sub first(Mu , *, :, :, :, :)method first(List: Mu ?, :, :, :, :)
返回与 $matcher
智能匹配的列表的第一项,当没有值匹配时返回 Nil
。可选的命名参数 :end
表示搜索应从列表的结尾开始,而不是从开头开始。
示例
say (1, 22/7, 42, 300).first: * > 5; # OUTPUT: «42»say (1, 22/7, 42, 300).first: * > 5, :end; # OUTPUT: «300»say ('hello', 1, 22/7, 42, 'world').first: Complex; # OUTPUT: «Nil»
可选的命名参数 :k
、:kv
、:p
提供与切片上相同的功能
k
返回匹配元素的索引值。无论是否指定了 :end
命名参数,索引始终从列表的开头计数。
kv
同时返回索引和匹配的元素。
p
将索引和匹配的元素作为 Pair
返回。
示例
say (1, 22/7, 42, 300).first: * > 5, :k; # OUTPUT: «2»say (1, 22/7, 42, 300).first: * > 5, :p; # OUTPUT: «2 => 42»say (1, 22/7, 42, 300).first: * > 5, :kv, :end; # OUTPUT: «(3 300)»
在方法形式中,可以省略 $matcher
,在这种情况下,将返回第一个可用项(如果设置了 :end
,则返回最后一个)。另请参阅 head
和 tail
方法。
在供应中§
请参阅方法 first的上下文中的主要文档 in context
method first(Supply: :, |c)
此方法创建一个供应,其中包含第一个元素,或者如果可选的命名参数 :end
为真,则创建最后一个元素,该供应是通过使用 grep
方法对调用者调用并使用任何剩余参数作为参数来创建的。如果没有剩余参数,则此方法等效于在调用者上调用 head
或 tail
方法,而无需参数,具体取决于命名参数 :end
。
my = supply ;my = .first: ;# output the first prime from the endless random number supply $rand,# then the $first-prime supply reaches its end.tap: ;
在任何§
请参阅例程 first的上下文中的主要文档 in context
multi method first(Bool )multi method first(Regex , :, *)multi method first(Callable , :, * is copy)multi method first(Mu , :, *)multi method first(:, *)multi first(Bool , |)multi first(Mu , +values, *)
通常,通过应用其 .list
方法将调用者强制转换为 list
,并在其上使用 List.first
。
但是,这是一个具有不同签名的多重,它们以(略微)不同的行为实现,尽管将其用作子例程等效于将其用作具有第二个参数作为对象的函数。
首先,使用 Bool
作为参数将始终返回 Failure
。使用 $test
的形式将返回第一个智能匹配它的元素,如果使用 :end
,则从末尾开始。
say (3..33).first; # OUTPUT: «3»say (3..33).first(:end); # OUTPUT: «33»say (⅓,⅔…30).first( 0xF ); # OUTPUT: «15»say first 0xF, (⅓,⅔…30); # OUTPUT: «15»say (3..33).first( /\d\d/ ); # OUTPUT: «10»
第三个和第四个示例使用 Mu $test
形式,它智能匹配并返回第一个这样做的元素。最后一个示例使用正则表达式作为数字的测试,其中两个数字,因此第一个满足该条件的数字是数字 10。最后一个形式使用 Callable
多重
say (⅓,⅔…30).first( * %% 11, :end, :kv ); # OUTPUT: «(65 22)»
此外,first 的搜索将从 :end
开始,并返回列表中的键/值集;在这种情况下,键只是它在 Seq
中占据的位置。:kv
参数(它是上面定义中 %a
参数的一部分)修改了 first
的返回值,将其提供为一个展平的键和值列表;对于一个列表对象,键将始终是索引。
从版本 6.d 开始,测试还可以是 Junction
say (⅓,⅔…30).first( 3 | 33, :kv ); # OUTPUT: «(8 3)»