可以阻止访问作用域中声明的变量或作为函数参数吗?

ide*_*n42 -2 scope namespaces rust

假设我们有一个变量(在用于其预期目的之后)永远不应该被访问.

(就Rust而言,这样做可能是有效的,但其内容在应用程序的上下文中在逻辑上不再有效).

例如,在Python中,您可以简单地执行以下操作:

del myvar;
Run Code Online (Sandbox Code Playgroud)

有没有办法禁止将来访问函数体中声明的变量或作为参数传递的引用?


请注意,通常可以使用范围,但这不适用于函数参数.

lje*_*drz 5

您可以将它传递给任何使用其参数的函数(只要您在要执行它的范围内拥有所有权).一个例子是drop,它完全(并且)完成.之后任何尝试使用它都会导致"移动后使用"错误.

foo作为要删除参数的块的简单示例s:

fn foo(s: String) -> whatever {
    println!("{}", s);

    drop(s); // fn drop<T>(_x: T) { }

    println!("{}", s); // error: use of moved value: `s` [E0382]

    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于未实现的类型Copy.

编辑:我想我找到了适合Copy类型的解决方案; 他们可以Box编辑,之后他们可以是dropped:

let x = Box::new(5);
println!("{}", x); // ok

drop(x);

println!("{}", x); // error: use of moved value
Run Code Online (Sandbox Code Playgroud)


小智 5

有一个丑陋的解决方法甚至适用于Copy值:阴影.

enum Void {}

fn foo(x: i32) -> whatever {
    println!("{}", x);

    let x: Void;
    // Now `x` refers to an uninitialized variable with which you
    // couldn't do anything even if it was initialized
}
Run Code Online (Sandbox Code Playgroud)

但是,错误消息是可怕的,并且目的远非明确.我强烈建议你重新考虑一下你是否需要这种能力.为了记录,我从未del在Python代码中看到过显式用于此目的.在我读过的任何其他代码中,我也不记得这样的事情.