注入数组

时间:2015-12-22 07:42:41

标签: arrays ruby hash ruby-1.8.7

我正在尝试进行如下计算。 option是一个空哈希,aes是一个数组。

options = {}
aes = [1,2]
test = aes.inject([]) do |array, value|
  array << value + 2
  array << value -1 if options[:calculation]  # here options[:calculation] will be nil 
end

我进行了调试,发现test的值为nilarray << value -1 if options[:calcuation]的输出为nil,我想在test中返回计算出的值。要解决此问题,我使用下面的代码,其中aes是一个数组:

options = {}
aes = [1,2]
test = aes.inject([]) do |array, value|
  array << value + 2
  array << value -1 if options[:calculation]  # here options[:calculation] will be nil 
  array # I am using `array` here
end

这是正确的,还是有其他方法可以做到这一点?

3 个答案:

答案 0 :(得分:2)

改为使用Enumerator#with_object

options = {}
test = aes.each.with_object([]) do |value, array|
  array << value + 2
  array << value -1 if options[:calcuation] 
end

答案 1 :(得分:1)

在Ruby中,方法中执行的最后一个语句的结果是返回值。 如果最后一个语句恰好是条件语句而不执行,则返回值为nil

def meth
    var = nil
    10 if var # will not execute
end
p meth
#=> nil

同样适用于街区。

如果是Array#inject,则赋予inject的块的返回值将成为累加器的新值。

因为在你的情况下,由于条件为假(因为options[:calculation]nil),块的最后一个语句没有执行,所以累加器值无意中变为nil。为了避免它返回nil,你必须明确地返回累加器的值。

如果您不想将array用作显式返回语句,则可以将代码修改为如下所示。

aes = [1,2,3,4,3,4]
options = {}
test = aes.inject([]) do |array, value|
  array + [value + 2] + (options[:calculation] ? [value - 1] : [])
end
#=> [3, 4, 5, 6, 5, 6]

答案 2 :(得分:0)

你在某种程度上滥用inject。它应该对元素应用“二进制操作”,而不是填充数组。

所以,而不是写作:

aes = [1,2]
test = aes.inject([]) do |array, value|
  array << value + 2
  array << value - 1 if options[:calculation]
  array
end

我只想写:

aes = [1,2]
test = []
aes.each do |value|
  test << value + 2
  test << value - 1 if options[:calculation]
end