我可以在Ruby中引用一个数组单元吗?在C ++中,我可以做类似的事情:
int& ref = arr[x][y];
以后使用变量ref
,而无需键入整个arr[x][y]
。
我想这样做,因为我需要在一个函数中多次访问同一个单元格(我正在进行记忆),键入不必要的索引可能只会导致错误。
答案 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 ++那样通过引用传递),它不可能直接做你所要求的。
安倍的答案中有一篇非常好的帖子,你应该通读:
答案 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中常见的最后一种方法,不是红宝石方式)