为什么在 Rust 中 [有时] 不需要泛型的生命周期说明符?

阿什温·罗希特

我正在查看 Microsoft Rust 指南,在阅读泛型章节时,我遇到了以下问题。

考虑以下两段代码:

struct Point<T>
{
    x: T,
    y: T,
}
fn main()
{
    let intro = Point{ x: "Hello", y: "World" };    
}
struct Point
{
    x: &str,
    y: &str,
}
fn main()
{
    let intro = Point{ x: "Hello", y: "World" };    
}

两者都有 x 和 y 都有类型&str为什么编译器能够在第一部分而不是在第二部分推断生命周期?

丹尼斯·塞古雷

在第一种情况下:

struct Point<T>
{
    x: T,
    y: T,
}
fn main()
{
    let intro = Point{ x: "Hello", y: "World" };    
}

类型定义对于任何 T 都是有效的,尤其是对于引用具有的任何生命周期(如果有引用)。这是一个泛型,它旨在适应(并在必要时导致几个不同的“真实”结构)。

您使用的具体结构是为了T存在,&'static str但它可能是另一个生命周期。

在第二种情况下

struct Point
{
    x: &str,
    y: &str,
}
fn main()
{
    let intro = Point{ x: "Hello", y: "World" };    
}

没有通用的。所以它必须是一个完全定义的类型。这意味着如果有引用,就必须有一个生命周期。你没有指定生命周期,所以这是一个错误。

如果您只想自由决定一生,那么它又是一个泛型:

struct Point<'a> {
    x: &'a str,
    y: &'a str,
}
fn main()
{
    let intro = Point{ x: "Hello", y: "World" };    
}

或者,如果您希望 Point 仅对静态引用有效,则可以将其定义为

struct Point {
    x: &'static str,
    y: &'static str,
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么有时Rust会在泛型中的参数前放置::?

来自分类Dev

为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

来自分类Dev

为什么有时不需要在Lambda中捕获const变量?

来自分类Dev

为什么这种相互引用结构在具有指定生命周期的 Rust 中工作?

来自分类Dev

如何在Rust中创建具有需要生命周期特征的泛型函数?

来自分类Dev

为什么在这个 Rust 函数输出中需要一个明确的生命周期?

来自分类Dev

在node.js / Express中,为什么在next()之后有时需要返回语句,而有时却不需要?

来自分类Dev

为什么用受保护的访问说明符定义活动类中的生命周期方法

来自分类Dev

为什么结构中的切片需要使用生命周期,但不需要向量?

来自分类Dev

在Rust中,当您需要一个引用持有结构来有时拥有其引用数据时的模式是什么?

来自分类Dev

为什么 C 中的字符数组不需要元素说明符,但整数数组需要?

来自分类Dev

为什么 Rust 需要此变量的“静态”生命周期?

来自分类Dev

在Node中,为什么“需要”分配有时需要大括号?

来自分类Dev

为什么 props.functionName 中的 props 有时只需要调用?

来自分类Dev

为什么有时在Python的交互式解释器中输出转义符?

来自分类Dev

为什么 \n 有时在 javascript 中充当空格而不是换行符?

来自分类Dev

为什么泛型函数不需要生命周期

来自分类Dev

为什么我有时需要使用JSON.stringify而有时不需要

来自分类Dev

为什么在 Rails 中有时我需要一个包,有时我不需要?

来自分类Dev

为什么 Google 表格中的 0 有时是绿色有时是红色?

来自分类Dev

为什么有时在BeginInvoke块中得到NullReferenceException?

来自分类Dev

为什么有时在匹配中取消引用变量?

来自分类Dev

为什么有时需要在`data.frame()`中将`.`括在`do`中的命名参数中?

来自分类Dev

为什么%运算符有时输出正数,有时输出负数?

来自分类Linux

为什么在OpenSSL 1.1中ECC签名验证需要随机数(有时需要很长时间)?

来自分类Dev

为什么Visualforce页面需要无效的HTML?(有时)

来自分类Dev

为什么有时需要外部包装箱?

来自分类Dev

为什么OCaml有时需要eta扩展?

来自分类Dev

为什么有时在元字符周围需要空格?

Related 相关文章

  1. 1

    为什么有时Rust会在泛型中的参数前放置::?

  2. 2

    为什么“尝试/捕获”中的命令有时需要-ErrorAction停止,而有时则不需要?

  3. 3

    为什么有时不需要在Lambda中捕获const变量?

  4. 4

    为什么这种相互引用结构在具有指定生命周期的 Rust 中工作?

  5. 5

    如何在Rust中创建具有需要生命周期特征的泛型函数?

  6. 6

    为什么在这个 Rust 函数输出中需要一个明确的生命周期?

  7. 7

    在node.js / Express中,为什么在next()之后有时需要返回语句,而有时却不需要?

  8. 8

    为什么用受保护的访问说明符定义活动类中的生命周期方法

  9. 9

    为什么结构中的切片需要使用生命周期,但不需要向量?

  10. 10

    在Rust中,当您需要一个引用持有结构来有时拥有其引用数据时的模式是什么?

  11. 11

    为什么 C 中的字符数组不需要元素说明符,但整数数组需要?

  12. 12

    为什么 Rust 需要此变量的“静态”生命周期?

  13. 13

    在Node中,为什么“需要”分配有时需要大括号?

  14. 14

    为什么 props.functionName 中的 props 有时只需要调用?

  15. 15

    为什么有时在Python的交互式解释器中输出转义符?

  16. 16

    为什么 \n 有时在 javascript 中充当空格而不是换行符?

  17. 17

    为什么泛型函数不需要生命周期

  18. 18

    为什么我有时需要使用JSON.stringify而有时不需要

  19. 19

    为什么在 Rails 中有时我需要一个包,有时我不需要?

  20. 20

    为什么 Google 表格中的 0 有时是绿色有时是红色?

  21. 21

    为什么有时在BeginInvoke块中得到NullReferenceException?

  22. 22

    为什么有时在匹配中取消引用变量?

  23. 23

    为什么有时需要在`data.frame()`中将`.`括在`do`中的命名参数中?

  24. 24

    为什么%运算符有时输出正数,有时输出负数?

  25. 25

    为什么在OpenSSL 1.1中ECC签名验证需要随机数(有时需要很长时间)?

  26. 26

    为什么Visualforce页面需要无效的HTML?(有时)

  27. 27

    为什么有时需要外部包装箱?

  28. 28

    为什么OCaml有时需要eta扩展?

  29. 29

    为什么有时在元字符周围需要空格?

热门标签

归档