Vec元组在match模式中需使用turbofish语法的解决方法
解决Rust match模式中的泛型参数语法问题
你的问题出在模式匹配中不能直接用带尖括号泛型参数的类型作为匹配模式,Rust要求在模式中指定泛型类型时必须使用turbofish语法(::<>),且需要结合模式绑定或通配符的形式书写。
修正后的代码如下:
async fn get_product_data(product_id: Uuid) -> () { let product_with_skus: Vec<(product::Model, Vec<sku::Model>)> = Product::find_by_id(product_id) .find_with_related(Sku) .all(&*DB) .await .unwrap(); match product_with_skus { // 使用turbofish语法指定泛型参数,同时绑定变量 prd_skus: Vec::<(product::Model, Vec::<sku::Model>)> => "prd".to_string(), _ => "trt".to_string(), }; }
如果不需要绑定变量,也可以用通配符简化:
match product_with_skus { _: Vec::<(product::Model, Vec::<sku::Model>)> => "prd".to_string(), _ => "trt".to_string(), };
为什么原写法无效?
Rust的模式匹配语法中,Vec<...>会被解析为尝试解构Vec的内部结构(类似[x, y]的数组模式),而非指定类型。要在模式中明确标注泛型类型,必须通过变量: 类型的形式,同时用turbofish(::<>)标记泛型参数,避免和模式中的解构语法混淆。
注意:由于
product_with_skus的类型已被明确标注,第一个匹配分支会覆盖所有可能情况,第二个分支永远不会执行。如果你的真实需求是区分空/非空Vec,可改用解构模式:[..]匹配非空、[]匹配空,但这是额外补充,完全遵循你不更改逻辑的要求。
内容的提问来源于stack exchange,提问作者Peter Vajda
相关产品推荐
相关产品推荐

