Reference 为什么我可以返回对本地文本的引用而不是变量的引用?
这段代码为什么要编译Reference 为什么我可以返回对本地文本的引用而不是变量的引用?,reference,rust,borrow-checker,Reference,Rust,Borrow Checker,这段代码为什么要编译 fn get_iter() -> impl Iterator<Item = i32> { [1, 2, 3].iter().map(|&i| i) } fn main() { let _it = get_iter(); } fn get_iter()->impl迭代器{ [1,2,3].iter().map(|&i|i) } fn main(){ 让它=得到它(); } [1,2,3]是一个局部变量,iter()借用了它。此代
fn get_iter() -> impl Iterator<Item = i32> {
[1, 2, 3].iter().map(|&i| i)
}
fn main() {
let _it = get_iter();
}
fn get_iter()->impl迭代器{
[1,2,3].iter().map(|&i|i)
}
fn main(){
让它=得到它();
}
[1,2,3]
是一个局部变量,iter()
借用了它。此代码不应编译,因为返回值包含对局部变量的引用。在您的示例中,[1,2,3]
不被视为局部变量,而被视为静态变量
让我们看看这段代码:
fn foo() -> &'static [i32] {
&[1, 2, 3]
}
这管用
不久前,合并了:“将constexpr值提升为静态内存中的值,而不是堆栈插槽中的值”。这意味着,基本上你写的所有文字都可以永远存在。因此,类似于let&uu:&'static i32=&42代码>也可以工作
如果我们避免使用文字数组,我们可以看到预期的错误:
fn bar() -> impl Iterator<Item = i32> {
vec![1, 2, 3].iter().map(|&i| i)
}
除了文字,这也适用于标准库中的少量函数。决定任意const
函数的结果是否可以自动升级为静态
仍然是一个难题。看来const
变量已经过时:p@Boiethios这是一个有趣的想法。你找到可以链接的讨论了吗?@Boiethios它们不是过时的。这只适用于文本。有时您需要一个必须计算的常量。@Boiethios在静态内存中存储数据有一些缺点,特别是如果数据很大,并且在程序的整个生命周期中不需要。确实有些时候你应该选择这种行为。@Alexey是的,语言模型就是这么说的。但是,优化器以后仍然可以内联该值。
fn promote_integer() -> &'static i32 {
&42
}
fn promote_float() -> &'static f64 {
&42.42
}
fn promote_str() -> &'static str {
"Hello World!"
}
struct Foo(char);
fn promote_struct() -> &'static Foo {
&Foo('x')
}