我有我遍歷,這樣天的一個隨機時間的「最後一輪」:如何知道我們是在一個.each_slice
@days.each_slice(7) {|week|}
,並希望當我知道在最後一天(即最後一週)。什麼將是一個有效的方法來做到這一點?
我有我遍歷,這樣天的一個隨機時間的「最後一輪」:如何知道我們是在一個.each_slice
@days.each_slice(7) {|week|}
,並希望當我知道在最後一天(即最後一週)。什麼將是一個有效的方法來做到這一點?
我可以通過定義該算法以檢測陣列的最後一個切片想到的是最簡單的方法:
def last_slice(array, i)
last_slice = (array.count % i == 0) ? i : array.count % i
array.last(last_slice)
end
然後再比較一下:
if (week == last_slice(@days, 7))
我沒有紅寶石的知識,但你在你的循環中試試這個嗎?
@days.each_slice(7) {|week|
if week.last # do stuff...
}
這裏是Ruby文件爲each_slice方法:
http://ruby-doc.org/core-2.0/Enumerable.html#method-i-each_slice
@days.each_slice(7) { |week| if (week.last == @days.last) then <your code here> end }
這是一個暗示,希望能幫助你:
ar = [1,2,3,1,2,3,"a","b","c"]
e = ar.each_slice(3)
e.size.times do |i|
begin
i = e.next
e.peek
rescue StopIteration
p "reached last iteration : #{i}"
end
end
#=> "reached last iteration : [\"a\", \"b\", \"c\"]"
或者你可以如下操作:
e = ar.each_slice(3)
e.with_index{|i,ind| p i if ind == e.size - 1 }
#=> ["a", "b", "c"]
或者你可以做如下太:
ar = [1,2,3,1,5,3,"a","b","c"]
e = ar.each_slice(3)
e.size.times{|i| i = e.next;p i if !(e.peek rescue nil) }
#=> ["a", "b", "c"]
你在正確的軌道上,但過於複雜的一點。你可以'e.with_index {| days,i | ...}'並檢查'i == e.size - 1'來檢測塊內的最後一個塊。在1.9.3中(沒有'e.size'),你可以使用'dm = a.length.divmod(3); size = dm [0] +(dm [1] == 0?0:1)'而不是'e.size'。 – 2013-05-12 17:45:31
@ muistooshort我會使用'inline rescue'來縮短它的工作時間。我有些困惑與輸出。一旦我會有信心,並會在這裏發佈。仍然工作:( – 2013-05-12 17:47:39
@ muistooshort我完成了,請評估:) – 2013-05-12 19:29:22
@days.each_slice(7).with_index do |week,i|
if i == (@days.size-1)/7
# last one
end
...
end
另外,如果您在分組碼是上週高度發散:
weeks = @days.each_slice(7).to_a
weeks[0...-1].each {|week| ... }
weeks[-1].tap {|last_week| ... }
這個測試突破是否'@days.size%7 = 0'! – dbenhur 2013-05-12 22:08:33
如果前一週與上週的價值相同,則它也會中斷。實際上,任何比較值而不是位置的方法在表明它是最後枚舉的信號時會受到誤報。 – dbenhur 2013-05-12 22:22:20
@dbenhur,for'if week == @days [-7 ..- 1]'你說得對。如果只有3個(#ruby-doc.org/core-2.0/Array.html#method-i-last),那麼'#last'也不會代表[只檢索3個元素](http://ruby-doc.org/core-2.0/Array.html#method-i-last)。編輯) – Shoe 2013-05-13 00:45:08