我读了here

当需要指定显式生存期时,共享引用类型被写入&type&'a type.

理解&代表shared reference,但不理解type'a在语言中的区别

another location年,我读到了以下代码:

#[derive(Debug)]
struct Person<'a> {
    name: &'a str,
    age: u8
}

fn main() {
    let name = "Peter";
    let age = 27;
    let peter = Person { name, age };

    // Pretty print
    println!("{:#?}", peter);
}

struct Person<'a> { }中的'a是什么意思?

name: &'a str是什么意思?

如果我想避免使用<'a>,我该如何重新编码呢

推荐答案

我找到了thisthisthisthis,这就解释了我的问题.

'a上写着"生命的a".从技术上讲,每个引用都有一些与之相关的生存期,但编译器允许您在常见情况下省略(即省略,请参见"Lifetime Elision").

fn bar<'a>(...)

一个函数可以有<>之间的"通用参数",其中生命周期是一种.<>用于声明生命周期.这说明wine 吧只有一次生命.

Rust有两种主要类型的弦:&strString.&str人被称为‘string slices’人.字符串切片的大小是固定的,不能进行变异.它是对UTF-8字节序列的引用.

let greeting = "Hello there."; // greeting: &'static str

"你好."是string literal型,型号是&'static str.string literal是静态分配的字符串片段,这意味着它保存在编译的程序中,并在整个运行期间存在.问候语绑定是对这个静态分配字符串的引用.任何需要字符串片段的函数也将接受字符串文本.

在上面的例子中

struct Person<'a> {  }

要求包含<'a>,因为name的定义如下:

name: &'a str,

这被称为:

let name = "Peter";

如果有兴趣避免使用'a,则可以将上述代码重新编写为:

#[derive(Debug)]
struct Person {    // instead of: struct Person<'a> {
    name: String,  // instead of: name: &'a str 
    age: u8
}

fn main() {
    let name = String::from("Peter");  // instead of: let name = "Peter"; which is &'static str
    let age = 27;
    let peter = Person { name, age };

    // Pretty print
    println!("{:#?}", peter);
}

正如@Dimitrissfouns在 comments 中提到的,简而言之,"为什么‘a’在那里?"——因为struct定义将其绑定到一个引用的对象(在本例中,每个struct Person实例都引用了a&str),所以您需要具体地声明一个任意生存期,并将这两件事绑定在一起:您希望struct Person实例的生存时间与其引用的对象一样长(因此Person<;a>;和name:&;a str)这样就避免了在对方死后挂起参照物.

Rust相关问答推荐

如何在Rust中在屏幕中间打印内容?

在Rust中创建可变片段的可变片段的最有效方法是什么?

使用nom将任何空白、制表符、白线等序列替换为单个空白

为什么我需要在这个代码示例中使用&

将JSON密钥转换为Polars DataFrame

限制未使用的泛型导致编译错误

使用Clap时如何将String作为Into Str参数传递?

如何删除Mac Tauri上的停靠图标?

在Rust中声明和定义一个 struct 体有什么区别

借来的价值生命周期 不够长,不确定为什么它仍然是借来的

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

`tokio::pin` 如何改变变量的类型?

Rust中的标记特征是什么?

没有明确地说return会产生错误:match arms have incompatible types

在 Rust 中,我如何处理请求 javascript 的页面?

如何在 use_effect_with_deps 中设置监听器内的状态?

SDL2 没有在终端键上触发?

预期的整数,找到 `&{integer}`

通用类型,不同于输入类型,作为函数的返回值

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?