Ruby 注入奇怪的行为
Ruby Inject Weird Behavior
我正在尝试生成给定数组的完整排列。例如,如果输入是 fact(2, ['A', 'B'])
,输出应该是 [["A", "A"], ["B", "A"], ["A", "B"], ["B", "B"]]
.
def fact(n, arr)
return [[]] if n == 0
nxt = fact(n - 1, arr).freeze
arr.inject([]){ |result, elem| nxt.each { |x| result.push(x + [elem]); result } }
end
然而,当我尝试使用 'more functional programming' 方式执行此操作时,发生了一些奇怪的事情。口译员抱怨Untitled 4.rb:4:in 'push': can't modify frozen Array (RuntimeError)
。我实际上是在尝试修改名为 result
的注入数组,它怎么会改变 nxt
?
原来是错字
def fact(n, arr)
return [[]] if n == 0
nxt = fact(n - 1, arr).freeze
arr.inject([]){ |a, elem| nxt.each { |x| a.push(x + [elem]) }; a }
end
内置,懒惰:
perms = ['A', 'B'].repeated_permutation(2)
#use the resulting enumerator like this:
perms.each{|perm| p perm}
我正在尝试生成给定数组的完整排列。例如,如果输入是 fact(2, ['A', 'B'])
,输出应该是 [["A", "A"], ["B", "A"], ["A", "B"], ["B", "B"]]
.
def fact(n, arr)
return [[]] if n == 0
nxt = fact(n - 1, arr).freeze
arr.inject([]){ |result, elem| nxt.each { |x| result.push(x + [elem]); result } }
end
然而,当我尝试使用 'more functional programming' 方式执行此操作时,发生了一些奇怪的事情。口译员抱怨Untitled 4.rb:4:in 'push': can't modify frozen Array (RuntimeError)
。我实际上是在尝试修改名为 result
的注入数组,它怎么会改变 nxt
?
原来是错字
def fact(n, arr)
return [[]] if n == 0
nxt = fact(n - 1, arr).freeze
arr.inject([]){ |a, elem| nxt.each { |x| a.push(x + [elem]) }; a }
end
内置,懒惰:
perms = ['A', 'B'].repeated_permutation(2)
#use the resulting enumerator like this:
perms.each{|perm| p perm}