#delegates #attributes #field #proc-macro #attr #block

delegate-attr

将方法委托到字段的属性 proc-macro

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

Download history 18514/week @ 2024-04-08 12710/week @ 2024-04-15 10716/week @ 2024-04-22 12576/week @ 2024-04-29 13337/week @ 2024-05-06 18136/week @ 2024-05-13 19699/week @ 2024-05-20 17438/week @ 2024-05-27 25111/week @ 2024-06-03 23840/week @ 2024-06-10 17720/week @ 2024-06-17 15385/week @ 2024-06-24 15035/week @ 2024-07-01 15897/week @ 2024-07-08 15062/week @ 2024-07-15 14443/week @ 2024-07-22

61,571 每月下载量
40 包中使用 (6 直接使用)

MIT 许可证

14KB
192

delegate-attr

CI Crates.io

将属性 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]);

intocall 属性

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