1

是否有用于从数组中的所有元素中减去的红宝石函数?

[2,4,7,8,9] - 8 = [-6,-4,-1,0,1] 

这不起作用,但我不想在更复杂的情况下这样做。

[2,4,7,8,9] - [8,8,8,8,8] = [-6,-4,-1,0,1] 
4

7 回答 7

17

你想要map,它允许你对 Enumerable 的每个元素应用转换,返回结果数组:

[2,4,7,8,9].map { |i| i - 8 } # => [-6, -4, -1, 0, 1]

顺便说一句,您的第二个示例绝对不能以这种方式工作:

[2,4,7,8,9] - [8,8,8,8,8] = [-6,-4,-1,0,1] 

减法从第一个数组中删除第二个数组中的项目,产生[2,4,7,9]而不是您的预期[-6,-4,-1,0,1]

于 2013-07-04T14:36:14.933 回答
3

值得一提的是narraygem 作为使用 Ruby 内置Array.map. 如果您的数值数组比您的示例大得多,则narray对其进行优化以对其进行数学运算,并且也可以按照您最初的建议工作:

> require 'narray'
 => true

> a = NArray[10,9,8,2,3]
 => NArray.int(5):
[ 10, 9, 8, 2, 3 ]

> a - 8
 => NArray.int(5):
[ 2, 1, 0, -6, -5 ]
于 2013-07-04T14:53:35.177 回答
1

这就是 map/collect 的用途(是的,它们的功能完全相同,collect 是出于历史原因而存在的)。

[1,2,3,4,5].map do |elem|
  elem - 1
end

或使用 collect 和替代 do/end 语法(在地图中也有效)

[1,2,3,4,5].collect { |elem| elem - 1 }

两者都返回

 => [0, 1, 2, 3, 4]
于 2013-07-04T15:22:46.353 回答
0
class Array
  def to_proc
    proc { |receiver| receiver.send *self }
  end
end

[2,4,7,8,9].map &[:-, 8] #=> [-6,-4,-1,0,1]
于 2013-07-04T18:31:06.663 回答
0

您可以通过以下方式使用任何地图或收集方法。

[2,4,7,8,9].collect {|e| e-8}
=> [-6, -4, -1, 0, 1]

[2,4,7,8,9].map {|e| e-8}
=> [-6, -4, -1, 0, 1]
于 2013-07-05T07:09:44.710 回答
0

如果您使用的是 JRuby,那么您可以尝试具有与 NArray 类似功能的 MDArray。虽然没有太多的文档。

于 2013-07-10T15:10:15.537 回答
-2

对于第二种情况,您可以使用外部迭代器。试试这个:

ary = [8,8,8,8,8].each
[2,4,7,8,9].map{ |e| e - ary.next } # => [-6,-4,-1,0,1]
于 2013-07-04T14:42:53.617 回答