2016-04-09 161 views
0

我试图在#inject内使用while循环。但是,最后的备忘录在某些时候会变成零,我不明白为什么。这是我的例子(我用#each的例子,是想说明预期的结果):#inject中的备忘录如何工作?

class TestClass 
    BASE_ARRAY = [5, 1] 

    def test_method(value) 
    result = [] 

    BASE_ARRAY.each do |item| 
     while item <= value 
     result << item 
     value -= item 
     end 
    end 

    result 
    end 

    def test_method_alternate(value) 
    BASE_ARRAY.inject do |memo, item| 
     while item <= value 
     p memo 
     # memo << item (if left, returns NoMethodError for nil Class) 
     value -= item 
     end 
    end 
    end 
end 

solution_one = TestClass.new.test_method(11) 
p solution_one # => [5, 5, 1] 

solution_two = TestClass.new.test_method_alternate(11) 
p solution_two 
# => [] 
    [] 
    nil 

如何累加器成为nil

回答

1

你得到nil最初从while loop

结果的while循环是nil,除非使用break来提供值。

导致成为一个链中其他语句的结果:

while 
-> do |memo, item| 
    -> BASE_ARRAY.inject 
    -> test_method_alternate(11) 
     -> solution_two 

要让.inject填满一个数组,你要提供一个空数组作为第一个使用memo

​​

然后,可以肯定该阵列是块的结果:

... do |memo, item| 
    while item <= value 
    memo << item 
    value -= item 
    end 
    memo # <--- 
end 
+0

谢谢,@jonathan!关于'while'的返回值的'解释'帮了我很大的忙,再加上'备忘录',我不知道我必须这样做。谢谢! – user3097405

1

两件事情:

  • 您需要初始化memo一个值,在这种情况下,你会想要一个[]
  • 您需要在每次迭代inject时返回memo

所以,你应该改变你的方法得到的[5, 5, 1]你期望的结果是这样的:

def test_method_alternate(value) 
    BASE_ARRAY.inject([]) do |memo, item| 
    while item <= value 
     memo << item 
     value -= item 
    end 
    memo 
    end 
end 
+0

Thanks @paul!当我输入问题时缺少备忘值'[]'是一个错误,但我没有返回备忘录,这就是问题所在。谢谢你的帮助! – user3097405