Rust 有可能专门研究静态生命周期吗?

Rust 有可能专门研究静态生命周期吗?,rust,traits,lifetime,specialization,Rust,Traits,Lifetime,Specialization,我想从&'a str专门化&'static str: 使用std::borrow::Cow; 结构MyString{ 内:我的串牛{ fn来自(x:&'static str)->Self{ MyString{ 内部:Cow::借用(x), } } } 从中为MyString执行impl{ fn来自(x:T)->Self{ MyString{ 内部:Cow::Owned(x.into()), } } } fn main(){ 匹配MyString::from(“foo”).inner{ Cow::

我想从
&'a str
专门化
&'static str

使用std::borrow::Cow;
结构MyString{
内:我的串牛{
fn来自(x:&'static str)->Self{
MyString{
内部:Cow::借用(x),
}
}
}
从中为MyString执行impl{
fn来自(x:T)->Self{
MyString{
内部:Cow::Owned(x.into()),
}
}
}
fn main(){
匹配MyString::from(“foo”).inner{
Cow::借来的(..)=>(),
_ => {
恐慌!();
}
}
设s=String::from(“bar”);
匹配MyString::from(s.as_ref()).inner{
奶牛::拥有的(..)=>(),
_ => {
恐慌!();
}
}
匹配MyString::from(String::from(“qux”)).inner{
奶牛::拥有的(..)=>(),
_ => {
恐慌!();
}
}
}
要点是,
MyString
将静态分配的字符串文本存储为
&'static str
,将所有其他字符串存储为
字符串
。这允许
MyString
避免使用生存期参数,即,
MyString用于MyString{
|-------------------------------------这里的第一个实现
...
15 |为MyString从导入{
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ MyString的实现冲突`

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

Rust 1.51.0没有任何类型的专业化。如果我阅读正确,那么即使在实施RFC时,也不会支持终身专业化:

trait系统设计中的一个硬约束是调度 不能依赖生命周期信息。特别是,我们都不能, 并且不应允许基于生命周期的专门化

  • 我们不能这样做,因为当编译器实际生成代码(“trans”)时,生命周期信息已经被删除了——所以我们就没有了 我想知道什么样的专业才能适用

  • 我们不应该这样做,因为一生的推断是微妙的,常常会导致违反直觉的结果。例如,你很容易失败 获取
    “静态”
    ,即使它适用,因为推理是选择 与其他约束匹配的最小生存期

(强调矿山)

链接中还有一些例子说明了一些具体问题


我建议使用
Cow
来处理“拥有或借用”的情况。

我在阅读了这篇文章后写下了这个答案,询问如何定义一个在传递静态字符串或非静态字符串时表现不同的方法/函数

这是不可能的,因此解决方法可能是使用包装器类型将字符串参数包装到
枚举中

enum MyString {
    Static(&'static str),
    Heap(String),
}

fn bar(arg: &MyString) {
    match arg {
        &MyString::Static(ref name) => println!("my first pc was {}", name),
        &MyString::Heap(ref name) => println!("I dont know {}", name),
    }
}

fn main() {
    let mut v = Vec::new();

    let forever: &'static str = "zx-spectrum";
    let local: &str = &"commodore64".to_string();

    v.push(MyString::Static(forever));

    // ERROR: try to insert 'a lifetime
    // v.push(Mystring::Static(local));
    v.push(MyString::Heap(local.to_string()));

    v.push(MyString::Heap("muggle".to_string()));

    bar(&v[0]);
    bar(&v[1]);
}
MyString
将静态分配的字符串文本存储为
&'static str
,将所有其他字符串存储为
字符串

正如下面的注释所指出的,标准库提供了一种适合借用/拥有情况的类型:智能指针

本例中使用的enum
MyString
只是用于管理字符串类型的特定enum

唯一的区别在于枚举的命名更加具体,它的变体与特定用法相关:
MyString::Static(“永远”)
Cow::followed(“永远”)
MyString::Heap(str)
Cow::Owned(str)

这有助于提高助记符和代码的可读性吗?我很确定这只适用于新手或偶尔生锈的程序员,而不适用于经验丰富的Rustacean