句法糖不';t在Lua中的元表声明中工作
我正在尝试向Python中的字符串添加索引。这项工作:句法糖不';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
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