13 个版本
0.3.0 | 2023 年 9 月 17 日 |
---|---|
0.2.9 | 2020 年 8 月 11 日 |
0.2.7 | 2020 年 6 月 16 日 |
0.2.6 | 2020 年 5 月 24 日 |
0.1.1 | 2020 年 5 月 19 日 |
#3 在 #attr
61,571 每月下载量
在 40 个 包中使用 (6 直接使用)
14KB
192 行
delegate-attr
将属性 proc-macro 委托到字段的方法。
示例
委托 impl
块
use delegate_attr::delegate;
struct Foo(String);
#[delegate(self.0)]
impl Foo {
fn as_str(&self) -> &str {}
fn into_bytes(self) -> Vec<u8> {}
}
let foo = Foo("hello".to_owned());
assert_eq!(foo.as_str(), "hello");
assert_eq!(foo.into_bytes(), b"hello");
委托 trait impl
struct Iter(std::vec::IntoIter<u8>);
#[delegate(self.0)]
impl Iterator for Iter {
type Item = u8;
fn next(&mut self) -> Option<u8> {}
fn count(self) -> usize {}
fn size_hint(&self) -> (usize, Option<usize>) {}
fn last(self) -> Option<u8> {}
}
let iter = Iter(vec![1, 2, 4, 8].into_iter());
assert_eq!(iter.count(), 4);
let iter = Iter(vec![1, 2, 4, 8].into_iter());
assert_eq!(iter.last(), Some(8));
let iter = Iter(vec![1, 2, 4, 8].into_iter());
assert_eq!(iter.sum::<u8>(), 15);
具有更复杂的目标
struct Foo<T> {
inner: RefCell<Vec<T>>,
}
#[delegate(self.inner.borrow())]
impl<T> Foo<T> {
fn len(&self) -> usize {}
}
#[delegate(self.inner.borrow_mut())]
impl<T> Foo<T> {
fn push(&self, value: T) {}
}
#[delegate(self.inner.into_inner())]
impl<T> Foo<T> {
fn into_boxed_slice(self) -> Box<[T]> {}
}
let foo = Foo { inner: RefCell::new(vec![1]) };
assert_eq!(foo.len(), 1);
foo.push(2);
assert_eq!(foo.len(), 2);
assert_eq!(foo.into_boxed_slice().as_ref(), &[1, 2]);
into
和 call
属性
struct Inner;
impl Inner {
pub fn method(&self, num: u32) -> u32 { num }
}
struct Wrapper { inner: Inner }
#[delegate(self.inner)]
impl Wrapper {
// calls method, converts result to u64
#[into]
pub fn method(&self, num: u32) -> u64 {}
// calls method, returns ()
#[call(method)]
pub fn method_noreturn(&self, num: u32) {}
}
委托单个方法
struct Foo<T>(Vec<T>);
impl<T> Foo<T> {
#[delegate(self.0)]
fn len(&self) -> usize {}
}
let foo = Foo(vec![1]);
assert_eq!(foo.len(), 1);
依赖项
~265–720KB
~17K SLoC