Ist es möglich, sich auf eine statische Lebensdauer zu spezialisieren?

Ich möchte mich spezialisieren&'static str von&'a str. Etwas wie das

use std::borrow::Cow;

struct MyString {
    inner: Cow<'static, str>,
}

impl From<&'static str> for MyString {
    fn from(x: &'static str) -> Self {
        MyString {
            inner: Cow::Borrowed(x),
        }
    }
}

impl<T: Into<String>> From<T> for MyString {
    fn from(x: T) -> Self {
        MyString {
            inner: Cow::Owned(x.into()),
        }
    }
}

fn main() {
    match MyString::from("foo").inner {
        Cow::Borrowed(..) => (),
        _ => {
            panic!();
        }
    }

    let s = String::from("bar");
    match MyString::from(s.as_ref()).inner {
        Cow::Owned(..) => (),
        _ => {
            panic!();
        }
    }

    match MyString::from(String::from("qux")).inner {
        Cow::Owned(..) => (),
        _ => {
            panic!();
        }
    }
}

as Wesentliche ist, dassMyString speichert ein statisch zugewiesenes Zeichenfolgenliteral als&'static str und alle anderen Zeichenfolgen alsString. Dies erlaubtMyString, um einen Lebensdauerkennwert zu vermeiden - d. h.MyString<'a>, das für meine API von entscheidender Bedeutung ist, während der Aufrufer jede Art von Zeichenfolge übergeben kann und @ hMyString automatisch das Richtige tun.

Das Problem ist, dass der Code nicht kompiliert wird:

error[E0119]: conflicting implementations of trait `std::convert::From<&'static str>` for type `MyString`:
  --> src/main.rs:15:1
   |
7  | impl From<&'static str> for MyString {
   | ------------------------------------ first implementation here
...
15 | impl<T: Into<String>> From<T> for MyString {
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `MyString`

Gibt es einen Trick, mit dem ich tun kann, was ich will? Wenn nicht, wird Rust die lebenslange Spezialisierung jemals unterstützen?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage