Json 我是否可以使用类型来表示构造函数至少应该有一个参数?

Json 我是否可以使用类型来表示构造函数至少应该有一个参数?,json,rust,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

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

#[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);
}
#[派生(调试,默认)]
结构包含;
#[派生(调试,默认)]
结构独占;
#[导出(反序列化)]
结构范围(
选项
选项
#[serde(skip)]S,
#[serde(skip)]E,
);
fn main(){
let data=“[1,null]]”;
让rs:Vec=serde_json::from_str(数据)
.预期(“错误”);
println!(“范围从{:?}到{:?}”,rs[0].0,rs[0].1);
}

是否可以通过类型来描述
范围
应该至少有一个绑定,以便
[null,null]
在运行时抛出反序列化错误?

最好对问题进行建模以静态捕获不变量,而不是依赖于运行时检查。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,
);
enum RangeBound{
在(V,V)之间,
下盘(V),
上限(V),
}
结构范围(
游程,
#[serde(skip)]S,
#[serde(skip)]E,
);
如果没有至少一个值,则无法创建
范围绑定


这种方法可能需要一个自定义的
反序列化
实现。

您知道什么是
枚举
吗?您是否尝试过使用自定义的
枚举
而不是一对
选项
?是的,我知道。三个或四个参数怎么样?使用每种可能的排列生成枚举不会缩放。7到97个参数怎么样?只有元素的素数是有效的?不是所有的不变量都可以静态捕获。。。免费的。我的建议是关注当前的情况,并尽可能地解决它;“当未来来临,需求发生变化时,我们将拭目以待。”@MatthieuM。您不会创建一个包含97个参数的构造函数。我认为我所要求的是一个非常合理的要求,如果能够实现,那就太好了。你似乎误解了我问题的本质。我从来没有说过我试图解决这个问题的特殊例子,或者说它应该是两个参数中的一个。我在问一般情况。如果不可能,就说出来并解释原因。这将是一个有效的答案。好吧,我还谈到了静态捕获不变量。在这种情况下,使用enum可能很容易,但是假设有两个以上的参数,其中一个应该存在。