动态修改数组中的Ruby实例变量

时间:2016-08-08 17:44:04

标签: ruby variables reference

我有一个数组["moniker", @moniker],其中名字对象可以是大约100个实例变量及其字符串表示中的任何一个。我想更改位于索引1的实例变量引用的内容(而不是数据本身,这可能是不可变的)。只是做array[1] = newData不起作用,因为它只是改变了数组中的什么。我知道在C语言中这很简单,但我很难在Ruby中找到一种方法。

2 个答案:

答案 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

“Box”数组中的引用

这不是一种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的评论,但它应该成为答案的一部分

这似乎很明显,但我想明确提到它:两种解决方案是相同的解决方案。第一个使用具有泛型语义的现有类,第二个定义具有特定封装值的精确语义的新类。但在这两种情况下,它都是将不可变值包装在一个可变值中并改变“外部”值。