更改后的字符串插值更新

String interpolation update after change

我在一个内插字符串中有值引用这样的数组:

attr_accessor :s, :gamespace

def initialize
  @s = [1,2,3]
  @gamespace = "#{@s[0]} | #{@s[1]} | #{@s[2]} "
end

当我更改 @s 的值时,它不会更新 @gamespace 的值。

我采用了这样的附加方法:

def gamespace
  @gamespace = "#{@s[0]} | #{@s[1]} | #{@s[2]}"
end

然后我在对 @s 进行任何更改后调用它。

有没有办法让attr_accessor在不写这个方法的情况下让attr_accessor更新字符串插值?

当您更改 @s 数组时,您将需要重新创建 gamespace 字符串。或者你必须写一个 setter 方法而不是 attr_accessor。但是从您的示例看来,根本不需要 @gamespace 变量:

attr_accessor :s

def initialize(s = [1,2,3])
  @s = s
end

def gamespace
  @s.join(' | ')
end

一个reader方法只引用一个实例变量,它不会重新计算它。如果要使用 reader 方法来获取更新值,唯一能做的就是不要使用默认的 setter 方法,而是编写自己的方法。

def s= a
  @s = a
  @gamespace = "#{a[0]} | #{a[1]} | #{a[2]} "
end

设置 @a 不应直接完成,而应始终通过 s= 完成。这也适用于 initialize

def initialize; s=([1, 2, 3]) end