struct - 我可以将元组结构枚举变体转换为常规元组而不是解构和重新创建元组吗?

标签 struct enums rust tuples

我有一个元组结构枚举变体,如下所示:

enum Message {
    ChangeColor(u8, u8, u8),
    // ...
}

稍后,我有一个 match 构造来检测变量是否属于 ChangeColor 子类型。

match message {
    Message::ChangeColor(r, g, b) => self.change_color((r, g, b)),
    // ...
}

change_color 的签名是change_color(&mut self, color: (u8, u8, u8))。有什么方法可以将 message 的值直接传递给 self.change_color ,方法是将其强制转换为等效的元组类型,或者我是否需要解构 message 然后构建一个新的元组传递给 change_color?

我并不关心性能。我读到编译器知道如何直接传递 message 而不是先将值逐字复制到新元组。我更关心人体工程学。我真的必须在那里重复自己并可能输错某些内容并引入错误或错误吗?

最佳答案

我看到有两种方法可以回答这个问题。

  1. 对于编写的enum-定义,您确实需要进行显式解构和随后的元组构造。一个简单的原因:该语言不保证 Message::ChangeColor 中字段的布局与 (u8, u8, u8) 的布局相匹配。因此,从这个角度来看,您不能将 Message::ChangeColor 负载转换成它自己的元组是有道理的。

  2. 如果您真的不想重复解构和重组,并且愿意略微修改您的enum-definition,那么我推荐您像这样定义你的 enum:

enum Message {
   ChangeColor((u8, u8, u8)), // note the extra set of parentheses.
   // ...
}

有了这个,您现在可以匹配枚举包含的元组,并将那个传递给self.change_colorDemo playground code

关于struct - 我可以将元组结构枚举变体转换为常规元组而不是解构和重新创建元组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58884841/

相关文章:

c++ - 结构数组的 typedef,其中一个字符数组作为结构的成员

javascript - 可以从相应的整数值获取字符串值 - 类似于 Enum 但不是 Enum - 用于查找

java - 在另一个枚举的定义中迭代地使用一个枚举

enums - 有没有办法在没有模式匹配的情况下直接访问枚举结构中的字段值?

c++ - 定义结构并用作参数

c++ - 指向结构的指针 vector

c - 如何从 C 函数返回指针?

javascript - 在命名空间中没有静态函数的情况下迭代枚举

error-handling - 当函数没有返回成功值时如何使用 Result?

rust - 具有 &str 和生命周期的索引特征