Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby数组和非增量索引_Ruby_Arrays - Fatal编程技术网

Ruby数组和非增量索引

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,以确保

我在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
,以确保它不是关于“索引超出范围”,但这些都起作用了,我尝试使用
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}
  • 可以,但创建数组时不需要指定大小。无论如何,试着使用Ruby的功能(映射、选择、注入)而不是类似C的命令式循环
  • @array=@objects.map{| obj | obj.value}
  • 可以,但创建数组时不需要指定大小。无论如何,试着使用Ruby的功能(映射、选择、注入)而不是类似C的命令式循环

  • 似乎还是给了我同样的错误,我试着用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]。