Zig中向哈希表存结构体方法报错:parser.Parser无parseIdentifier字段
Zig结构体方法存入哈希表报错的解决办法
问题描述
在Zig 0.15.0版本开发项目时,尝试将Parser结构体内部定义的parseIdentifier方法存入哈希表时触发错误,报错代码行:
try p.nud_handlers.put(Tokens.IDENT, p.parseIdentifier);
对应的错误信息:
error: parser.zig:102:48: error: no field named 'parseIdentifier' in struct 'parser.Parser'
已尝试两种方案:将函数移至结构体外部(可行,但希望保留内部定义);在非init函数中添加哈希表项(无效,仍报相同错误)。
相关核心代码:
const NudParseFn = *const fn (*Parser) *AST.Expression; const LedParseFn = *const fn (*Parser, *AST.Expression) *AST.Expression; pub const Parser = struct { lexer: *Lexer, cur_token: Token = undefined, peek_token: Token = undefined, nud_handlers: std.AutoHashMap(Tokens, NudParseFn) = undefined, led_handlers: std.AutoHashMap(Tokens, LedParseFn) = undefined, pub fn init(lexer: *Lexer) !Parser { var parser: Parser = Parser{ .lexer = lexer }; parser.nud_handlers = std.AutoHashMap(Tokens, NudParseFn).init(std.heap.page_allocator); parser.led_handlers = std.AutoHashMap(Tokens, LedParseFn).init(std.heap.page_allocator); // ... 其他代码 try parser.nud_handlers.put(Tokens.IDENT, parser.parseIdentifier); // 错误发生位置 return parser; } pub fn parseIdentifier(p: *Parser) *AST.Expression { return &AST.Expression{ .identifier_expr = AST.Identifier{ .token = p.cur_token, .literal = p.cur_token.literal } }; } // 其他定义... }
问题原因
Zig中,结构体的成员函数(pub fn)并非结构体实例的字段,而是属于结构体类型本身的关联函数。用p.parseIdentifier的方式试图从实例访问方法,相当于查找实例的字段,自然会提示不存在该字段。
解决方法
直接通过结构体类型获取方法的函数指针,将报错行的parser.parseIdentifier替换为Parser.parseIdentifier即可:
修改后的init函数关键代码:
pub fn init(lexer: *Lexer) !Parser { var parser: Parser = Parser{ .lexer = lexer }; parser.nud_handlers = std.AutoHashMap(Tokens, NudParseFn).init(std.heap.page_allocator); parser.led_handlers = std.AutoHashMap(Tokens, LedParseFn).init(std.heap.page_allocator); // ... 其他代码 try parser.nud_handlers.put(Tokens.IDENT, Parser.parseIdentifier); // 改为通过结构体类型访问方法 return parser; }
补充说明
Zig的结构体方法本质是语法糖,Parser.parseIdentifier(p)和直接调用外部定义的parseIdentifier(p)逻辑等价,方法的函数指针直接绑定到结构体类型上,而非实例。因此只要通过结构体名.方法名,就能获取到符合NudParseFn类型定义的函数指针。
内容的提问来源于stack exchange,提问作者fabinho
相关产品推荐
相关产品推荐

