Prefer let over instance variables in lets as the lets are only evaluated on use.  In general, you want to have a named subject in at least the outer context, but you do get a free, unnamed subject that is set to `described_class.new`, that you can use for `it { should do_stuff }` style examples where you let the matcher (`do_stuff`) provide the description for the example.  However, you should _not_ use the unnamed subject in spec like so

```ruby
it 'should do stuff' do
  subject.do_stuff.should be_true
end
```

If you need to do reference the subject explicitly, instead of implicitly, then use the named subject by passing the name to subject:

```ruby
subject(:named) do
  described_class.new
end

# use it

it 'should do stuff' do
  named.do_stuff should be_true
end
```

There are also shortcuts for attributes and elements:

```ruby
describe Widget do
  subject(:widget) do
    described_class.new
  end
   
  its(:usefulness) { should be_high }
end
```

is the equivalent of all this

```ruby
describe Widget do
   subject(:widget) do
     described_class.new
   end
   
   # use # before method name to indicate it's an instance method
   context '#usefulness' do
     subject(:usefulness) do
       widget.usefulness
     end
     
     it { should be_high }
   end
end
```

RSpec also will support any `?` boolean method with a `be_` prefix, so I don't even have to define a `be_high` matcher, I can just defined `Usefullness#high?` (assuming Widget#usefullness is another object) and rspec will use it.  That's why we can do `it { should be_valid }` or `it { should be_invalid }` everywhere.  This is no specific matcher for those, it just uses the `?` method.