为什么这个智能匹配返回 false
$value = 5;
print "true" if $value ~~ (1..5);
而这个返回真?
$value = 5;
@match = (1..5);
print "true" if $value ~~ @match;
为什么这个智能匹配返回 false
$value = 5;
print "true" if $value ~~ (1..5);
而这个返回真?
$value = 5;
@match = (1..5);
print "true" if $value ~~ @match;
在第一种情况下,运算符的右侧~~
在标量上下文中求值,因此表达式1..5
是触发器运算符,为 1 时为真,为 5$.
后$.
为假。触发器的真假值为然后用作智能匹配的 RHS(我相信它将分别被视为数字1
或字符串""
,但我还没有证明这一点)。
在第二种情况下,@match
接收 values (1, 2, 3, 4, 5)
,如果是这些数字中的任何一个,$value ~~ @match
则为真$value
(但如果它是 1.5,即使它在 1..5 范围内,也不是)。
如果你真正想要的是一个范围智能匹配,你最好的办法是创建一个范围类,它接受下限和上限,并提供一个~~
运算符重载来返回 LHS 是否在范围内。然后你可以(用适当的糖)写if $value ~~ Range(1,5)
. 事实上,这几乎是使用 smartmatch做很多事情的唯一推荐方法。它所做的大部分事情都太神奇而无法实际使用。