rust 交换两个固定框内的值

owfi6suc  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(154)

假设我有两个Pin<T>,例如我从Box::pin(struct_of_type_T)得到它们,一个Box拥有指向T类型的底层值的指针,一个Pin确保指针指向的值(类型为T)永远不会移动。
我可以交换“Pinned-box”中的两个指针吗?

pinned_box_1                   pinned_box_2
|-------------|                |-------------|
| pointer_one |<--swap them--?>| pointer_two |
|-------------|                |-------------|
       |                              |
       V                              V
 struct_of_type_T_one          struct_of_type_T_two
|-------------|                |-------------|
|  value_one  |                | value_two   |
|-------------|                |-------------|
 fixed_addr                     fixed_addr

如果是,我如何交换它们?std::mem::swap将在这种情况下工作?

frebpwbc

frebpwbc1#

是的,你可以,你甚至不需要std::mem::swap

fn main() {
    let mut pointer_one = Box::pin(99);
    let mut pointer_two = Box::pin(88);
    
    println!("pointer_one: {:p}, {}", pointer_one, *pointer_one);
    println!("pointer_two: {:p}, {}", pointer_two, *pointer_two);
    
    std::mem::swap(&mut pointer_one, &mut pointer_two);
    // (pointer_one, pointer_two) = (pointer_two, pointer_one); //also works
    
    println!("pointer_one: {:p}, {}", pointer_one, *pointer_one);
    println!("pointer_two: {:p}, {}", pointer_two, *pointer_two);
}

输出:

pointer_one: 0x558a90ebb9d0, 99
pointer_two: 0x558a90ebb9f0, 88
pointer_one: 0x558a90ebb9f0, 88
pointer_two: 0x558a90ebb9d0, 99

注意:这是正文中问题的答案,标题的答案是否定的,这是不可能的,这正是Pin的目的,防止值的移动。

相关问题