⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

Pin: 不只是自引用——手动投影的艺术

构建自引用结构时Pin与unsafe的手动投影技术,以及如何安全地暴露字段 · 难度:入门 · +10XP

Pin: 不只是自引用——手动投影的艺术

Pin通常被简化为自引用结构的关键工具。但真正的挑战在于:当你拥有一个Pin<&mut MyStruct>,如何安全地获得其字段的Pin引用(即投影)?标准库没有提供派生宏,必须用unsafe实现。本教程从零实现一个安全投影机制,讲解Pin的不变量(never move after pinned),并展示如何正确编写pin_project_like的代码,同时防止滥用时触发的未定义行为。

use std::pin::Pin;

struct SelfRef { data: String, ptr: *const String, // 指向data }

impl SelfRef { fn new(data: String) -> Self { SelfRef { ptr: std::ptr::null(), data } } fn init(self: Pin<&mut Self>) { let this = unsafe { self.get_unchecked_mut() }; this.ptr = &this.data as *const String; } // 手动投影:获得data字段的Pin<&mut String> fn pin_data(self: Pin<&mut Self>) -> Pin<&mut String> { unsafe { self.map_unchecked_mut(|s| &mut s.data) } } }

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 122 篇
0 完成
🔥 0