Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
句法糖不';t在Lua中的元表声明中工作_Lua_Lua Table - Fatal编程技术网

句法糖不';t在Lua中的元表声明中工作

句法糖不';t在Lua中的元表声明中工作,lua,lua-table,Lua,Lua Table,我正在尝试向Python中的字符串添加索引。这项工作: getmetatable('').__index = function(str, i) return string.sub(str, i, i) end str1 = 'hello' print(str1[1]) 这并不是: getmetatable('').__index = function(str, i) return str:sub(i, i) end 给出了以下错误: lua: test.lua:1: C stack

我正在尝试向Python中的字符串添加索引。这项工作:

getmetatable('').__index = function(str, i) return string.sub(str, i, i) end

str1 = 'hello'    
print(str1[1])
这并不是:

getmetatable('').__index = function(str, i) return str:sub(i, i) end
给出了以下错误:

lua: test.lua:1: C stack overflow
stack traceback:
    test.lua:1: in function '__index'
    test.lua:1: in function '__index'
    ...
    test.lua:1: in function '__index'
    test.lua:4: in main chunk
    [C]: in ?

有什么循环发生吗?为什么?

str:method快捷方式通过
\uu索引
工作。通过重新定义
\u索引
,您打破了这一点

从5.2或5.3开始,Lua为字符串定义了一个元表,大致如下

debug.setmetatable( "", { __index = string } )
允许写入
(“foo”):sub(i,j)


现在你过来说

getmetatable('').__index = function(str, i) return str:sub(i, i) end
因此,如果你说
(“foo”)[2]
,那就调用
\uu索引(“foo”,2)
,在这里面会导致查找
(“foo”)[“sub”]
(在
str:sub(i,i)
)。这将调用
\uu索引(“foo”,“sub”)
,并在其内部导致查找
(“foo”)[“sub”]
(在
str:sub(i,i)
)。这将调用
\u索引(“foo”、“sub”)
,并

…并且堆栈溢出,因为您将永远查找
(“foo”)[“sub”]


重新定义
\u index
的方式意味着您不能再使用该快捷方式,这意味着您要么必须拼写
string.method
,而不是在代码、库代码中的任何地方使用
str:method
,要么保持它的兼容性

字符索引仅对数字有意义,因此您可以通过以下方式同时获得

getmetatable( "" ).__index = function( str, k )
    if type( k ) ~= "number" then  return string[k]  end -- lookup in string.*
    return str:sub( k, k )
end

这将仅调用数值索引的
string.sub
。方法名称是字符串,因此它们仍将在
string
中查找
str:Method
快捷方式通过
\uu索引
工作。通过重新定义
\u索引
,您打破了这一点

从5.2或5.3开始,Lua为字符串定义了一个元表,大致如下

debug.setmetatable( "", { __index = string } )
允许写入
(“foo”):sub(i,j)


现在你过来说

getmetatable('').__index = function(str, i) return str:sub(i, i) end
因此,如果你说
(“foo”)[2]
,那就调用
\uu索引(“foo”,2)
,在这里面会导致查找
(“foo”)[“sub”]
(在
str:sub(i,i)
)。这将调用
\uu索引(“foo”,“sub”)
,并在其内部导致查找
(“foo”)[“sub”]
(在
str:sub(i,i)
)。这将调用
\u索引(“foo”、“sub”)
,并

…并且堆栈溢出,因为您将永远查找
(“foo”)[“sub”]


重新定义
\u index
的方式意味着您不能再使用该快捷方式,这意味着您要么必须拼写
string.method
,而不是在代码、库代码中的任何地方使用
str:method
,要么保持它的兼容性

字符索引仅对数字有意义,因此您可以通过以下方式同时获得

getmetatable( "" ).__index = function( str, k )
    if type( k ) ~= "number" then  return string[k]  end -- lookup in string.*
    return str:sub( k, k )
end
这将仅调用数值索引的
string.sub
。方法名称是字符串,因此它们仍将在
string

getmetatable(“”)中查找。\uu index=function(str,i)返回字符串[i]或str:sub(i,i)end
getmetatable(“”)。\uu index=function(str,i)返回字符串[i]或str:sub(i,i)end