我在插值字符串中有值,这些字符串引用如下数组:
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
更改后更改字符串插值而不编写此方法?
答案 0 :(得分:1)
当您更改@s
数组时,您需要重新创建gamespace
字符串。或者你必须编写一个setter方法而不是attr_accessor
。但是根据您的示例,看起来根本不需要@gamespace
变量:
attr_accessor :s
def initialize(s = [1,2,3])
@s = s
end
def gamespace
@s.join(' | ')
end
答案 1 :(得分:0)
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