在Lua中,您可以通过以下方式创建表:
local t = { 1, 2, 3, 4, 5 }
Run Code Online (Sandbox Code Playgroud)
但是,我想创建一个关联表,我必须按以下方式执行:
local t = {}
t['foo'] = 1
t['bar'] = 2
Run Code Online (Sandbox Code Playgroud)
以下是错误:
local t = { 'foo' = 1, 'bar' = 2 }
Run Code Online (Sandbox Code Playgroud)
有没有办法像我的第一个代码片段那样做?
我无法弄清楚如何让lua做任何常见的计时技巧,比如
sleep - 停止线程上的所有操作
暂停/等待 - 不要继续执行下一个命令,但允许应用程序中的其他代码继续
block - 在当前命令返回之前不要继续执行下一个命令
我读过那个
while os.clock()<time_point do
--nothing
end
Run Code Online (Sandbox Code Playgroud)
吃掉CPU时间.
有什么建议?我缺少一个API调用吗?
更新:我很久以前写过这个问题试图让WOW Lua按计划重播动作(即站立,等待1秒,跳舞,等待2秒,坐下.没有停顿,这些几乎都发生在同一季度. )事实证明,WOW故意禁用了几乎所有允许在时钟上执行操作的内容,因为它可能会破坏游戏或启用机器人.我想要在它被带走后重新创建一个时钟,我必须做一些疯狂的事情,比如创建一个工作数组(有一个动作和执行时间),然后在一堆常见事件上注册一个事件处理程序,比如鼠标移动,然后在偶数处理程序中,处理任何时间已到的动作.事件处理程序实际上不会每X毫秒发生一次,但如果它每隔2-100毫秒发生一次,它就足够接近了.可悲的是,我从未尝试过.
我过去几天一直在玩node.js(nodejs),这太棒了.据我所知,lua没有类似的libev和libio集成,让我们可以避免几乎任何阻塞调用,并以异步方式与网络和文件系统进行交互.
我正在慢慢地将我的java实现移植到nodejs,但是我很震惊luajit比v8 JavaScript快得多并且使用的内存要少得多!
我想在这样的环境中编写我的服务器(非常快速和响应,内存使用率非常低,非常有表现力)将极大地改善我的项目.
作为lua的新手,我只是不确定是否存在这样的事情.我会感激任何指针.
谢谢
我希望这样做
lua prog.lua arg1 arg2
Run Code Online (Sandbox Code Playgroud)
从命令行
在prog.lua里面,我想说,比如说
print (arg1, arg2, '\n')
Run Code Online (Sandbox Code Playgroud)
Lua似乎没有argv [1]等,我看到的处理命令行参数的方法似乎不成熟和/或繁琐.我错过了什么吗?
我正在尝试在Ubuntu 10.4 LTS上安装Lsyncd但我收到一些错误:
> checking for LUA... no checking for
> LUA... no checking for LUA...
> configure: error: Package requirements
> (lua >= 5.1.3) were not met:
>
> No package 'lua' found
>
> Consider adjusting the PKG_CONFIG_PATH
> environment variable if you installed
> software in a non-standard prefix.
>
> Alternatively, you may set the
> environment variables LUA_CFLAGS and
> LUA_LIBS to avoid the need to call
> pkg-config. See the …Run Code Online (Sandbox Code Playgroud) 我完全被Lua的变量范围和函数参数传递(值或引用)搞糊涂了.
请参阅以下代码:
local a = 9 -- since it's define local, should not have func scope
local t = {4,6} -- since it's define local, should not have func scope
function moda(a)
a = 10 -- creates a global var?
end
function modt(t)
t[1] = 7 -- create a global var?
t[2] = 8
end
moda(a)
modt(t)
print(a) -- print 9 (function does not modify the parent variable)
print(t[1]..t[2]) -- print 78 (some how modt is modifying the …Run Code Online (Sandbox Code Playgroud) 这个问题类似于如何在删除键但是明显不同的情况下安全地迭代lua表.
给定一个Lua数组(具有1从中开始的顺序整数的键的表),迭代这个数组并删除一些条目的最佳方法是什么?
我在Lua数组表中有一组带时间戳的条目.条目总是添加到数组的末尾(使用table.insert).
local timestampedEvents = {}
function addEvent( data )
table.insert( timestampedEvents, {getCurrentTime(),data} )
end
Run Code Online (Sandbox Code Playgroud)
我需要偶尔遍历此表(按顺序)并处理并删除某些条目:
function processEventsBefore( timestamp )
for i,stamp in ipairs( timestampedEvents ) do
if stamp[1] <= timestamp then
processEventData( stamp[2] )
table.remove( timestampedEvents, i )
end
end
end
Run Code Online (Sandbox Code Playgroud)
不幸的是,上面的代码方法打破了迭代,跳过了一些条目.有没有比手动走索引更好(更少打字,但仍然安全)的方法:
function processEventsBefore( timestamp )
local i = 1
while i <= #timestampedEvents do -- warning: do not cache the table length
local …Run Code Online (Sandbox Code Playgroud) 我需要找到一个好的Lua到JavaScript转换器; luaforj.org上的lua2js已经过时(大约3年左右,看起来它不适用于Lua 5.1),我还没有在Google上找到任何东西.
有没有人有任何其他转换器的经验?它应该适用于Lua 5.1,最好是基于.NET的,但.NET不是必需的.一个javascript lua解释器也可以工作.
当前选择: lua-jit.令人印象深刻的基准测试,我已经习惯了语法.编写高性能ABI需要仔细考虑如何构建我的C++.
其他感兴趣的问题
背景
我正在研究一个实时高容量(复杂)事件处理系统.我有一个DSL,代表源的事件结构的模式,存储格式,某些特定于域的构造,触发内部事件(构造和驱动通用处理),以及编码始终发生的某些处理步骤.
DSL看起来非常类似于SQL,事实上我使用berkeley db(通过sqlite3接口)来长期存储事件.这里的重要部分是事件处理是基于集合完成的,就像SQL一样.然而,我得出结论,我不应该在DSL中添加通用处理逻辑,而是嵌入lua或lisp来处理这个问题.
处理核心是arround boost :: asio,它是多线程的,rpc是通过协议缓冲区完成的,事件是使用协议缓冲区IO库编码的 - 事件不是使用协议缓冲区对象构建的,它们只使用相同的编码/解码库.我将创建一个包含行的数据集对象,与数据库引擎在内存集中的存储方式非常相似.首先处理DSL中的处理步骤,然后将其呈现给通用处理逻辑.
无论我使用哪种可嵌入的脚本环境,我的处理核心中的每个线程都可能需要它自己的嵌入式语言环境(这就是lua至少在你做多线程工作时需要它的方式).
问题
目前的选择是在lisp ECL和lua之间.请记住,性能和吞吐量是一个强烈要求,这意味着非常需要最小化内存分配:
如果你在我的位置,你会选择哪种语言?
有没有我应该考虑的替代方案(不建议没有可嵌入实现的语言).Javascript v8也许吧?
lisp更适合这个领域吗?我不认为lua和lisp在它们提供的方面有所不同.叫我出去:D
我应该考虑其他任何属性(如下所示)吗?
我断言任何形式的嵌入式数据库IO(请参阅下面的示例DSL以获取上下文)使脚本语言调用在数量级上相形见绌,并且选择这两者不会给总体吞吐量增加太多开销.我是在正确的轨道上吗?:d
期望的属性
我想将我的数据集映射到lisp列表或lua表,我想最小化冗余数据副本.例如,如果两个表具有相同的形状,则从一个数据集向另一个数据集添加行应尝试使用引用语义.
我可以保证在我进行lua/lisp调用时,作为输入传递的数据集不会改变.我希望lua和lisp在可能的情况下强制不改变数据集.
在嵌入式调用结束后,应该销毁数据集,创建的任何引用都需要用副本替换(我猜).
DSL示例
我附上了一个DSL供您观看,这样您就可以了解我想要实现的目标.注意:DSL不显示通用处理.
// Derived Events : NewSession EndSession
NAMESPACE WebEvents
{
SYMBOLTABLE DomainName(TEXT) AS INT4;
SYMBOLTABLE STPageHitId(GUID) AS INT8;
SYMBOLTABLE UrlPair(TEXT hostname ,TEXT scriptname) AS INT4;
SYMBOLTABLE UserAgent(TEXT UserAgent) AS INT4;
EVENT 3:PageInput
{
//------------------------------------------------------------//
REQUIRED 1:PagehitId GUID
REQUIRED 2:Attribute TEXT;
REQUIRED 3:Value TEXT;
FABRRICATED 4:PagehitIdSymbol INT8;
//------------------------------------------------------------// …Run Code Online (Sandbox Code Playgroud) 我想在某些条件下退出Lua脚本的执行.示例:
content = get_content() if not content then -- ( Here i want some kind of exit function ) next_content = get_content() --example there can lot of further checks
在这里我希望如果我没有得到内容我的脚本假设终止是不应该去检查下一个.
lua ×10
c++ ×1
command-line ×1
converter ×1
interactive ×1
interpreter ×1
javascript ×1
libevent ×1
lisp ×1
lua-table ×1
node.js ×1
pkg-config ×1
scope ×1
ubuntu ×1
variables ×1