2012-03-09 44 views
0

选择阵列嵌套数组我有一个数组:从arugment在Ruby中

foo = [[51, 05,1.0],[51,979,0.18]] 

我想要做的就是利用这个阵列,并选择有最后的值小于1,因此,所有的嵌套数组从上面的输出会

result = [[51,979,0.18]] 

我曾尝试:

foo.select { |p| p.last < 1 } 

但我得到的错误:

NoMethodError (undefined method `last' 

该数组比两个要大得多,但我列出了上面的例子。我以为.select会是对的,但我无法让它工作。

+0

此代码的工作,所以在富大概一个元素可能不是数组的。 – tokland 2012-03-09 11:43:33

+0

你的错误信息应该告诉接收器属于哪一类。它是否说你拥有的是一个数组?你使用的是旧版本的Ruby吗? – sawa 2012-03-09 11:45:16

回答

3

您的代码适用于我。

irb(main):007:0> foo = [[51, 05,1.0],[51,979,0.18]] 
=> [[51, 5, 1.0], [51, 979, 0.18]] 
irb(main):008:0> foo.select { |p| p.last < 1 } 
=> [[51, 979, 0.18]] 
+0

对我而言,实际上...... – Mgrandjean 2012-03-09 11:37:32

1

你太亲近了! 代替p.last使用P [-1]

所以

foo.select{ |p| p[-1] < 1} 
+3

#last与[-1]相同 – 2012-03-09 11:41:39

1

这个是什么?

foo.select { |p| p.at(-1) < 1 } 
+0

你能想到我之所以会得到NoM​​ethodError的任何原因吗(undefined method at'for – 2012-03-09 11:58:24

+0

@CharlieDavies显然是因为它不是一个Array。在'for'处指定更多的信息'undefined method'到底是什么?其余的错误信息在那里,请给我们看看,并且这个代码和你的没有区别array.at(-1)array [ - 1]和array.last都做同样的事情 – 2012-03-09 12:08:23

+0

只是想出了这个!谢谢 – 2012-03-09 12:08:30

2

如果你觉得不好的值可能会在您的数据存在,这是值得防范他们:

foo = [ [51, 05,1.0], [51,979,0.18], 4, nil, {:foo => :bar} ] 

foo.select do |x| 
    if (x.respond_to?(:last)) 
     x.last < 1 
    else 
     # the warn call evaluates to nil, thus skipping this element 
     warn("#{x.class} does not respond to method last") 
    end 
end