【问题标题】:Use string indices with colon (lua programming)使用带冒号的字符串索引(lua 编程)
【发布时间】:2018-06-21 06:05:17
【问题描述】:

我正在从在线书籍中学习 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”有什么区别。 背后的诀窍是什么?

【问题讨论】:

  • ("a:", "b")("a", ":b") 这两个对将产生相同的索引。但是您只有一个存储空间:m["a::b"]。那是一次碰撞。
  • 我认为你是对的。歧义问题是关键。

标签: string lua indices colon


【解决方案1】:

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

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

他们描述了一种用字符串做同样事情的方法:“如果索引是字符串,你可以创建一个单一的索引,将两个索引连接起来,中间有一个字符来分隔它们。”符合描述的代码 sn-p 如下所示:

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" 赋值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多