Ruby数组和非增量索引
我在ruby中有一个数组,我正在将索引设置为对象的id,如下所示 我的第一个问题是: 此代码适用于:Ruby数组和非增量索引,ruby,arrays,Ruby,Arrays,我在ruby中有一个数组,我正在将索引设置为对象的id,如下所示 我的第一个问题是: 此代码适用于: @array = Array.new(@objects.size) for i in 0...@objects.size @array[i] = @objects[i].value end 但当我这样做的时候: @array[@objects[i].id] = @objects[i].value 它说: nil::NilClass的未定义方法[] 我试着用100或1000代替I,以确保
@array = Array.new(@objects.size)
for i in 0...@objects.size
@array[i] = @objects[i].value
end
但当我这样做的时候:
@array[@objects[i].id] = @objects[i].value
它说:
nil::NilClass的未定义方法[]
我试着用100或1000代替I
,以确保它不是关于“索引超出范围”,但这些都起作用了,我尝试使用to_I
将id
转换为int,即使它应该已经是int,但仍然不起作用。我不明白
我的第二个问题是:
如果我要让ids工作,那么说Array.new(@objects.size)
会不会变得无用
我不是使用索引0来调整大小,而是使用ID,那么发生了什么?它是将索引0…size
初始化为nil
还是只为最多x个对象创建一个空间
编辑:
所以我被告知最好使用哈希,我同意,但在同样的情况下,我似乎仍然有同样的错误(只是将
Array.new(@objects.size)
更改为Hash.new
)这不是Ruby中数组的工作方式。但是,您可以使用哈希来执行此操作,并使用所需的方法查找它们:
@lookup_hash = Hash.new
for i in 0...@objects.size
@lookup_hash[@objects[i].id] = @objects[i].value
end
现在您可以执行以下操作:
@lookup_hash[@some_object.id]
它将返回您存储的对象的值
其他信息
您也可以这样重写循环,因为您不再需要索引:
@lookup_hash = Hash.new
@objects.each do |obj|
@lookup_hash[obj.id] = obj.value
end
在我看来,更具可读性。这不是Ruby中数组的工作方式。但是,您可以使用哈希来执行此操作,并使用所需的方法查找它们:
@lookup_hash = Hash.new
for i in 0...@objects.size
@lookup_hash[@objects[i].id] = @objects[i].value
end
现在您可以执行以下操作:
@lookup_hash[@some_object.id]
它将返回您存储的对象的值
其他信息
您也可以这样重写循环,因为您不再需要索引:
@lookup_hash = Hash.new
@objects.each do |obj|
@lookup_hash[obj.id] = obj.value
end
在我看来,更具可读性。你可以用一种鲁比的方式来做这件事:
@array=@objects.map{| o | o.value}您可以使用rubysh的方式来执行此操作:
@array=@objects.map{| o | o.value}您正在尝试使用类似散列的数组。试试这个:
Hash[@objects.map{|o| [o.id, o.value] }]
请查看和文档。您正在尝试使用类似散列的数组。试试这个:
Hash[@objects.map{|o| [o.id, o.value] }]
看一看这些文件和文档
@array=@objects.map{| obj | obj.value}
@array=@objects.map{| obj | obj.value}
似乎还是给了我同样的错误,我试着用p@objects[I].id打印2。当我为散列键硬编码2时,它可以工作,但当我使用@objects[i].id时,它表示nil::nilclass的未定义方法[]数组和散列都有一个
[]
方法来查找它们包含的项。nil::NilClass错误可能表示您试图在不属于这些错误的东西上使用它,所以可能是输入错误或其他错误?你能重新发布你正在使用的代码吗?也许是在使用,这样就不会在注释格式中丢失。听起来你在nil
上调用[]
。这不可能是打字错误,我只是把索引换成一个硬编码的数字,效果很好,我甚至试过打印id。我会在一秒钟内粘贴真实代码。在ruby中,我似乎仍然会出现同样的错误,我试过使用p@objects[I]。id它会打印2。当我为散列键硬编码2时,它可以工作,但当我使用@objects[i].id时,它表示nil::nilclass的未定义方法[]数组和散列都有一个[]
方法来查找它们包含的项。nil::NilClass错误可能表示您试图在不属于这些错误的东西上使用它,所以可能是输入错误或其他错误?你能重新发布你正在使用的代码吗?也许是在使用,这样就不会在注释格式中丢失。听起来你在nil
上调用[]
。这不可能是打字错误,我只是把索引换成一个硬编码的数字,效果很好,我甚至试着打印id。我会在一秒钟内粘贴真正的代码。在ruby中,我的数组包含什么?它如何理解我只是想从object@Ave.试试看,这样你就可以看到它是如何工作的。Map是函数式编程的基本操作:xs=[1,2,3]ys=xs.Map{2*x}->ys=[2,4,6]。我的数组将包含什么?它如何理解我只是想从object@Ave.试试看,这样你就可以看到它是如何工作的。Map是函数式编程的基本操作:xs=[1,2,3]ys=xs.Map{2*x}->ys=[2,4,6]。