My conclusion is that both let and let! cached value within examples, but not cross examples. If another example calls it, both of them will be executed. The only difference is that let is lazy, which means it won’t be executed if it is not invoked, but that is not true for let!.
“let” is only evaluated when invoked, and keeps the same value within a scope
(:let!) is forcefully evaluated before each method call.
$count = 0 describe "let!" do invocation_order =  let!(:count) do invocation_order << :let! $count += 1 end it "calls the helper method in a before hook" do invocation_order << :example invocation_order.should == [:let!, :example] count.should eq(1) end it "calls the helper method again" do count.should eq(2) end end