在Ruby中引用数组单元格?

时间:2014-09-11 16:34:58

标签: ruby multidimensional-array memoization

我可以在Ruby中引用一个数组单元吗?在C ++中,我可以做类似的事情:

int& ref = arr[x][y];

以后使用变量ref,而无需键入整个arr[x][y]

我想这样做,因为我需要在一个函数中多次访问同一个单元格(我正在进行记忆),键入不必要的索引可能只会导致错误。

4 个答案:

答案 0 :(得分:1)

ruby​​中的所有值都是引用,所以这当然是可能的,但有一些重要的限制。需要注意的是,ruby并不直接支持多维数组,但您可以将其实现为数组数组或由元组键入的哈希值。

如果已经通过指定给定坐标处的值设置了(x,y)处的值,则可以实现此目的。如果该位置当前不存在任何值,则必须先初始化该值,然后才能对其进行引用:

# if x and y are indices and a is your "multidimensional array"

a[x][y] = 'First Value'  # Initial value at (x, y)

ref = a[x][y]  # take a reference to the value referenced by a[x][y]

ref.gsub! 'First', 'Second'

a[x][y]  # => 'Second Value'

请记住,ruby中的赋值运算符通常表示"使左侧的引用引用右侧的值"。这意味着如果您在引用中使用赋值运算符,那么您实际上是在引用它是指新值:

a[x][y] = 1     # Initialize value with 1
ref = a[x][y]   # Take the reference

ref += 1        # Assignment    
ref             # => 2
a[x][y]         # => 1

通过使用Hash并使用坐标元组键入哈希,然后使用这些元组获取对特定位置的引用,您可能会获得更好的成功:

a = {}
loc = [x, y]

a[loc] = 'First Value'     # Initial value
a[[x,y]]  # => 'First Value'

a[loc] = 'Second Value'  # Assignment
a[[x,y]]  # => 'Second Value'

a[loc] = 1  # Assignment
a[loc] += 1 # Assignment
a[[x,y]]  # => '2'

答案 1 :(得分:0)

Ruby被认为是通过值传递,所以为了回答你的问题(不是像C ++那样通过引用传递),它不可能直接做你所要求的。

安倍的答案中有一篇非常好的帖子,你应该通读:

Is Ruby pass by reference or by value?

答案 2 :(得分:0)

为了让ref在任何给定的时间继续指向arr [x] [y]的实际数据,有一种可能性就是把它写成一种方法:

def ref
  ar[1][1]
end

答案 3 :(得分:0)

在像ruby这样的高级语言中,所有变量都是引用,并且没有像C或C ++那样的“指针”或间接级别,你应该创建对象来保存这些引用以获得类似的行为

这就是我要在ruby上做的事情

假设您需要将一个“指针”保存到ruby数组,然后创建一个Class来访问给定索引中的数组(没有像获取ruby中的值的“指针”)

class ArrayPointer
  def initialize(array, index)
    @array = array
    @index = index
  end

  def read
    @array[index]
  end

  def write(value)
    @array[index] = value
  end
end

然后,你以这种方式使用clase

array = [1, 2, 3]
pointer = ArrayPointer.new(array, 1)

pointer.write(20)
puts array # [1, 20, 3]

你也可以获得局部变量的“指针”,但在ruby世界中它太奇怪而且不常见而且它几乎没有意义

请注意,这种代码很奇怪,在ruby中并不常见,但从教学角度来看,比较Ruby和C这两种优秀语言是很有意思

在ruby的面向对象特性中,最好设计好的抽象(例如,在使用元素结构之前,不要使用数组来表示数据,如果更喜欢用类似ruby方式的方法定义类)或哈希来表示程序使用的数据(C中常见的最后一种方法,不是红宝石方式)