2012-05-12 43 views
1

这些天我正在处理自己的一个小例子/项目。我正在做的是创建n一组随机字符串可变长度。这是我想要得到的:将随机生成的字符串作为嵌套表插入

  • 长度从3到25个字符的两个名字。
  • 消息范围从40到300个字符。

在我的C例子中,我创建了一个struct并不断插入此表中作为列表。在我的LUA例如,我要一个嵌套表是这样的:

tTableName = { 
    [1] = { 
    "To" = "Name 1", 
    "From" = "Name 2", 
    "Message" = "The first message generated" 
    } 
    [2] = { 
    "To" = "Name 3", 
    "From" = "Name 4", 
    "Message" = "The second message generated" 
    } 
} 

所以,基本上我的结构是这样的:

struct PM { 
    char *sTo, *sFrom, *sMessage; 
} PMs; 

我想在LUA类似的结构/表,以便我可以使用方法table.insert。我目前正在这样做:

tTempTable = { 
    "To" = "Name 1", 
    "From" = "Name 2", 
    "Message" = "The first message generated" 
} 
table.insert(tTableName, tTempTable) 

但我认为这是浪费了大量的处理时间。目前,我只生成这样的PM的样品,例如;但后来我会生成* *其中的一个。请指教。

+2

我不确定你在问什么...你想要什么建议?另外,这些表构造函数不是有效的lua。 – daurnimator

回答

2

我认为在你甚至知道瓶颈在哪里之前,你会陷入早熟的优化代码的陷阱......但是下面的文档包含了大量有关lua的优化信息,包括表格。这个人写的是Lua的首席架构师之一。

http://www.lua.org/gems/sample.pdf

+0

非常感谢那本书。 :) – hjpotter92

1

首先,这是不是一个真正的问题。我猜你在问是否有更高效的方法来做到这一点?一般来说,你想写的清晰度和don't sweat small performance gains at all unless you run into issues.但是这里有一些关于你的代码的笔记,包括关于效率的一些注意事项:

发布的表构造函数无效。以下任一修补程序都可以使用:

tTempTable = { 
    ["To"] = "Name 1", 
    ["From"] = "Name 2", 
    ["Message"] = "The first message generated" 
} 
tTempTable = { 
    To = "Name 1", 
    From = "Name 2", 
    Message = "The first message generated" 
} 

构建数组时不需要指定数字索引。您可以替换此:

tTableName = { 
    [1] = { To = "Name 1", From = "Name 2", Message = "The first message generated" }, 
    [2] = { To = "Name 3", From = "Name 4", Message = "The second message generated" }, 
} 

有了这个,这意味着同样的事情,但更简洁:

tTableName = { 
    { To = "Name 1", From = "Name 2", Message = "The first message generated" }, 
    { To = "Name 3", From = "Name 4", Message = "The second message generated" }, 
} 

这也恰好是更有效的; Lua可以预先分配它需要的数组大小,但它不足以用前面的构造函数来完成。

至于更好的方式来写这个在一般情况下,很难说如果不知道更多关于您的应用程序。如果你只是想测试一些PM代码,为什么不直接在使用时生成你需要的字符串呢?为什么将它们预先分配到表中?

如果您必须预分配,则不必将它们存储为结构化数据。你可以只有三个阵列:ToNames,FromNames,Messages,然后在使用点随机选择:

local to  = ToNames [ math.random(1,#ToNames ) ] 
local from = FromNames[ math.random(1,#FromNames) ] 
local message = Messages [ math.random(1,#Messages) ] 
TestPM(to, from, message) 
+0

感谢您的提示。我也是随机创建消息(他们可能会/也许不会有语法意义,但仍然是句子。我现在将PM作为预先格式化的字符串进行合并,并使用字符串从字符串中提取to/from/message标题'string.find'。谢谢你的链接,以及追加插入的想法。 – hjpotter92

+0

你的关于table.insert的提示实际上是不准确的。如果你没有指定table.insert的索引,插入的默认位置是n + 1,其中n是表格的长度(即结尾)......你可以在lua参考手册中验证它。 –

+0

@Mike Cocoran:对,你是。 – Mud