我试着编译一个包含这个函数的程序,我希望它不会通过编译器,但事实证明它确实如此,我想知道为什么会这样。
我目前正在学习Rust,最近我遇到了这个函数
fn test(input_str: &str) -> &str {
if input_str == "" {
let default: &str = "default";
&default
} else {
input_str
}
}
据我所知,我们不能返回一个在函数中分配的变量的引用,因为它的寿命不够长,我试着编译这个函数,结果它成功地通过了编译,我想知道为什么会这样,我的理论是,硬编码的字符串被处理得有些不同,不知何故,它们和主程序一样长,但我不知道为什么。所以,请有人给我解释清楚:)和thnx。
1条答案
按热度按时间zyfwsgd61#
这里的关键是
"default"
不是“variable allocated“1,它是一个静态字符串,或者用Rust的说法是&'static str
。这是因为当你的代码被编译时,引号字符串被有效地“烤”了出来,它们是零成本的,并且总是存在的。此函数中的任何内容都不需要allocation 2。退回去没问题。对于
&String
来说,情况并非如此。这些需要分配,使其处理复杂化。也就是说,您可以返回一个显式
static
版本的String的引用,但这需要更多的准备,更不用说像once_cell
或lazy_static
这样的工具了。1、这不是真的。变量不分配,但它们可以“拥有”已分配的内容。
2这里的意思是“动态分配”,与堆栈空间预留相对。