注入数组
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
的值为nil
。 array << 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
这是正确的,还是有其他方法可以做到这一点?
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
我正在尝试进行如下计算。 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
的值为nil
。 array << 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
这是正确的,还是有其他方法可以做到这一点?
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