如何在Rust中从Point结构体生成Message枚举实例?
解决Rust中枚举结构体变体的实例化错误
先看定义的代码:
struct Point { x: u8, y: u8, } enum Message { Move { x: u8, y: u8 }, nothing, }
当尝试通过Message::Move(Point { x: 10, y: 15 })生成Message枚举实例时,会触发错误:
error[E0423]: expected function, tuple struct or tuple variant, found struct variant `Message::Move`
错误原因
Message::Move是带命名字段的结构体变体,它要求用结构体初始化的语法(即{ key: value }形式)传入对应字段值,而非元组变体的括号传参方式。
正确的转换方法
方法1:从Point实例提取字段初始化Move变体
如果已有一个Point实例,直接提取它的x和y字段来初始化Message::Move:
let p = Point { x: 10, y: 15 }; let msg = Message::Move { x: p.x, y: p.y };
方法2:直接传入字段值创建Move变体
如果不需要复用Point实例,也可以直接给Move的命名字段赋值:
let msg = Message::Move { x: 10, y: 15 };
方法3:修改枚举定义为元组变体(业务允许时)
如果希望Message::Move能直接接收Point实例,可以把Move改成元组变体:
struct Point { x: u8, y: u8, } enum Message { Move(Point), // 元组变体,接收一个Point类型参数 nothing, } // 此时原调用方式即可正常工作: let msg = Message::Move(Point { x: 10, y: 15 });
内容的提问来源于stack exchange,提问作者altywalty
相关产品推荐
相关产品推荐

