3 个版本

0.1.2 2024年7月16日
0.1.1 2023年1月14日
0.1.0 2023年1月12日

进程宏 中排名 301

Download history 113/week @ 2024-07-16 1/week @ 2024-07-30

每月下载量 114

MIT/Apache

36KB
817

实现继承的宏

提供 class 以覆盖需要继承的结构体本身、它的实现和需要实现的特征。若要作为可变借用,请参阅 def_as_mut

class

需要包裹结构体及其实现。

使用 #[keep] 以保留原始实现中的方法。

没有 #[keep] 的方法将被放入特征 __XXX__

并且宏将自动生成一个返回 Pin<Box>new 函数。

方法中的表达式将被转换。

而不是使用 self,使用 this

self 将被转换为使用 unsafe { self.__real__.as_ref().unwrap() }

self_mut 将被转换为使用 unsafe { self.__real__.as_mut().unwrap() }

_super 将被转换为使用 self.__prototype__

_super_mut 将被转换为使用 unsafe { self.__prototype__.as_mut().get_unchecked_mut() }

def_as_mut

此宏将定义宏 as_mut

示例

class! {
    struct Example {
        data: String    
    }
    impl Example {
        #[keep]
        fn with() -> Pin<Box<Self>> where Self: Sized {
            Self::new("example".to_string())
        }
        
        fn set_data(&mut self, data: String) {
            this.data = data;
        }

        fn get_data(&self) -> String {
            this.data.clone()
        }
    }
    impl Something for Example {
        //do something
    }
}
class! {
    extends Example;
    struct Sub { }
    impl Sub { }
}

结构体将变为

struct Example {
    __real__: *mut dyn __Example__,
    _pinned: ::std::marker::PhantomPinned,
    data: String
}
struct Sub {
    __prototype__: ::std::pin::Pin<Box<Example>>
    __real__: *mut dyn __Sub__,
    _pinned: ::std::marker::PhantomPinned,
}

借用为可变

def_as_mut!();

fn main() {
    let mut example = Sub::new("data".to_string());
    as_mut!(example).set_data("modified".to_string());
    assert_eq!(example.get_data(), "modified".to_string());
}

依赖项

~1.5MB
~37K SLoC