Lua 内部机制:字符串方法如何作为方法工作?
2021-4-9 17:36:28
收藏:0
阅读:215
评论:2
Lua 有一种语法糖,允许实现面向对象方法,当 : 用于 foo:bar(biz) 时,相当于 foo.bar(foo,biz)。然而,我发现标准字符串库也在以这种方式积极使用它:
local a = "a normal string"
local b = a:reverse() -- ????????
print(b)
-- 输出:gnirts lamron a
问题是:这是如何实现的?当你试图假设它扩展为 a.reverse(a) 时,它就会分崩离析,因为 a 是一个字符串,不可能包含键reverse,此外,该语句实际上等价于 string.reverse(a)。我的猜想是它实际上扩展为 _G[type(a)].reverse(a),但是你会记得在文件描述符的 IO 库中也会出现相同的情况...
点赞
用户459640
冒号语法实际上等同于点语法加 self 参数。因此问题是,a.reverse 是如何运作的呢?
字符串库提供了所有函数都在
string表中。它还为字符串设置了一个元表,其中的__index字段指向string表。因此,您可以以面向对象的方式使用字符串函数。例如,string.byte(s,i)可以写成s:byte(i)。
我们可以使用以下代码查看这些元表的详细信息:
local a = "a normal string"
strindex = getmetatable(a).__index
if type(strindex) == "table" then
print "string has metatable entry __index:"
for k,v in pairs(strindex) do
local same = (v == string[k])
print(k, type(v), "same as string."..k..":", same)
end
end
local b = a.reverse(a) -- ????????
print(b)
-- 输出:gnirts lamron a
在线尝试!: 输出结果为
string has metatable entry __index:
rep function same as string.rep: true
byte function same as string.byte: true
sub function same as string.sub: true
char function same as string.char: true
gmatch function same as string.gmatch: true
format function same as string.format: true
reverse function same as string.reverse: true
match function same as string.match: true
dump function same as string.dump: true
len function same as string.len: true
packsize function same as string.packsize: true
find function same as string.find: true
unpack function same as string.unpack: true
upper function same as string.upper: true
pack function same as string.pack: true
lower function same as string.lower: true
gsub function same as string.gsub: true
gnirts lamron a
2021-04-09 17:59:37
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

每个 Lua (5.1 - 5.4) 中的字符串都有一个带有元方法 __index 的元表。
这就是所有字符串函数存在的地方。
这是一个展示它的函数...
-- help() help=function(help) dump(debug.getmetatable(help).__index) end这非常简单,不是吗?
编辑:因为我忘了dump函数:-)...
-- dump(table) dump=function(...) local args={...} local test,dump=pcall(assert,args[1]) if test then for key,value in pairs(dump) do io.write(string.format("%s=%s\n",key,value)) io.flush() end return true else return test,dump end end有一个名为 _VERSION 的字符串-让我们看一下...
>help(_VERSION) reverse = function: 0x565c4870 lower = function: 0x565c4ab0 sub = function: 0x565c7020 byte = function: 0x565c6d30 gsub = function: 0x565c7bb0 char = function: 0x565c4d80 format = function: 0x565c5060 unpack = function: 0x565c62d0 gmatch = function: 0x565c6ee0 dump = function: 0x565c5a90 upper = function: 0x565c47e0 find = function: 0x565c7ba0 len = function: 0x565c44d0 rep = function: 0x565c4900 pack = function: 0x565c66e0 packsize = function: 0x565c61c0 match = function: 0x565c7b90这就是为什么它可以使用“.”和“:”作为方法的原因。