gpt4 book ai didi

ruby - attr_accessor 和 |= 运算符的交互

转载 作者:行者123 更新时间:2023-12-05 01:05:51 27 4
gpt4 key购买 nike

我理解 x |= y 基本上意味着 x = x|y。运算符 | 为类 Set 定义为计算两个集合的并集。确实我们可以看到:

require 'set'
r = Set.new(%w(a b));
s = Set.new(%w(c d));
r |= s; # r => #<Set: {"a", "b", "c", "d"}>

但是请看下面的类定义:

class Demo; 
def initialize(s);
@x = s.dup;
end;
attr_accessor :x;
def m!(t);
x |= t.x; ' <--- HERE TROUBLE!
end;

结束

我正在像这样使用这个类:

u = Demo.new(Set.new(%w(a b)))
v = Demo.new(Set.new(%w(c d)))
u.m!(v)

如果我现在查看 u.x,我发现它仍然包含集合 a,b 而不是 a,b,c,d。我的感觉是,这是因为我使用了属性访问器,特别是 setter 方法。如果我写 @x |= t.x,它会起作用。可能是 x |= t.x 的左侧使用 getter x 而不是 setter x=,从而在临时 Set 对象中创建联合?

顺便说一句,我使用的是相当旧的 Ruby 版本(JRuby 1.7.x,大致对应于 Ruby 1.9.3 的语言版本)。

最佳答案

原因是在

x = 3
在 ruby​​ 开始寻找方法 x= 之前,

x 总是被解释为一个局部变量。这意味着,您的方法转换为:

def m!(t)
x = nil # local variable initialization
x = x | t.x
end;

要解决这个问题,需要使用显式的self来强制方法调用:

def m!(t); 
self.x |= t.x
end

另一个注意事项 - 请不要在 ruby​​ 中使用分号。他们只需要非常罕见的情况,但我们通常会避免它们

关于ruby - attr_accessor 和 |= 运算符的交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70259416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com