繁体   English   中英

在Rust特性中实现构造函数

[英]Implementing constructor function in rust trait

我想定义几种类似的类型struct A(Option),struct B(Option)等,其中浮点值限制在一个范围内。 这些结构的行为可能略有不同,但是每种类型的构造函数都相同:如果值已经受到约束,则返回Some(value),否则返回None。 为了避免必须为每种类型分别实现每个构造函数; 我想在特征中实现它。 这真的不可能吗?

使用下面的内容,我被告知Self不是函数,并且我

不能将Self用作构造函数,必须使用已实现的struct

#[derive(Debug)]
struct A(Option<f64>);

trait Constrained {
    const MIN: f64;
    const MAX: f64;

    fn is_constrained(value: f64) -> bool {
        value >= Self::MIN && value <= Self::MAX
    }

    fn new(value: f64) -> Self where Self: std::marker::Sized {
        if Self::is_constrained(value) {
            Self(Some(value))
        } else {
            Self(None)
        }
    }
}

impl Constrained for A {
    const MIN: f64 = -360.0;
    const MAX: f64 = 360.0;
/*
    fn new(value: f64) -> A {
        if Self::is_constrained(value) {
            Self(Some(value))
        } else {
            Self(None)
        }
    }
*/
}


fn main() {
    let some_val: A = A::new(1000.0);
    println!("{:?}", some_val);
}

注释掉特征中新功能的实现(在where之前开始),并取消对每个单独struct作品的impl的注释,当然,但这会导致每种类型的代码不必要地加倍。 有什么可能或计划将其概括吗?

从您的代码看来,您有几个要求:

  • 实现结构必须为字段Option<f64>提供存储
  • 该实现必须提供两个常量MAX和MIN。

您真正要寻找的是结构上的const泛型。 不幸的是,截至2019年8月,它仍然是一个高度不稳定且不完整的夜间功能。或者,您可以诉诸宏。

derive_more板条箱允许您为每个只包含一个字段的实现结构元组派生From<Option<f64>> 也就是说,您可能需要这样做:

#[derive(From)]
pub struct A(Option<f64>);

// just a blanket impl with two consts

然后,您的特征可以要求实现者也实现From<Option<f64>> ,这是此处所需的构造函数:

pub trait Constrained : From<Option<f64>> {
    const MAX: f64;
    const MIN: f64;

    // Your is_constrained method
    // Use Self::from(None) instead of Self(None)
}

这可以改善您的尝试,因为From可以自动从现有的宏派生(它也是Rust风格的惯用构造函数)。

整个观点是,Rust特性不能对实现者的精确结构施加任何要求。 对于某些实施者来说,拥有另一个未使用(或与Constrained无关)字段也是有效的; 那么你的特质就不够灵活。


旁注:由于特质const项不是很灵活,因此将来也很难传递您的特质。 也许将来您会希望使用宏示例来生成整个definition + impl。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM