Multiple trait bounds notation

While studying the multiple trait bounds section of the rust book:
https://doc.rust-lang.org/book/traits.html#multiple-trait-bounds
I though it would be clearer to use & instead of +, so the example would become:

fn foo<T: Clone & Debug>(x: T) {
    x.clone();
    println!("{:?}", x);
}

This would also allow the use of | with "or" meaning:

fn foo<T: Clone | Debug>(x: T) {
    x.clone();
    println!("{:?}", x);
}

Just for your consideration.

I do not understand how | would work, because the function body uses both and would therefore require both, not require at least one.

-1 though Beta has hit and i am not for random changes that don't affect anything just because some person wants it changed.

1 Like

On a better thought, I agree with you. Originally I thought if you had traits HasEngine, HasPedals, HasTwoWheels, HasFourWheels, HasCrawlers, you could write for instance:

fn yearly_cost_for_gasoline_and_tires<T: HasEngine & (HasTwoWheels | HasFourWheels)>(x: T) { ... };

but of course you could better solve this with trait HasWheels.

1 Like