Lua

string扩展方法

在阅读源码的过程中,发现strlib给空字符串添加了元表, 如下:

static void createmetatable (lua_State *L) {
  lua_createtable(L, 0, 1);         /* create metatable for strings */     // table
  lua_pushliteral(L, "");           /* dummy string */  // table ""
  lua_pushvalue(L, -2);             // table "" table
  lua_setmetatable(L, -2);          /* set string metatable */ // table "" 
  lua_pop(L, 1);                    /* pop dummy string */ // table
  lua_pushvalue(L, -2);             /* string library... */ // table lib
  lua_setfield(L, -2, "__index");   /* ...is the __index metamethod */ // table["__index"]=lib // table lib
  lua_pop(L, 1);                    /* pop metatable */ // table
}

我们实际上可以直接通过字符串去调用string库的函数 类似于:

local s = "asd"
print(s:len())

--输出为3

而我们自己也可以往其中添加方法:

function test(s)
    print(s)
end

local mt = getmetatable("")
mt["__index"]["print"] = test

local l = "asd"
print(l:print())

--输出为asd

发表评论

邮箱地址不会被公开。 必填项已用*标注