What is happening is that Rust is choosing the lifetimes to be different that what is shown.

When you swap the parameters, you are changing the problem entirely. Also, you should note that lifetimes no longer correspond to lexical scopes, they correspond to invisible scopes that are determined by when values are used.

The statement that

<'a: 'b, 'b> reads as lifetime 'a is at least as long as 'b .

is true, and is necessary for correctness. If you would like to see an example of how this comes up in a more visible, but more complex and niche way, see my answer here

Heres one way to see how lifetime analysis is working.
First the definition of Foo
struct Foo<'a> {
lookup: HashMap<u32, Bar<'a>>,
current: Option<&a' Bar<'a>>
}
Here we are saying that the lifetime in current is the same as in lookup. Simple stuff, binding lifetimes together.
Next, in Foo::new
...
fn new() -> Self {
let mut lookup = HashMap::new();
lookup.insert(42, Bar{message: "secret to life, the universe, and everything"});
Self{
…