此代码有效:
(3,6...66).contains( 9|21 ).say # OUTPUT: «any(True, True)»
并返回一个Junction
。这也是tested,但not documented。问题是我无法在任何地方找到它的实现。 Str code也是从Cool调用的,它永远不会返回一个Junction(它也不会使用Junction)。源头上没有其他methods contain
。由于它是自动编程的,它可能是在某处特别定义的。但我不知道在哪里。有帮助吗?
TL; DR Junction自动读取由单个中央机制处理。我在下面解释一下。
(你的问题的主体开始于你陷入一个陷阱,我认为你记录了一两年回来。这似乎与你真正要求的东西无关,但我也覆盖了它。)
包含(连接点)在哪里定义? ...问题是我无法在任何地方找到[Junctional]实现。 ...因为它是自动编程的,所以它可能是在某处特别定义的。
是。有一种通用机制可以自动将自动编程应用于所有P6例程(方法,运算符等),这些例程没有明确控制Junction
参数的签名。
只有极少数内置例程具有这些明确的Junction
处理签名 - print
可能是最值得注意的。用户定义的例程也是如此。
.contains
没有任何特殊处理。因此它由通用机制自动处理。
也许Junctions
的my answer to an earlier SO Filtering elements matching two regexes的魔法部分将有助于作为对下面的低级细节的高级描述。只需用你的9|21
替换那个SO中的foo & bar
,然后用你的.contains
代替grep
,它有希望有意义。
我将专注于方法。其他例程以类似的方式处理。
method AUTOTHREAD
为完整的P6方法做了工作。
这是在this code that sets up handling for both nqp and full P6 code设置的。
上面链接的P6设置代码依次调用setup_junction_fallback。
当在用户程序中发生方法调用时,它涉及调用find_method
(模块缓存命中,如上面注释中所解释的那样;注意在该注释中使用“fallback”一词是关于缓存未命中 - 这在技术上是与此代码中显而易见的其他后备机制无关,我们正在通过这些机制进行探索。
bit of code near the end of this find_method
处理(非缓存未命中)后备。
到达find_method_fallback
,从实际的交叉处理开始。
此代码有效:
(3,6...66).contains( 9|21 ).say # OUTPUT: «any(True, True)»
它的“工作”程度也是如此:
(3,6...66).contains( 2 | '9 1' ).say # OUTPUT: «any(True, True)»
请参阅Lists become strings, so beware .contains()
和/或讨论pmichaud's comment等潜在问题。
像print
,put
,infix ~
和.contains
这样的例程都是字符串例程。这意味着他们强迫他们对Str
的论点。默认情况下,listy值的.Str
强制是由空格分隔的元素:
put 3,6...18; # 3 6 9 12 15 18
put (3,6...18).contains: '9 1'; # True
它也经过测试
大概你的意思是将*.contains
参数传递给classify
的两个测试:
my $m := @l.classify: *.contains: any 'a'..'f';
my $s := classify *.contains( any 'a'..'f'), @l;
像classify
这样的例程是列表例程。虽然一些列表例程对它们的列表参数/调用者执行单个操作,例如push
,但是其中大多数(包括classify
)遍历其列表,对列表中的每个元素执行某些操作。
给定序列调用/参数,classify
将迭代它并将每个元素传递给测试,在本例中为*.contains
。
然后,后者将强制个别元素加入Str
。与您将一个序列一次性强制转换为Str
的示例相比,这是一个根本区别。