2011-04-23 66 views
0

我在ruby中有一个数组,我将索引设置为像下面这样的对象的id。Ruby数组和非增量索引

我的第一个问题是:

此代码:

@array = Array.new(@objects.size) 
for i in [email protected] 
    @array[i] = @objects[i].value 
end 

但是当我做:

@array[@objects[i].id] = @objects[i].value 

它说:

未定义的方法[]为无:: NilClass

我试图把100或1000,而不是i,以确保它不是关于“索引超出范围”,但那些工作,我尝试转换id使用to_i为int即使它应该已经是一个整数,但它仍然不起作用。我不明白。

我的第二个问题是:

如果我使IDS的工作,并说Array.new(@objects.size)成为usless?

我没有使用索引0来确定大小,但ID,所以发生了什么?它初始化索引0...sizenil还是仅创建一个最多x个对象的空间?

编辑:

所以有人告诉我这是更好地使用哈希这一点,我同意,但我仍然似乎在相同的情况下(只是改变Array.new(@objects.size)Hash.new)相同的错误

回答

1

那不是Ruby如何工作的数组。但是,您可以使用哈希来做到这一点,您要使用的方法,看看他们:

@lookup_hash = Hash.new 
for i in 0...[email protected] 
    @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 

在我看来更具可读性一点点。

+0

仍似乎给我同样的错误,我试图做p @objects [i] .id它打印2.当我硬编码2的散列键,它的作品,但是当我使用@objects [ i] .id它说未定义的方法[]为零:: NilClass – Ave 2011-04-23 20:38:12

+0

Array和Hash都有一个'[]'方法来查找它们包含的项目。 nil :: NilClass错误可能表明您正在尝试将其用于那些不属于这些内容的东西,所以也许是一个错字或什么?你可以重新发布你使用的代码,也许使用http://pastie.org/,所以它不会在注释格式中丢失 – ctcherry 2011-04-23 20:41:28

+0

听起来就像你在'nil'上调用'[]'。 – 2011-04-23 20:42:40

0

你可以使用map做到这一点的rubyish方式:

@array = @ objects.map {| O | o.value}

1

Your're试图使用像散列一样的数组。试试这个:

Hash[@objects.map{|o| [o.id, o.value] }] 

看看的ArrayHash单证。

1
  1. @array = @objects.map { |obj| obj.value }
  2. 可以,但创建一个数组时,你不需要指定大小。无论如何,尝试使用Ruby的功能性(map,select,inject)而不是类C命令循环。
+0

我的数组包含什么?它将如何理解我只想从对象 – Ave 2011-04-23 20:54:58

+1

@ Ave中获得一定的价值。试试看,这样你就可以看到它是如何工作的。 Map是函数式编程的基本操作:xs = [1,2,3] ys = xs.map {2 * x} - > ys = [2,4,6]。 http://code.google.com/p/tokland/wiki/RubyFunctionalProgramming – tokland 2011-04-23 21:14:59