The semantic difference is that Procs and lambdas can be saved to variables, whereas blocks are used immediately.
The difference is mostly one of speed. Ruby optimizes for blocks, when you use procs / lambdas, the method has to get instantiated as an object, this has a bit of overhead. Use them for when you actually need to store away a method for later.