我试图编译一个包含这个函数的程序,我本以为它不会通过编译器,但事实证明它通过了,我想知道为什么会这样.

我目前正在学习Rust,最近我遇到了这个函数

fn test(input_str: &str) -> &str {
    if input_str == "" {
        let default: &str = "default";
        &default
    } else {
        input_str
    }
}

据我所知,我们不能返回对函数中分配的变量的引用,因为它的生存时间不够长,我试图编译这个函数,结果它成功地通过了编译,我想知道为什么它通过了编译,我的理论是,硬编码的字符串被处理得有点不同,不知何故,它们和主程序一样长,但我不知道为什么.所以,请谁给我解释清楚:)和thnx.

推荐答案

这里的关键是,"default"不是"变量分配"1,它是一个静态字符串,或者用Rust的话来说是&'static str.这是因为在编译代码时,带引号的字符串实际上是"烘焙"的,它们是零成本的,并且始终存在.此函数中没有任何内容需要分配2.

退货没问题.但对于&String个人来说,情况就不一样了.这些公司需要分配资金,使它们的处理变得复杂.

也就是说,您可以返回对显式static版本的字符串的引用,但这需要更多的准备工作,更不用说once_celllazy_static这样的工具了.

-

1这不是真正的事情.变量不分配,但它们可以"拥有"分配的东西.

2这里指的是"动态分配",而不是堆栈空间保留.

Rust相关问答推荐

有没有方法处理rust中嵌套的ok_or()?

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

我应该将哪些文件放入我的GitHub存储库

异步函数返回的future 生存期

变量需要parse()中的显式类型

如何防止Cargo 单据和Cargo 出口发布( crate )项目

获取已知数量的输入

使用启用优化的 alloc 会导致非法指令崩溃

Google chrome 和 Apple M1 中的计算着色器

使用 Rust 从 Raspberry Pi Pico 上的 SPI 读取值

从光标位置旋转精灵

切片不能被 `usize` 索引?

字符串切片的向量超出范围但原始字符串仍然存在,为什么判断器说有错误?

如何在 nom 中构建负前瞻解析器?

`if let` 只是另一种编写其他 `if` 语句的方式吗?

为什么 std::iter::Peekable::peek 可变地borrow self 参数?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

在传输不可复制的值时实现就地枚举修改

为什么 `ref` 会导致此示例*取消引用*一个字段?

类型参数不受 impl 特征、自身类型或谓词的约束