Lua中已定义__lt元方法但table.sort对Tile类实例排序时失效并报错的问题咨询
Lua中已定义__lt元方法但table.sort对Tile类实例排序时失效并报错的问题咨询
嘿,我来帮你拆解这个问题!你遇到的核心问题其实是类继承的元表设置逻辑错误,导致table.sort找不到__lt元方法,进而抛出“comparing two tables”的报错。
问题根源:错误的类定义方式
你把Map_Tile定义成了Entity的一个实例(local Map_Tile = Entity:New()),而不是一个继承自Entity的类表。这种写法会让后续创建的Tile实例的元表链断裂,Lua无法找到Entity中定义的__lt元方法:
- 当你执行
Map_Tile = Entity:New()时,Map_Tile本质是一个Entity实例,它的元表是Entity类本身。 - 在
Map_Tile:New方法里,你把新创建的map_tile的元表设置为self(也就是这个Map_Tile实例)。 - Lua查找元方法时,只会直接检查当前操作数的直接元表,不会递归查找元表的元表。所以当比较两个
Tile实例时,Lua会去它们的元表(Map_Tile实例)里找__lt,但这个实例本身没有__lt字段(__lt定义在Entity类上),因此找不到元方法,最终触发报错。
修复方案:修正类继承的元表逻辑
你需要把Map_Tile改成正确的类继承模式,而不是用Entity:New()创建类:
修改后的Tile类代码
local Entity = require "entity" -- 1. 创建Map_Tile类表,而非Entity实例 local Map_Tile = {} -- 2. 设置Map_Tile的元表,让它继承Entity的方法 setmetatable(Map_Tile, {__index = Entity}) -- 3. 让Map_Tile实例的元表指向自己,确保实例能访问类的方法 Map_Tile.__index = Map_Tile function Map_Tile:New(pos, tile_type, gid) -- 创建Entity实例作为基础 local map_tile = Entity:New(pos) map_tile.entity_type = "map_tile" -- 把实例的元表设为Map_Tile类 setmetatable(map_tile, self) return map_tile end -- 4. 显式定义Map_Tile的__lt元方法,复用Entity的比较逻辑 function Map_Tile.__lt(a, b) return Entity.__lt(a, b) end return Map_Tile
修复逻辑说明
Map_Tile现在是一个真正的类表,通过元表继承了Entity的所有方法。- 每个
Tile实例的元表是Map_Tile类,而Map_Tile类显式定义了__lt元方法,直接复用Entity的比较逻辑。这样table.sort在比较时就能找到对应的元方法,不会再报错。
另外,你提到直接给table.sort传自定义比较函数能正常工作,这是因为此时跳过了元方法的查找流程,直接使用你提供的函数进行比较,自然不会有元表查找的问题。
备注:内容来源于stack exchange,提问作者Aidan Habedank
相关产品推荐
相关产品推荐

