Ruby中带点运算符的表达式3.**2+1运行结果疑问
Ruby 点运算符与表达式优先级问题解答
核心计算逻辑
结果差异本质是Ruby 方法调用优先级与运算符优先级的规则差异导致的:
Ruby 中所有运算符本质都是类的实例方法,幂运算符**也不例外:a ** b是a.**(b)的语法糖,二者功能一致,但解析规则有区别。
执行3.**2+1时,Ruby 解析逻辑如下:
- 点号触发的显式方法调用优先级远高于
+这类算术运算符 - 不带括号的方法调用会将后续优先级低于方法调用的连续表达式,全部作为方法的入参处理
- 因此
3.**2+1等价于3.**(2 + 1),计算3的3次方,最终结果为27
三个测试用例的差异说明
- 单独运行
3.**2:等价于3.**(2),计算3的2次方,结果为9,符合预期 - 运行
3**2+1:使用**的运算符语法糖形式,遵循运算符优先级规则(**优先级高于+),因此等价于(3 ** 2) + 1,结果为10 - 运行
3.**2+1:等价于3.**(2 + 1),结果为27,如果要和3**2+1逻辑一致,显式给方法参数加括号即可:3.**(2)+1,运行结果为10
点运算符认知遗漏点
核心是混淆了运算符语法糖的优先级规则和显式点方法调用的优先级规则:
- 不带点的运算符语法糖,遵循 Ruby 预设的运算符优先级排序(幂运算 > 乘除 > 加减等)
- 带点的显式方法调用(包括运算符方法的显式调用)优先级高于所有普通算术运算符,无括号时会尽可能吸收后续表达式作为入参
内容的提问来源于stack exchange,提问作者Abhishek28
相关产品推荐
相关产品推荐

