使用带有冒号的字符串索引(lua 编程)



我正在从一本在线书籍中学习lua编程。它讨论了数组的字符串索引

如果索引是字符串,则可以创建单个索引 将两个索引与中间的字符连接起来以分隔 他们。例如,您可以使用字符串索引 s 和 t 与代码 m[s..':'..t],前提是 S 和 T 都不是 包含冒号(否则,如 ("a:", "b"( 和 ("a", ":b"( 将折叠成单个索引"a::b"(。如有疑问,您可以使用 一个控制字符,如"\0",用于分隔索引。

https://www.lua.org/pil/11.2.html

我不明白索引"a::b"有什么问题。 "a:b"和"a::b"有什么区别。它背后的诀窍是什么?

您链接的文档所描述的是一种在单维表中表示多维矩阵的方法。在举例说明如何使用数字索引执行此操作之后:

mt = {}          -- create the matrix
for i=1,N do
  for j=1,M do
    mt[i*M + j] = 0
  end
end

他们描述了一种对字符串执行相同操作的方法:"如果索引是字符串,则可以创建一个索引,将两个索引连接起来,中间有一个字符来分隔它们。符合描述的代码片段如下所示:

str_idxs = {"foo", "bar", "baz"} -- table of the string indices
mt = {} -- matrix
for 1,N do
  for 1,M do
    mt[str_idxs[N] .. ":" .. str_idxs[M]] = 0
  end
end
print(mt["foo:bar"]) -- 0
print(mt["foo" .. ":" .. "bar"]) -- 0
print(mt["foo::bar"]) -- nil

正如你在这个例子中看到的,":"字符没有什么特别之处,你可以选择任何字符串作为分隔符(包括"::",如果你真的需要的话(。在这种情况下,"foo::bar"之所以错误,是因为您从未给"foo::bar"赋值。

最新更新