我有一个数组["moniker", @moniker]
,其中名字对象可以是大约100个实例变量及其字符串表示中的任何一个。我想更改位于索引1的实例变量引用的内容(而不是数据本身,这可能是不可变的)。只是做array[1] = newData
不起作用,因为它只是改变了数组中的什么。我知道在C语言中这很简单,但我很难在Ruby中找到一种方法。
答案 0 :(得分:1)
@moniker永远不会进入数组,但它的价值确实如此。
在IRB:
@moniker = 4
a = ["moniker", @moniker]
=> ["moniker", 4]
你只是在使用数组中的值,所以只需更改它就可以了:
a[1] = 5
a
=> ["moniker", 5]
您可能需要考虑哈希:
h = {:moniker => @moniker}
=> {:moniker=>4}
h[:moniker] = 5
h
=> {:moniker=>5}
答案 1 :(得分:1)
你的斗争是因为你正在思考一个C程序员,你可以访问底层指针,并且一切都是可变的。在C中,数组将存储指向可变整数的指针,您可以随时更改整数。在Ruby中,每个变量都是对象的引用,和数字是不可变对象。因此,@ moniker是对象的引用,整数 4 。创建数组时,将该引用复制到数组中,所以现在整数 4 有两个引用:一个来自@moniker,另一个来自数组。如您所见,更改数组中的引用不会更改名为@ moniker的引用 - 它仍然引用对象 4 。
这不是一种Ruby方式。我正在展示它,因为它可能有助于说明Ruby如何使用引用。
您可以在数组中装入引用:
@moniker = [4]
a = ["moniker", @moniker]
这要求您在需要访问基础对象时遵循数组:
@moniker.first
a[1].first
但现在你可以更改@moniker中的基础整数,数组将看到更改:
@moniker[0] = 42
p a[1].first # => 42
作为面向对象的语言,您可以将该数字封装在可变对象中。
class Moniker
attr_accessor :value
def initialize(value)
@value = value
end
end
(attr_accessor :value
为实例变量@value
建立读者和编写器方法。
@moniker = Moniker.new(4)
a = ["monikier", @moniker]
@moniker.value = 42
p a[1].value # => 42
你显然会选择一个比“价值”更好的名字。我不能,因为我不知道价值代表什么。
这是JörgWMittag的评论,但它应该成为答案的一部分:
这似乎很明显,但我想明确提到它:两种解决方案是相同的解决方案。第一个使用具有泛型语义的现有类,第二个定义具有特定封装值的精确语义的新类。但在这两种情况下,它都是将不可变值包装在一个可变值中并改变“外部”值。