lua脚本碰到的问题
大约 3 分钟

xss@ubuntu:~$ vim ~/.bashrc xss@ubuntu:~$ source ~/.bashrc
-- 获取当前脚本所在路径
local script_path = debug.getinfo(1, 'S').source:match[[^@?(.*[\/])[^\/]-$]]
-- 将当前路径添加到 package.path 中
package.path = script_path .. "?.lua;" .. package.
-- 获取当前脚本所在路径
local script_path = debug.getinfo(1, 'S').source:match[[^@?(.*[\/])[^\/]-$]]
-- 将当前路径添加到 package.path 中
package.path = script_path .. "?.lua;" .. package.path

让我们逐步解释你提供的元表(Metatable)的例子:
-- 示例 1: 使用元表设置和获取
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable, mymetatable) -- 把 mymetatable 设为 mytable 的元表
-- 或者可以写成一行
mytable = setmetatable({}, {})
这段代码创建了一个普通的表 mytable
和一个空的元表 mymetatable
,然后通过 setmetatable
函数将元表关联到表上。现在,mytable
的元表就是 mymetatable
。
-- 示例 2: 查看对象的元表
getmetatable(mytable) -- 这回返回 mymetatable
这段代码使用 getmetatable
函数查看表 mytable
的元表,返回的结果应该是 mymetatable
。
-- 示例 3: __index 元方法
other = { foo = 3 }
t = setmetatable({}, { __index = other })
t.foo
-- 输出: 3
-- 因为 t 表中没有 foo 键,通过 __index 元方法查找到了元表 other 中的 foo 值
t.bar
-- 输出: nil
-- 因为 t 表和元表 other 都没有 bar 键,返回 nil
这里创建了一个表 other
,并将其作为元表的 __index
元方法关联到表 t
上。当你访问 t.foo
时,Lua 首先在表 t
中查找,然后根据元表的 __index
元方法找到了 other
表中的 foo
值。当访问 t.bar
时,由于 t
和其元表都没有 bar
键,返回 nil
。
-- 示例 4: __newindex 元方法
mymetatable = {}
mytable = setmetatable({key1 = "value1"}, { __newindex = mymetatable })
mytable.key1
-- 输出: value1
-- 通过 __newindex 元方法对已存在键进行访问
mytable.newkey = "新值2"
-- 输出: 新值2
-- 通过 __newindex 元方法对新键进行赋值,而不进行实际赋值操作
mytable.key1 = "新值1"
-- 输出: 新值1
-- 对已存在键进行赋值,而不调用 __newindex 元方法
这里创建了一个表 mytable
并将其元表 mymetatable
中的 __newindex
元方法关联到表 mytable
上。当对已存在的键 key1
进行访问时,直接返回该键的值。当对新键 newkey
进行赋值时,通过元方法 __newindex
进行处理而不实际进行赋值操作。当对已存在键 key1
进行赋值时,由于已存在键,直接进行赋值操作而不调用元方法。
这些示例展示了元表在 Lua 中的基本用法,包括 __index
、__newindex
元方法以及元表的设置和获取。这些功能可以用于实现一些高级的表操作和定制化的行为。
Loading...