以防万一,
A = "A"
B = "#{A}"
是B = "A"
,对吧?
现在我想更改(A = "C"
),并希望B
也受A
的影响而更改。
有什么办法吗?
答案 0 :(得分:4)
让我们先谈谈命名约定。大写标识符用于Ruby中的常量。默认情况下,为已初始化的常量分配新值会在Ruby中引发警告:
A = 'B'
A = 'C'
#=> warning: already initialized constant A
#=> warning: previous definition of A was here
因此,在以下示例中,我将使用普通的实例变量和读取器方法。正如Pascal Betz指出的那样:如果您希望b
依赖于a
的当前值,那么b
应该是一种方法:
def b
@a
end
@a = 'A'
b
#=> "A"
@a = 'C'
b
#=> "C"
答案 1 :(得分:2)
如果您这样做:
a = "A"
b = "#{a}"
a
和b
是具有相同内容的字符串,但它们不是相同的对象:
b == a
# => true
b.equal? a
# => false
a.object_id
# => 24494240
b.object_id
# => 24679880
Ruby字符串是可变的。因此,如果b
和a
引用相同的字符串,则修改a
也会自动更新b
:
a = "A"
# => "A"
b = a
# => "A"
a.replace 'C'
# => "C"
b
# => "C"
它可以双向使用:
b.gsub!('C', 'D')
# => "D"
a
# => "D"