J语言二元动词=对装箱字符串的作用及等值比较正确用法
J语言装箱值相等比较问题解答
1. 二元动词=作用于装箱值的运算逻辑
J是数组导向语言,任何值都包含数据类型、形状、内容三部分属性。二元=作用于装箱值时,会严格逐层匹配两个装箱值的全部属性,只有所有属性完全一致时才返回1,不会做隐式的形状兼容:
- 长度≥2的字符串字面量(如
'TXT')本身是形状为N(N为字符串长度)的一维字符数组,和convert/pjson库解码生成的同内容字符串的类型、形状、内容完全一致,因此直接用=比较装箱值会返回1,这也是示例中TXT、CNAME、MX三个项比较结果符合预期的原因。 - 长度为1的字符串字面量
'A'是0维字符原子(形状为空),但pjson解码时对所有字符串统一生成一维字符数组,哪怕长度为1,也会返回形状为1的一维数组,'A'。两者内容完全相同,但形状不同,因此装箱后用=比较会返回0。
示例中其余反常现象均符合该规则:
- 手动构造的列表
y中的'A'是0维字符原子,和字面量<'A'>属性完全一致,因此y = <'A'返回预期的0 1 0 0。 - 拆箱后比较
(>1{y) = (>1{x)返回1,是因为非装箱场景下的=会自动做标量广播,兼容0维原子和1维单元素数组的形状差异,仅比较内容。 - 拆箱后重新装箱比较返回0,是因为
>1{x拆出的是形状为1的一维数组,重新装箱后箱内值的形状仍为1,和<>1{y中装箱的0维原子形状不一致,因此比较失败。
2. 得到预期结果的正确实现
不要直接用裸=比较不同来源的装箱值,应先统一拆箱,忽略形状差异仅比较内容,以下两种写法都能得到0 1 0 0的正确结果:
- 用
&.>(Under 开盖副词),对比较运算符两侧的装箱值先执行拆箱操作,再做等值比较,自动兼容形状差异:
x =&.> 'A'
- 手动指定运算秩逐元素拆箱比较,逻辑更直观:
(>'A') = >"0 x
两种写法都会跳过装箱层的严格形状校验,直接比对字符串实际内容,不受值是字符原子还是单元素字符数组的影响。
内容的提问来源于stack exchange,提问作者Recuerdos de la Alhambra
相关产品推荐
相关产品推荐

