我有一个包装值的结构。例如:
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
结构继承它。但不确定这是否可能。
我确信我在一本锈书或一篇文章中看到过这一点,但我忘记了术语、名称和位置。所以我找不到这个概念。一个不幸的问题是,Wrapped
、unwrap()
和Boxed等在Rust中已经有了意义,这使得搜索变得更加困难。
是的,您可以实现std::ops::Deref
和std::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);
}