Arrays 注入阵列

Arrays 注入阵列,arrays,ruby,hash,ruby-1.8.7,Arrays,Ruby,Hash,Ruby 1.8.7,我试着做一些如下的计算选项是一个空散列,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 这是正确的,还是有其他方法可以做到这一点?请改用: opti

我试着做一些如下的计算
选项
是一个空散列,
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
这是正确的,还是有其他方法可以做到这一点?

请改用:

options={}
test=aes.each.with_对象([])do |值,数组|

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

def meth
    var = nil
    10 if var # will not execute
end
p meth
#=> nil
块也是如此

数组#inject
的情况下,给定给
inject
的块的返回值成为累加器的新值

由于在您的情况下,由于条件为false(如
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]
你有点误用了。它应该对元素应用“二进制操作”,而不是填充数组

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
因此,与其写:

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.injection([])do |数组,值|

array NoMethodError:对于#@ArvindKumar,未定义方法“with_object”,您使用的是哪个版本的Ruby?Ruby版本是1.8。7@ArvindKumar你为什么在石器时代?这是一个超级遗留代码库还是您只使用发行版的默认版本?您可以尝试用
每个对象替换
,用
每个对象替换
,因为我不记得是哪个版本引入了它,但不要期望太高。正如@ndn指出的,1.8.7从2013年年中正式发布。如果可能的话,尽最大努力尽快升级。您的代码与OP的代码不同:
|
从数组中删除重复项。@Stefan您是对的,我错了。将使用
+
而不是
|
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