我可以使用类型来表达至少一个参数应该是构造函数的一些吗?

时间:2017-09-28 14:27:21

标签: json rust

在一些帮助下,我已经能够创建此代码,试图描述一系列数字:

#[derive(Debug, Default)]
struct Inclusive;
#[derive(Debug, Default)]
struct Exclusive;

#[derive(Deserialize)]
struct Range<S, E, V: Ord>(
    Option<V>,
    Option<V>,
    #[serde(skip)] S,
    #[serde(skip)] E,
);


fn main () {
    let data = "[[1, null]]";
    let rs: Vec<Range<Inclusive, Exclusive, i32>> = serde_json::from_str(data)
         .expect("Error");
    println!("Range from {:?} to {:?}", rs[0].0, rs[0].1);
}

是否有可能描述Range至少应有一个绑定的类型,以便[null, null]在运行时抛出反序列化错误?

1 个答案:

答案 0 :(得分:2)

最好将问题建模为静态捕获不变量,而不是依赖于运行时检查。 Matthieu关于使用enum的建议可能如下所示:

enum RangeBound<V> {
    Between(V, V),
    LowerBounded(V),
    UpperBounded(V),
}

struct Range<S, E, V: Ord>(
    RangeBound<V>,
    #[serde(skip)] S,
    #[serde(skip)] E,
);

如果没有至少一个值,则无法创建RangeBound

这种方法可能需要自定义Deserialize实现。