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会支持的终身专业化是什么?
Rust 1.25.0没有任何特化.如果我正确地读取专业化RFC,那么即使实现RFC,也不支持生命周期专业化:
特征系统设计中的一个硬约束是调度不能依赖于生命周期信息.特别是,我们都不能,也不应该允许基于生命期的专业化:
我们不能,因为当编译器实际生成代码("trans")时,生命周期信息已经被删除 - 所以我们不知道什么样的专业化应该适用.
我们不应该,因为终身推理是微妙的,并且往往导致违反直觉的结果.例如,
'static即使适用,您也很容易失败,因为推理是选择与其他约束匹配的最小生命周期.
(强调我的)
链接中还有一些示例表明了一些具体问题.
我建议用a Cow来处理"拥有或借用"案件.