Rust结构体fn函数字段实例化时出现编译错误如何解决
报错原因
第一个报错的核心是语法位置错误:Rust中fn关键字只能在item位置(模块、impl块、函数顶层等定义程序条目的位置)用来定义具名函数,不能直接在表达式位置(也就是你给结构体method字段赋值的位置)内联用fn定义函数。编译器在字段赋值处本来期望接收一个值表达式,结果直接读到了fn关键字,就抛出了expected expression, found keyword 'fn'的错误。
你对第二个报错的推测是对的:因为第一个错误导致编译器没有读取到method字段的合法赋值,才连锁触发了「缺失method字段」的报错,不是结构体定义本身的问题。
Rust的隐式类型推断是建立在语法合法的基础上的,你写的内联fn本身不符合Rust表达式语法,类型推断自然没法正常工作。
可行实现方案
你可以选以下两种常用写法完成需求:
方案1:提前定义具名函数,传入函数指针
Rust中具名函数的函数名本身就是匹配签名的fn(T)类型函数指针,可以直接赋值给对应字段:
struct Struct1<T> { method: fn(T) } // 在合法的item位置定义处理函数 fn mock_handle(char: char) { let a = char; } fn main() { let arr_of_structs = [ Struct1 { method: mock_handle // 传入函数名,编译器会自动推断Struct1的泛型T为char类型 } ]; }
方案2:使用无捕获闭包内联实现
如果想要在字段赋值处直接写逻辑,可以用不捕获任何外部变量的闭包,这类闭包可以自动转换为匹配签名的函数指针:
struct Struct1<T> { method: fn(T) } fn main() { let arr_of_structs = [ Struct1 { method: |char: char| { let a = char; } } ]; }
注意:只有完全不捕获外部环境变量的闭包才能转换为裸函数指针。如果闭包捕获了外部变量,无法存入
fn(T)类型的字段,需要改用dyn Fn(T)等带捕获能力的trait对象类型存储。
内容的提问来源于stack exchange,提问作者mwitz
相关产品推荐
相关产品推荐

