注入数组

Inject in array

我正在尝试进行如下计算。 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,我想returntest中的计算值。为了解决这个问题,我使用下面的代码,其中 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

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

改用Enumerator#with_object

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

在Ruby中,方法中执行的最后一条语句的结果是return值。 如果最后一条语句恰好是条件语句并且没有执行,则 return 值为 nil.

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

块也是如此。

Array#inject的情况下,给予inject的块的return值成为累加器的新值。

因为在您的情况下,由于条件为假(因为 options[:calculation]nil),块的最后一个语句不会执行,累加器值无意中变为 nil。为避免 returning nil,您必须明确 return 累加器的值。

如果您不喜欢将 array 用作明确的 return 语句,您可以将代码修改为如下所示。

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]

您在某种程度上误用了 inject。它应该将 "a binary operation" 应用于元素,而不是填充数组。

所以,而不是写:

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