2016-04-09 119 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