在一些帮助下,我已经能够创建此代码,试图描述一系列数字:
#[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]
在运行时抛出反序列化错误?
答案 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
实现。