我正在尝试进行如下计算。 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
,我想在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
这是正确的,还是有其他方法可以做到这一点?
答案 0 :(得分:2)
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