rust-linear-type
4
总安装量
3
周安装量
#48832
全站排名
安装命令
npx skills add https://github.com/huiali/rust-skills --skill rust-linear-type
Agent 安装分布
trae-cn
2
claude-code
2
codebuddy
2
trae
1
qoder
1
antigravity
1
Skill 文档
线æ§ç±»å
æ ¸å¿é®é¢
å¦ä½ä¿è¯èµæºä¸è¢«æ³æ¼æè¢«éå¤éæ¾ï¼
线æ§ç±»åè¯ä¹ä¿è¯æ¯ä¸ªèµæºè¢«ç²¾ç¡®ä½¿ç¨ä¸æ¬¡ã
线æ§ç±»å vs Rust æææ
| ç¹æ§ | Rust æææ | 线æ§ç±»å |
|---|---|---|
| ç§»å¨è¯ä¹ | â | â |
| å¤å¶è¯ä¹ | å¯é | â |
| ææä¿è¯ | Drop | Destructible |
| åç¨ | â | â æåé |
| å¤éææ | Rc/Arc | â |
Rust é»è®¤ä¸æ¯çº¿æ§ç±»åï¼ä½å¯ä»¥éè¿æ¨¡å¼å®ç°çº¿æ§è¯ä¹ã
Destructible Trait
// 线æ§ç±»åçæ ¸å¿ï¼Destructible ä¿è¯ææ
use std::mem::ManuallyDrop;
struct LinearBuffer {
ptr: *mut u8,
size: usize,
}
impl Drop for LinearBuffer {
fn drop(&mut self) {
unsafe {
std::alloc::dealloc(self.ptr, Layout::array::<u8>(self.size).unwrap());
}
}
}
// 鲿¢åééæ¾
struct SafeLinearBuffer {
inner: ManuallyDrop<LinearBuffer>,
}
impl Drop for SafeLinearBuffer {
fn drop(&mut self) {
// ç¡®ä¿åªéæ¾ä¸æ¬¡
unsafe {
ManuallyDrop::drop(&mut self.inner);
}
}
}
ç¬å 对象模å¼
// ç¡®ä¿å¯¹è±¡åªè½è¢«ç§»å¨ï¼ä¸è½è¢«å¤å¶
#[derive(Copy, Clone)]
struct FileHandle(u32);
impl FileHandle {
// ç§ææé 彿°ï¼é²æ¢å¤é¨ç´æ¥å建
fn from_raw(fd: u32) -> Self {
Self(fd)
}
}
// å
è£
为线æ§ç±»å
struct LinearFile {
fd: FileHandle,
}
impl LinearFile {
pub fn open(path: &str) -> Result<Self, std::io::Error> {
// æå¼æä»¶ï¼è¿åçº¿æ§æä»¶å¥æ
Ok(LinearFile {
fd: FileHandle::from_raw(0), // 示ä¾
})
}
// consume() æ¹æ³æ¶è´¹ selfï¼ä¿è¯çº¿æ§ä½¿ç¨
pub fn consume(self) -> FileHandle {
self.fd
}
}
èµæºä»¤ç模å¼
// 线æ§èµæºä»¤ç
struct ResourceToken<T> {
resource: T,
consumed: bool,
}
impl<T> ResourceToken<T> {
pub fn new(resource: T) -> Self {
Self {
resource,
consumed: false,
}
}
// æ¶è´¹ä»¤çï¼è¿åèµæº
pub fn consume(mut self) -> T {
self.consumed = true;
self.resource
}
// æ£æ¥æ¯å¦å·²æ¶è´¹
pub fn is_consumed(&self) -> bool {
self.consumed
}
}
// 使ç¨ç¤ºä¾
fn process_resource(token: ResourceToken<Vec<u8>>) -> Vec<u8> {
// å¨è¿éå¤çèµæº
let data = token.consume(); // æ¶è´¹å令ç失æ
data
}
交æå¼èµæºç®¡ç
// 䏤鶿®µæäº¤æ¨¡å¼
struct Transaction<T> {
data: T,
committed: bool,
}
impl<T> Transaction<T> {
pub fn new(data: T) -> Self {
Self {
data,
committed: false,
}
}
pub fn commit(mut self) -> T {
self.committed = true;
self.data
}
// åæ»ï¼ä¸¢å¼èµæº
pub fn rollback(self) {
// èªå¨è°ç¨ Drop
}
}
// 使ç¨
fn example() -> Result<i32, ()> {
let tx = Transaction::new(100);
if condition {
tx.commit(); // æäº¤ï¼è¿åæ°æ®
} else {
tx.rollback(); // åæ»ï¼ä¸¢å¼
}
}
Unique æé模å¼
// 类似 C++ unique_ptr ççº¿æ§æé
struct UniquePtr<T: Sized> {
ptr: *mut T,
_marker: std::marker::PhantomData<T>,
}
impl<T> UniquePtr<T> {
pub fn new(data: T) -> Self {
let ptr = Box::into_raw(Box::new(data));
Self {
ptr,
_marker: std::marker::PhantomData,
}
}
pub fn as_ref(&self) -> Option<&T> {
if self.ptr.is_null() {
None
} else {
Some(unsafe { &*self.ptr })
}
}
// æ¶è´¹èªèº«ï¼è¿å Box
pub fn into_box(self) -> Box<T> {
unsafe {
let ptr = self.ptr;
std::mem::forget(self);
Box::from_raw(ptr)
}
}
}
impl<T> Drop for UniquePtr<T> {
fn drop(&mut self) {
if !self.ptr.is_null() {
unsafe {
Box::from_raw(self.ptr);
}
}
}
}
Rust ä¸ç线æ§è¯ä¹åºæ¯
| åºæ¯ | 线æ§ä¿è¯ | æ¨¡å¼ |
|---|---|---|
| æä»¶å¥æ | close æ°å¥½ä¸æ¬¡ | RAII + Drop |
| ç½ç»è¿æ¥ | close æ°å¥½ä¸æ¬¡ | RAII + Drop |
| å ååé | free æ°å¥½ä¸æ¬¡ | RAII + Drop |
| é | unlock æ°å¥½ä¸æ¬¡ | RAII + Drop |
| äºå¡ | commit æ rollback | 交æå¼èµæºç®¡ç |
| FFI èµæº | release æ°å¥½ä¸æ¬¡ | èµæºä»¤ç |
é¿å çæ¨¡å¼
| 忍¡å¼ | é®é¢ | æ£ç¡®åæ³ |
|---|---|---|
| Clone å 许å¤å¶ | ç ´å线æ§è¯ä¹ | ä½¿ç¨ move è¯ä¹ |
| Rc/Arc å ±äº« | å¤éææ | 线æ§ä»¤ç |
| æå¨ç®¡ççå½å¨æ | 容æåºé | RAII + Drop |
| è·³è¿ Drop | èµæºæ³æ¼ | ä½¿ç¨ scope API |
ä¸å ¶ä»æè½å ³è
rust-linear-type
â
ââ⺠rust-resource â RAII å Drop å®ç°
ââ⺠rust-ownership â ææææ¨¡å¼
ââ⺠rust-unsafe â åºå±èµæºæä½