Ruby中attr_accessor与|=运算符搭配Set使用异常问题咨询
问题原因
你的猜测完全正确,这是Ruby的语法规则导致的,和你使用的JRuby 1.7.x(对应Ruby 1.9.3)版本无关,所有Ruby版本都遵循这个规则:x |= y确实等价于 x = x | y,但在类的实例方法中,只要赋值语句的左值没有显式加self.前缀,Ruby会直接将左值识别为当前方法作用域内的局部变量,而不会调用attr_accessor生成的x= setter方法。
对应你的代码,x |= t.x的执行逻辑实际是:
- 先调用getter方法
x拿到实例变量@x的当前值(也就是只包含a、b的Set对象) - 和
t.x做并集运算,得到包含四个元素的新Set对象 - 将新Set对象赋值给
m!方法内的局部变量x,全程没有修改实例变量@x,所以你最终查看u.x还是原来的值。
解决方案
有两种写法可以实现预期效果:
- 直接操作实例变量:
@x |= t.x,也就是你已经验证过的可行写法,跳过getter/setter直接修改实例变量 - 显式指定调用setter方法:
self.x |= t.x,展开后等价于self.x = self.x | t.x,左值self.x会明确调用setter方法x=,将计算结果赋值给实例变量@x
内容的提问来源于stack exchange,提问作者user1934428
相关产品推荐
相关产品推荐

