22 个版本
使用旧的 Rust 2015
0.2.3 | 2016 年 8 月 18 日 |
---|---|
0.2.1 | 2016 年 5 月 14 日 |
0.1.2 | 2016 年 3 月 28 日 |
0.0.15 | 2015 年 12 月 3 日 |
0.0.8 | 2015 年 7 月 22 日 |
在 #prevent 中排名第 3
9KB
154 行代码(不包括注释)
由于它将不再与 MIR 一起工作,因此该包已被废弃
rust-tenacious
此插件会在标记为 #[no_move]
的类型被移动时发出警告。
这在确保通过 FFI 共享数据时,事物不会四处移动非常有用。Servo 使用此功能 安全地与 spidermonkey GC 共享根值。
请注意,#[no_move]
是传递性的,任何包含 #[no_move]
类型的结构体或枚举都必须进行注释。同样,任何在类型参数中有 #[no_move]
替换的类型(例如 Vec<Foo>
其中 Foo
是 no_move
)将被视为不可移动。
示例
#![plugin(tenacious)]
#![feature(custom_attribute, plugin)]
#[no_move]
#[derive(Debug)]
struct Foo;
fn main() {
let x = Foo;
let y = x; // warning
bar(Some(y)); // warning
}
fn bar(t: Option<Foo>) {
match t {
Some(foo) => { // warning
println!("{:?}", foo)
},
_ => ()
}
}
struct MoreFoo {
foos: Vec<Foo> // warning
}
#[no_move]
struct MoreFoo2 {
foos: Vec<Foo> // no warning
}
请注意,这不会在临时变量移动时进行代码检查(尽管很容易修改以实现这一点)。例如,如果 foo()
返回一个移动保护值,bar(foo())
即使在 let x = foo(); bar(x)
会出现错误的情况下也不会出错,因为 foo()
返回的值是一个临时值(右值)并且在内存中并未实际移动。
它也不会捕获泛型函数如 mem::swap()
和 `mem::replace()`` 内部的移动。
将 #[allow(moved_no_move)]
注释添加到结构体中,将抑制关于结构体包含一个 #[no_move]
类型但未标记为 #[no_move]
的警告。`#[allow_movable_interior]
` 属性执行上述操作并允许在类型参数中使用可移动类型。请参阅 tests/run-pass/allow-move.rs
获取示例。
请注意,如果您依赖于使用 #[no_move]
的 crate,您必须在您的 crate 中有 #![plugin(tenacious)]
以看到警告。