rust-pin
4
总安装量
2
周安装量
#52036
全站排名
安装命令
npx skills add https://github.com/huiali/rust-skills --skill rust-pin
Agent 安装分布
claude-code
2
trae
1
qoder
1
trae-cn
1
antigravity
1
Skill 文档
Pin ä¸èªå¼ç¨
æ ¸å¿é®é¢
å¦ä½å¨å¼æ¥æèªå¼ç¨ç»æä¸ä¿è¯æéç¨³å®æ§ï¼
Pin ç¡®ä¿æäºç±»åå¨å åä¸ä¸ä¼ç§»å¨ã
ä»ä¹æ¶åéè¦ Pin
1. async/await ç Future
use std::pin::Pin;
use std::task::{Context, Poll};
struct MyFuture {
state: State,
}
impl Future for MyFuture {
type Output = ();
fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
let this = self.get_mut();
// å®å
¨ä½¿ç¨ this.state
Poll::Ready(())
}
}
2. èªå¼ç¨ç»æ
use std::pin::Pin;
struct Node {
value: i32,
parent: Option<Pin<Box<Node>>>, // èªå¼ç¨
}
Pin çåç§ä½¿ç¨æ¹å¼
| æ¹å¼ | åºæ¯ | ä¾å |
|---|---|---|
Pin<&T> |
åç¨ï¼å¼ä¸ç§»å¨ | Pin<&Foo> |
Pin<&mut T> |
å¯ååç¨ | Pin<&mut Foo> |
Pin<Box<T>> |
Box å 裹 | Pin<Box<Foo>> |
Pin<Arc<T>> |
Arc å 裹 | Pin<Arc<Foo>> |
Unpin marker
// ç±»åå¯ä»¥å®ç° Unpin 表示å®ä¸ä»æè¢«ç§»å¨
struct MyType {
data: Vec<u8>,
}
// Unpin èªå¨å®ç°ï¼å¤§å¤æ°ç±»åä¸éè¦æå¨å®ç°
// åªäºç±»å没æå®ç° Unpinï¼
// - Future (async/await çæç)
// - Generator
// - æå¨ç¨ !Unpin æ è®°çç±»å
struct NotUnpinType {
// å
å«èªå¼ç¨æé
ptr: *const Self,
}
impl !Unpin for NotUnpinType {}
Pinning Projection
struct Wrapper<T> {
inner: T,
extra: String,
}
impl<T> Pin for Wrapper<T> where T: Unpin {
// projection å° inner
fn project(self: Pin<&mut Self>) -> Pin<&mut T> {
// SAFETY: Wrapper is pinned, inner is inside it
unsafe {
&mut self.get_unchecked_mut().inner
}
}
}
常è§é误
| é误 | åå | è§£å³ |
|---|---|---|
| å¿è®° Pin | future å¯è½è¢«ç§»å¨ | æ£ç¡®ä¼ é Pin |
| projection é误 | åç¨è§åè¿å | unsafe get_unchecked_mut |
| è¯¯ç¨ Unpin | è·¨ await ä¿ææé | çè§£ future ç»æ |
ä»ä¹æ¶åä¸éè¦ Pin
- 忥代ç ï¼ä¸æ¶å future
- æ°æ®ç»æä¸å å«èªå¼ç¨
- æ ä¸ç临æ¶å¼
- æç¡®ç¥éå¼ä¸ä¼è¢«ç§»å¨
使ç¨åºæ¯éæ¥
| åºæ¯ | éè¦ Pin å |
|---|---|
async {} å |
â éè¦ |
Box<dyn Future> |
â éè¦ |
| äºæ¥éå ç Future | â éè¦ |
| æ®é Vec | â ä¸éè¦ |
| æ ä¸åé | â ä¸éè¦ |
| 没æèªå¼ç¨ç struct | â ä¸éè¦ |