为什么当我使用右侧的范围运算符而不是数组时,smartmatch会返回不同的值



为什么此智能匹配返回错误

$value = 5;
print "true" if $value ~~ (1..5);

而这个结果是真的?

$value = 5;
@match = (1..5);
print "true" if $value ~~ @match;

在第一种情况下,~~运算符的右侧在标量上下文中求值,因此表达式1..5是触发器运算符,当$.为1时变为true,而当$.为5时变为false。触发器的真值或假值然后被用作智能匹配的RHS(我相信它将分别被视为数字1或字符串"",但我还没有证明这一点)。

在第二种情况下,@match接收值(1, 2, 3, 4, 5),如果$value是这些数字中的任何一个,则$value ~~ @match为真(但如果它是1.5,则不是,即使它在1..5的范围内)

如果你真正想要的是范围智能匹配,那么最好的办法是创建一个范围类,该类具有下限和上限,并提供~~运算符重载,该重载返回LHS是否在范围内。然后你可以(用适当的糖)写if $value ~~ Range(1,5)。事实上,这几乎是唯一推荐的使用smartmatch完成任何的方法。它的大部分功能都太神奇了,不适合实际使用。

最新更新