Ruby中+=与=+的区别是什么?为何运行结果不一致?
问题解析:Ruby中
+=与=+的差异 你遇到的问题核心是混淆了复合赋值运算符和赋值+一元运算符的写法,这是个很容易踩坑的语法细节,我来给你拆解清楚:
1. +=的正确行为逻辑
+=是Ruby里标准的复合赋值运算符,它的作用完全等价于:
@@num_things = @@num_things + 1
也就是先取出@@num_things的当前值,加1之后再重新赋值给它。所以每次调用Thing.new()初始化实例时,类变量会持续累加,这就是你看到输出1、2、3的原因。
对应的完整格式化代码:
class Thing @@num_things = 0 # 类变量初始化 def initialize() @@num_things += 1 # 累加类变量 end def value @@num_things end end t1 = Thing.new() puts t1.value # 输出1 t2 = Thing.new() puts t2.value # 输出2 t3 = Thing.new() puts t3.value # 输出3
2. =+导致意外输出的原因
Ruby里不存在=+这个复合运算符,你写的@@num_things =+ 1其实会被解释成两个独立的操作:
@@num_things = +1
这里的+是一元正号运算符(对数值本身没有实际影响,只是明确标记正数),所以每次初始化时,你都是直接把@@num_things设置为1,完全覆盖了它之前的值。不管创建多少个实例,类变量始终被重置为1,所以三次输出都是1。
对应的错误场景格式化代码:
class Thing @@num_things = 0 # 类变量初始化 def initialize() @@num_things =+ 1 # 直接赋值为1,而非累加 end def value @@num_things end end t1 = Thing.new() puts t1.value # 输出1 t2 = Thing.new() puts t2.value # 输出1 t3 = Thing.new() puts t3.value # 输出1
简单总结:+=是「取当前值+1再赋值」,而=+只是「赋值为正1」,这两者的逻辑完全不同,这就是你忽略的关键语法细节哦~
内容的提问来源于stack exchange,提问作者Cristian Contreras
相关产品推荐
相关产品推荐

