Ruby中嵌套数组声明的特殊解析:缺逗号为何未报错?
为什么Ruby中漏写逗号的嵌套数组声明不会报错?
你看到的这个现象,本质是Ruby对整数后[]语法的特殊解析——这并不是数组声明的语法错误,而是调用了Integer类的[]实例方法。
测试代码的实际解析逻辑
你写的arr = [1,2[1,8]],Ruby不会把它当成[1, 2, [1,8]](因为漏了逗号),而是解析为:
arr = [1, 2.[](1, 8)]
也就是调用整数2的[]方法,传入参数1和8,再把结果和1组成数组。
Integer#[]方法的双参数行为
当给Integer#[]传入两个整数参数start和length时,它的计算逻辑等价于:
(int >> start) & ((1 << length) - 1)
简单说就是:把整数右移start位,然后保留低length位的数值。
对应测试用例的验证
2[1,8]:(2 >> 1) & ((1<<8)-1) = 1 & 255 = 1→ 数组[1,1]5[6,4]:(5 >>6) & 15 = 0 &15=0→ 数组[1,0]3[1,6]:(3>>1)&63=1&63=1→ 数组[1,1]6[1,6]:(6>>1)&63=3&63=3→ 数组[1,3]7[1,6]:(7>>1)&63=3&63=3→ 数组[1,3]0[1,6]:(0>>1)&63=0&63=0→ 数组[1,0]8[1,6]:(8>>1)&63=4&63=4→ 数组[1,4]
完全和你给出的运行结果匹配。这种设计是Ruby为整数位操作提供的语法糖,所以即使你漏写了逗号,Ruby也能按照合法的方法调用语法解析,不会抛出异常。
内容的提问来源于stack exchange,提问作者Deepak Saini
相关产品推荐
相关产品推荐

