【发布时间】:2017-01-08 21:38:57
【问题描述】:
假设我们有一个变量(在用于其预期目的之后)应该永远被访问。
(就 Rust 而言,这样做可能是有效的,但其内容在应用程序上下文中逻辑上不再有效)。
例如,在 Python 中,您可以简单地这样做:
del myvar;
有没有办法禁止将来访问函数体中声明的变量或作为参数传递的引用?
请注意,通常可以为此使用范围,但这不适用于函数参数。
【问题讨论】:
标签: scope namespaces rust
假设我们有一个变量(在用于其预期目的之后)应该永远被访问。
(就 Rust 而言,这样做可能是有效的,但其内容在应用程序上下文中逻辑上不再有效)。
例如,在 Python 中,您可以简单地这样做:
del myvar;
有没有办法禁止将来访问函数体中声明的变量或作为参数传递的引用?
请注意,通常可以为此使用范围,但这不适用于函数参数。
【问题讨论】:
标签: scope namespaces rust
有一个丑陋的解决方法甚至适用于Copy 值:Shadowing。
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
}
但是,错误消息非常可怕,其意图也很不明确。我强烈敦促你重新考虑是否需要这种能力。作为记录,我从未在 Python 代码中看到明确的 del 用于此目的。我也没有在我读过的任何其他代码中回忆起这样的事情。
【讨论】:
os、functools、datetime、pdb 和 xml.etree
您可以将它传递给使用其参数的任何函数(只要您在要执行此操作的范围内拥有它的所有权)。一个例子是drop,它确实(和only)做到了这一点。之后任何尝试使用它都会导致“移动后使用”错误。
以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
}
请注意,这仅适用于未实现 Copy 的类型。
编辑:我想我找到了Copyable 类型的解决方案;他们可以是Boxed,之后他们可以是dropped:
let x = Box::new(5);
println!("{}", x); // ok
drop(x);
println!("{}", x); // error: use of moved value
【讨论】:
fn f(s: String) { drop(s); /* s is no longer valid */ }.