gpt4 book ai didi

rust - 带引脚和不带引脚的比较功能

转载 作者:行者123 更新时间:2023-12-03 07:52:09 25 4
gpt4 key购买 nike

我正在尝试理解 Rust 中的 Pin https://doc.rust-lang.org/std/pin/ .

主要思想很明确如果我们有Pin<T>那么 T 类型的指针无法移动

我正在编写一个带有和不带有 Pin 的函数对于 Box 。我有完全相同的结果。如何更改代码才能看到 Pin 的效果?

use std::fmt::{self, Debug};
use std::pin::Pin;

fn foo_pin<T: Debug>(s: Pin<Box<T>>) {
let copys = s;
println!("Hi from Box: {:?}", copys);
//println!("Hi from Box: {:?}", s); // ERROR borrow of moved value: `s`
}

fn foo<T: Debug>(s: Box<T>) {
let copys = s;
println!("Hi from Box: {:?}", copys);
//println!("Hi from Box: {:?}", s); // ERROR borrow of moved value: `s`
}

fn main() {
// i32
let b = Box::new(1);
foo_pin(Pin::new(b));

let b2 = Box::new(2);
foo(b2);

/*
// &str
let b = Box::new("abc");
foo_pin(Pin::new(b));

let b2 = Box::new("123");
foo(b2);
*/
}

最佳答案

不能移动的不是指针,而是它所指向的数据。

例如:

fn foo_pin<T: Debug + Default>(mut s: Pin<Box<T>>) {
let data_inside: T = std::mem::take(&mut *s); // Can't make this work.
println!("Hi from Box: {:?}", data_inside);
}

fn foo<T: Debug + Default>(mut s: Box<T>) {
let data_inside: T = std::mem::take(&mut *s); // Can move the data.
println!("Hi from Box: {:?}", data_inside);
}

但是,请注意,固定合约仅适用于未实现 Unpin 的类型。 ,所以不是像 i32&str 这样的类型。然而,这些功能是通用的,不需要Unpin,所以这仍然演示了这个想法。如果我们需要取消固定,则可以:

fn foo_pin<T: Debug + Default + std::marker::Unpin>(mut s: Pin<Box<T>>) {
let data_inside: T = std::mem::take(&mut *s); // Works.
println!("Hi from Box: {:?}", data_inside);
}

关于rust - 带引脚和不带引脚的比较功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76916235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com