我不想检查类型是否具有某种特征,但是我希望能够区分结构和整数。由于结构体和整数都可以实现相同的特征,因此我不知道如何区分它们。
之所以要这样做,是因为我正在使用serde_json将泛型类型转换为JSON,但我只希望将其转换为JSON Object(在它为结构时发生),但不应将其转换为其他任何内容(例如JSON I64)。由于结构和整数都可以实现Serialize特征,因此无法区分它们。
目前,我让进程感到恐慌是因为它不是可以从中恢复的错误,但是由于我可能在编译时就知道这一点,所以我想知道在编译阶段是否有任何机制可以确定类型。
我想知道如何区分类型的“种类”而不是特征。
即使您设法在编译时比较类型,也无法阻止 astruct被序列化为Json::I64. 它的Serialize实现可以是任何东西!我可以想到一些部分解决方案:
添加运行时检查以查看结果是否确实是Json::Object按模式匹配。如果您希望这始终为真,您可以将其与断言结合起来。我想这就是你现在正在做的事情。
创造一个新的特质是可能的:
trait SerializeAsObject : Serialize {}
Run Code Online (Sandbox Code Playgroud)
然后,您只需为那些您确定将被序列化为对象的数据类型实现。但是,没有什么可以阻止您实现 的特征i64,因此这里仍然存在出错的空间。
您可能需要一个支持依赖类型的类型系统,以确保数据类型的序列化始终产生给定类型的输出。据我所知,这样的类型系统非常复杂,以至于没有广泛使用的语言支持它(如果你想了解更多信息,可以看看Idris )。
虽然进行编译时检查固然很好,但编译器只能做到这一点。根据我的经验,在现实世界的编程中使用依赖类型并不值得这么麻烦。例如,在这种情况下,您需要提供数学证明,以便编译器可以理解 的实现Serialize始终会导致对象的序列化。
即使如此,也无法确保程序没有错误!因此,我认为在这种情况下,正确的做法是使用断言,记录在数据无法序列化为对象的情况下您的函数将出现恐慌,并编写单元测试以确保正确调用它。