2013-02-02 49 views

回答

3

Enumerable#tap是你所需要的

(1..3).inject { |mult, n| (mult * n).tap { |next_mult| p [n, mult, next_mult] } } 
+0

除非我誤解了他的問題,這並不*完全*做他所需要的......對於我來說,這個代碼在每次迭代時輸出'mult * n',但我相信他想要獨立輸出在每一步(所以,你的答案輸出兩個數字,但他希望4)。我可能是錯的,雖然... – mdunsmuir

+0

感謝您的注意,我錯過了。編輯帖子。 –

+0

不錯。我想你可以使用'tap'在'方法鏈式'中執行你喜歡的任何代碼。 :) – mdunsmuir

0

像這樣:

>> (1..3).inject {|mult, n| r = mult * n; p "mult = #{mult}, n = #{n}, mult * n = #{r}"; r} 
"mult = 1, n = 2, mult * n = 2" 
"mult = 2, n = 3, mult * n = 6" 
1

這看起來比tap簡單的解決方案給我。這可能是一個品味問題。

(1..3).inject do |mult, n| 
    puts "#{mult} #{n}" 
    mult * n 
end 

1 2 
2 3 
=> 6 

要回答清風的關於迭代次數等問題,docs說:

如果你不明確指定備忘錄的初始值,然後使用收集的第一個元素作爲備忘錄的初始值。