有没有一种特性或模式可以让我配置一个结构,使其行为像它的包装值



我有一个包装值的结构。例如:

struct PageSize {
value: usize
}

我现在想传递它,但要将它当作它的包装值来使用。例如:

let home_size = PageSize { value: 100 }
let about_size = PageSize { value: 200 }
let average = (homesize + about_size) / 2

算术只是一个例子。其他可能分别为length((或hour((。换行字符串或换行DateTime。

有没有一个特性或模式可以让我将任何方法调用转发到它的包装值?这使得算术或逻辑之类的运算符可以在其包装数或布尔值上使用吗?

此外,我想接管";行为;的值。例如通过派生、宏或特征。当前我需要导出或impl Display的位置,以便显示:

#[derive(Display)]
#[display(fmt = "{} bytes", value)]
struct PageSize {
value: usize
}
println!("size: {}", PageSize { value: 100 });

我更愿意配置我的结构,以便它从包装的值继承这种行为。当包装的值可以是Debug、PartialEq、Display等时,我希望我的PageSize结构继承它。但不确定这是否可能。

我确信我在一本锈书或一篇文章中看到过这一点,但我忘记了术语、名称和位置。所以我找不到这个概念。一个不幸的问题是,Wrappedunwrap()和Boxed等在Rust中已经有了意义,这使得搜索变得更加困难。

是的,您可以实现std::ops::Derefstd::ops::DerefMut,这是deref 的文档

它在Rust中被称为Newtype Pattern。

pub struct Bar(Foo);

使用derive_more:效果更佳

use derive_more::{Add, Display, Div};
#[derive(Debug, PartialEq, Display, Add, Div)]
#[display(fmt = "{} bytes", .0)]
pub struct PageSize(usize);
fn main() {
let avg = (PageSize(1) + PageSize(2)) / 2;
println!("{}", avg);
}

最新更新