3 个版本
0.1.2 | 2024年7月16日 |
---|---|
0.1.1 | 2023年1月14日 |
0.1.0 | 2023年1月12日 |
在 进程宏 中排名 301
每月下载量 114
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