如题。ruby 中有没有类似于 C++ 中的自增自减操作呢?有的话是原子操作吗?
+=不需要 rails 吧。刚才试着自定义++报错。 class Numeric def ++ self+self end end
但 1++1 确实能运行。
#1 楼 @xu_xiang_yang 1 ++ 1
对应的完整写法应该是1.+(+ 1)
,其中,第一个加号就是二元的操作符+
,第二个加号是对一个数取正,一元操作符,不是正负符号本身。
1 + 1
对应的完整写法是1.+(1)
。
类似三楼的回复,后一个 + 是对其后的值取正,相反 - 是取负,那么: ++2 => 2 +-2 => -2 +--2 => 2 ++--+-2 => -2 .....
+=
应该会分成两步
+
操作符2.1.4 :001 > a + 1
NameError: undefined local variable or method `a' for main:Object
2.1.4 :002 > a += 1
NoMethodError: undefined method `+' for nil:NilClass
2.1.4 :003 > a
=> nil
@serco 不是这样的,+= 1 如果不是原子操作,它会是下面的两步 `1. 从内存取出变量
会产生 3 条指令。 如果是原子操作仅会有一步
执行自增的命令(貌似以前学过,这是一个加法器提供的机器指令,专门做自增一。只会产生一条指令)
但我想了想,因为 += 还支持非 1,也就是 a += 2 也是可以的,而机器指令中是没有自增二的操作的,所以推断+=很有可能是非原子操作。
所以我给他加了个锁
#13 楼 @xu_xiang_yang 感觉你没看清楚我的内容。。。 如果你用的是 CRuby,那么不需要纠结是否原子操作,只需要考虑何时 GVL 会释放,GVL 保证不了的当然要加锁。
a+=1
其实做的事情很多,不只是你想得那么简单
+=1
里并非自增,Ruby 里的 +
operator 实际上也是个 method call,所以支持 +=2