gpt4 book ai didi

rust - 匹配来自外部库的依赖于版本的枚举值

转载 作者:行者123 更新时间:2023-12-03 11:37:06 25 4
gpt4 key购买 nike

TLDR:在 match语句,是否可以显式处理 enum可能不存在的变体? (由于不同的外部库版本)
我正在为使用 match 的库编写一些代码。语句来处理来自不同库的对象的转换。
该对象来自 geo-types图书馆,其中一个 geo_types::Geometry可以表示几种类型的对象之一:

pub enum Geometry<T> 
where
T: CoordinateType,
{
Point(Point<T>),
Line(Line<T>),
LineString(LineString<T>),
Polygon(Polygon<T>),
[...]
}
(这些结构中的每一个都在 geo-types 的其他地方定义)
这个其他库( shapefile )实现了 TryFrom特征转换某些 geo_types::Geometry变体变成图书馆自己的变体 shapefile::Shape ,这是一个类似的枚举:
pub enum Shape {
Point(Point),
Polyline(Polyline),
Polygon(Polygon),
[...]
}
转换是在其他特征中完成的,所以 try_from()函数基本上尝试匹配匹配 block 中每个枚举的兼容变体。尽一切可能 geo_types::Geometry变体与 Shape 显式匹配变体。
match geometry {
geo_types::Geometry::Point(point) => Ok(Shape::Point(point.into())),
geo_types::Geometry::Line(line) => Ok(Shape::Line(line.into())),
[...]
}
但在 geo-types 的 0.6.0 版中, Geometry 有 2 个新变体枚举介绍: RectTriangle .那 match现在的语句将无法编译:
error[E0004]: non-exhaustive patterns: `Rect(_)` and `Triangle(_)` not covered
--> src/record/mod.rs:464:15
|
464 | match geometry {
| ^^^^^^^^ patterns `Rect(_)` and `Triangle(_)` not covered
|
::: /home/roger/.cargo/registry/src/github.com-1ecc6299db9ec823/geo-types-0.6.0/src/geometry.rs:39:5
|
39 | Rect(Rect<T>),
| ---- not covered
40 | Triangle(Triangle<T>),
| -------- not covered
|
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
= note: the matched value is of type `geo_types::Geometry<f64>`
我不能明确地处理这些,否则我会破坏与旧版本 geo-types 的兼容性:
error[E0599]: no variant or associated item named `Rect` found for enum `geo_types::Geometry<_>` in the current scope
--> src/record/mod.rs:479:34
|
479 | geo_types::Geometry::Rect(_) => {
| ^^^^ variant or associated item not found in `geo_types::Geometry<_>`
我可以进行通配符匹配 _ => { Err("Unrecognized Geometry") } ,它可以为 geo-types 的新版本和旧版本编译,尽管如果您尝试使用旧版本的 geo-types 进行编译,它确实会发出警告:
warning: unreachable pattern
--> src/record/mod.rs:480:13
|
480 | _ => { // New geometries Rect(_) and Triangle(_) added in 0.6.0
| ^
|
= note: `#[warn(unreachable_patterns)]` on by default
但我可以用 #[allow(unreachable_patterns)] 注释.这暂时有效,但抑制警告似乎是一种不好的代码气味。此外,似乎实现了 Rect 的转换。或 Triangle将需要破坏与 geo-types 的某些版本的兼容性(这反过来又破坏了与其他依赖 geo-types 的地理库的兼容性)。
有没有办法以不依赖于它们存在的方式选择性地处理这些新的枚举变体?

最佳答案

回答你的问题:不,它不是,至少不是没有像基于版本的 conditional compilation 那样原始和 finnicky 的东西。 (这甚至可能是不可能的)。您可以尝试一些花哨的枚举判别相关魔法(无论如何它可能只适用于无字段枚举),但这不值得。
解决您的问题:您最好不要担心维护与旧版本 geo-types 的兼容性。 , 至少现在。
一般来说,一个特定版本的库与依赖项的多个主要版本兼容是不明智的(而且通常是不可能的,正如您的问题所表明的那样),因为每个主要版本都应该引入向后不兼容的更改。这就是为什么库通常会针对其依赖项中的每个主要版本增加主要版本——那些使用特定主要版本的依赖项将使用相应的库的主要版本。
鉴于 geo-types API 尚未稳定(主要版本仍为 0),任何版本都可能引入向后不兼容的更改。试图支持这些变化中的每一个都是不值得的。例如,geo-types 很可能有多个版本。在 Geometry 中引入了一个新变体枚举——你会尝试对你的代码进行猴子补丁以支持这些版本中的每一个吗?
因此,您最好的选择是只支持最新版本。与开发版本一样,其他版本使用 geo-types库很可能会使用最新版本的 geo-types ;如果没有,他们可以使用支持他们的 geo-types 的库版本。版本。就向后兼容性而言,您不需要对不稳定的 API 做太多事情——只有当公共(public) API 稳定时,您才真正需要为每个主要版本的 geo-types 发布和支持库的多个主要版本。 .

关于rust - 匹配来自外部库的依赖于版本的枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63222027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com