Isso é baseado em um código interessante que observei outro dia. Em Ruby, o método each_cons Array permite que você execute um bloco em um array de n elementos consecutivos. Por exemplo:
> (1..10).each_cons(2) {|a| p a}
[1, 2]
[2, 3]
[3, 4]
[4, 5]
[5, 6]
[6, 7]
[7, 8]
[8, 9]
[9, 10]
=> nil
Isso é especialmente útil se você quiser testar a classificação. Suponha que temos a seguinte subclasse ActiveRecord :: Base:
class BlogPost < ActiveRecord::Base
attr_accessible :title
scope :by_title, order('title ASC')
end
Para testar se nosso escopo: by_title classifica corretamente, podemos verificar se o primeiro elemento em cada each_cons é menor ou igual ao segundo:
describe BlogPost do
before {
BlogPost.create(title: 'Blog Post A')
BlogPost.create(title: 'Blog Post B')
BlogPost.create(title: 'Blog Post C')
}
describe ".by_title" do
subject { BlogPost.by_title }
it "should return ordered blog posts" do
subject.each_cons(2) do |a, b|
a.title.should be <= b.title
end
end
end
end
Nada de estilhaçar a Terra, mas achei muito legal.