rust 为什么这个编译?

wljmcqd8  于 2023-05-22  发布在  其他
关注(0)|答案(1)|浏览(181)

我试着编译一个包含这个函数的程序,我希望它不会通过编译器,但事实证明它确实如此,我想知道为什么会这样。
我目前正在学习Rust,最近我遇到了这个函数

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

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

zyfwsgd6

zyfwsgd61#

这里的关键是"default"不是“variable allocated“1,它是一个静态字符串,或者用Rust的说法是&'static str。这是因为当你的代码被编译时,引号字符串被有效地“烤”了出来,它们是零成本的,并且总是存在的。此函数中的任何内容都不需要allocation 2。
退回去没问题。对于&String来说,情况并非如此。这些需要分配,使其处理复杂化。
也就是说,您可以返回一个显式static版本的String的引用,但这需要更多的准备,更不用说像once_celllazy_static这样的工具了。

1、这不是真的。变量不分配,但它们可以“拥有”已分配的内容。
2这里的意思是“动态分配”,与堆栈空间预留相对。

相关问题