是否有可能专注于静态寿命?

Cra*_*urg 4 traits lifetime rust

我想专门&'static str&'a str.像这样的东西:

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!();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要点是MyString将静态分配的字符串文字存储为a &'static str,将所有其他字符串存储为a String.这允许MyString避免使用生命周期参数 - 即,MyString<'a>这对我的API至关重要,同时允许调用者传入任何类型的字符串并MyString自动执行正确的操作.

问题是代码无法编译:

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`
Run Code Online (Sandbox Code Playgroud)

有什么技巧可以让我做我想做的事吗?如果不是,Rust会支持的终身专业化是什么?

She*_*ter 9

Rust 1.25.0没有任何特化.如果我正确地读取专业化RFC,那么即使实现RFC,也不支持生命周期专业化:

特征系统设计中的一个硬约束是调度不能依赖于生命周期信息.特别是,我们都不能,也不应该允许基于生命期的专业化:

  • 我们不能,因为当编译器实际生成代码("trans")时,生命周期信息已经被删除 - 所以我们不知道什么样的专业化应该适用.

  • 我们不应该,因为终身推理是微妙的,并且往往导致违反直觉的结果.例如,'static即使适用,您也很容易失败,因为推理是选择与其他约束匹配的最小生命周期.

(强调我的)

链接中还有一些示例表明了一些具体问题.

我建议用a Cow来处理"拥有或借用"案件.