Understanding Rust Error E0393

Rust Error E0393

Error E0393 occurs when a type parameter references Self in its default value but is not specified. It's commonly encountered when working with trait objects and default type parameters.

Code Example of E0393

fn main() {
    trait A<T=Self> {}

    fn together_we_will_rule_the_galaxy(son: &A) {}
    // error: the type parameter `T` must be explicitly specified in an
    //        object type because its default value `Self` references the
    //        type `Self`

In the showcased erroneous code above, Rust can't determine the default type parameter T due to the reference to Self. The type parameter should be explicitly specified to resolve this issue.

How to Fix E0393?

To fix the E0393 error, you need to make the trait concrete by explicitly specifying the value of the defaulted parameter.

Corrected Code Example

fn main() {
    trait A<T=Self> {}

    fn together_we_will_rule_the_galaxy(son: &A<i32>) {} // Ok!

In this corrected example, the type parameter T is explicitly specified as i32. This resolves the error, allowing the code to compile successfully.

Rules for Type Parameters and Trait Objects

When working with type parameters and trait objects, keep in mind the following rules to avoid error E0393:

1. Specify type parameters explicitly when they reference Self in their default value.

2. Avoid mixing default type parameters and trait objects, since they often lead to ambiguity.

Following these rules when working with type parameters helps to write clear, unambiguous code.