【发布时间】:2014-12-13 01:19:00
【问题描述】:
我想定义一个可以采用可选数量的参数和散列的方法,就像这样
def foo(*b, **c)
2.times.map.with_index { |i|
new_hash, new_array = {}, b
c.map { |key, value| new_hash[key] = value[i] unless value[i].nil? }
new_array << new_hash if new_hash.length > 0
send(:bar, new_array)
}
end
def bar(*b)
p b
end
如果我正确理解了 splat 和 double splat 运算符(我对此表示怀疑),那么这应该将数组 b 发送到 bar 方法,并且只添加来自 foo 的 new_hash 如果它包含一些东西。但是,发生了一些奇怪的事情 - 我将尝试用下面的一些 sn-ps 来说明
# invoking #foo
foo(a, key: 'value')
# first iteration of loop in #foo
# i is 0
# b is []
# c is { :key => ['value1'] }
# send(:bar, new_array) => send(:bar, [{:key => 'value1'}])
# bar yields: [{:key => 'value1'}]
然而,现在发生了一些事情
# second iteration of loop in #foo
# i is 1
# b is [:key => 'value1'] <---- why?
# c is { :key => ['value1']
为什么b 的值在foo 的循环内发生了变化?
编辑更新了代码以反映每次迭代都会创建一个新数组
【问题讨论】:
-
您的代码与您的示例完全不匹配。
-
啊!您刚刚对其进行了编辑以删除您所询问的错误!
-
老兄,我想澄清一下我的观点,因为我问这个问题时显然很累。