Lua中自定义string方法可正常调用但table方法调用报错的原因是什么
Lua 自定义string方法可直接调用、table方法无法通过实例调用的原因
核心原因是Lua对字符串和普通表的默认元表配置存在差异:
- 字符串的默认元表预设了
__index指向全局string表
Lua中所有字符串共享同一个默认元表,该元表的__index元方法默认被设置为string全局表。当你使用冒号调用字符串实例的方法时,如果字符串本身没有对应键,就会自动顺着__index到string表中查找,所以你给string.testfunc赋值后,所有字符串实例都可以直接通过冒号调用该方法。 - 普通表默认没有配置指向
table表的查找逻辑
Lua中新创建的普通表默认没有绑定元表,就算你手动绑定元表,默认也不会把__index指向全局table表。当你调用a:testfunc()时,Lua首先在a自身的键中查找testfunc,找不到的情况下因为没有配置__index查找路径,自然就会报method 'testfunc' is not callable (a nil value)的错误。
如果你想要让表实例也可以直接调用table表中的方法,可以手动给表设置元表,示例如下:
table.testfunc = function(s) print(s[1]) end a = {1,2} -- 给a设置元表,找不到的键自动去全局table表中查找 setmetatable(a, {__index = table}) a:testfunc() -- 正常输出 1
注意不建议全局修改所有表的元表配置,会导致不可预期的全局污染问题。
内容的提问来源于stack exchange,提问作者CrazyAmphibian
相关产品推荐
相关产品推荐

