在 Rust 中为固定对象生成错误

问题描述 投票:0回答:1

我正在研究自引用结构,并且我了解如何使用同步/发送特征来强制安全免受竞争条件的影响,但 Pin 用例似乎没有得到很好的解释。 基本上,这段代码不会编译,因为

iter
不是发送:

fn main() {
    let mut list : LinkedList<RefCell<String>> = LinkedList::new();
    list.push_back(RefCell::new("foo".to_string()));
    let iterator = list.iter();

    thread::spawn(move || {
        // Compiler error: iterator is not Send.
        for item in iterator {
            item.replace("qux".to_string());
        }
    }).join().unwrap();
}

是否有类似的代码无法编译,因为要移动的对象不是 Pin 或者 Pin 只是一个约定,告诉接收代码该对象以一致的状态发送?那里的示例似乎暗示着编译错误,但从未见过明显由于固定问题而生成的错误。

为了更好地重新表述问题: 违反发送要求会导致编译错误。 违反 Pin 合约是否有可能产生编译错误?我读过,移动需要固定但未固定的对象会导致错误,但我找不到一种方法来导致编译错误在对象被固定时消失。

rust
1个回答
0
投票

好吧,我在官方异步文档中找到了它。

基本上,这是一个伪简约的编译错误示例,当注释从包含 _marker 的行中删除时。

use std::pin::Pin;
use std::marker::PhantomPinned;

#[derive(Debug)]
struct Test {
    a: String,
    // _marker: PhantomPinned, // remove comment for compilation error
}

impl Test {
    fn new(txt: &str) -> Self {
        Test {
            a: String::from(txt),
            // _marker: PhantomPinned, // remove comment for compilation error
        }
    }
}

pub fn main() {
    let mut test1 = Test::new("test1");
    let mut test1 = unsafe { Pin::new_unchecked(&mut test1) };

    let mut test2 = Test::new("test2");
    let mut test2 = unsafe { Pin::new_unchecked(&mut test2) };
    // the following line won't compile
    std::mem::swap(test1.get_mut(), test2.as_mut().get_mut());
}
© www.soinside.com 2019 - 2024. All rights reserved.