Lua &引用;错误:尝试索引本地';自我';(无价值)“;在string.split函数中
简单介绍一下,我从最底层获得了这个函数,并试图在Corona SDK中使用它,尽管我怀疑这是否重要Lua &引用;错误:尝试索引本地';自我';(无价值)“;在string.split函数中,lua,split,coronasdk,Lua,Split,Coronasdk,简单介绍一下,我从最底层获得了这个函数,并试图在Corona SDK中使用它,尽管我怀疑这是否重要 function string:split(sSeparator, nMax, bRegexp) assert(sSeparator ~= '') assert(nMax == nil or nMax >= 1) local aRecord = {} if self:len() > 0 then local bPlain = not
function string:split(sSeparator, nMax, bRegexp)
assert(sSeparator ~= '')
assert(nMax == nil or nMax >= 1)
local aRecord = {}
if self:len() > 0 then
local bPlain = not bRegexp
nMax = nMax or -1
local nField=1 nStart=1
local nFirst,nLast = self:find(sSeparator, nStart, bPlain)
while nFirst and nMax ~= 0 do
aRecord[nField] = self:sub(nStart, nFirst-1)
nField = nField+1
nStart = nLast+1
nFirst,nLast = self:find(sSeparator, nStart, bPlain)
nMax = nMax-1
end
aRecord[nField] = self:sub(nStart)
end
return aRecord
end
输入:“1316982303搜索服务器”
给我标题中的错误。有什么想法吗?我相当肯定这只是功能过时了
编辑:更多的代码
下面是main.lua文件中的更多内容:
multiplayer = pubnub.new({
publish_key = "demo",
subscribe_key = "demo",
secret_key = nil,
ssl = nil, -- ENABLE SSL?
origin = "pubsub.pubnub.com" -- PUBNUB CLOUD ORIGIN
})
multiplayer:subscribe({
channel = "MBPocketChange",
callback = function(msg)
-- MESSAGE RECEIVED!!!
print (msg)
msglist = string.split(msg, ' ')
local recipient = msglist[0] --Get the value
table.remove(msglist, 0) --Remove the value from the table.
local cmdarg = msglist[0]
table.remove(msglist, 0)
arglist = string.split(cmdarg, ',')
local command = arglist[0]
table.remove(arglist, 0)
argCount = 1
while #arglist > 0 do
argname = "arg" .. argCount
_G[argname] = arglist[0]
table.remove(arglist, 0)
argCount = argCount + 1
end
Server.py:
这是向客户端发送必要信息的多人服务器
import sys
import tornado
import os
from Pubnub import Pubnub
## Initiat Class
pubnub = Pubnub( 'demo', 'demo', None, False )
## Subscribe Example
def receive(message) :
test = str(message)
msglist = test.split()
recipient = msglist.pop(0)
msg = msglist.pop(0)
id = msglist.pop(0)
if id != "server":
print id
print msg
commandHandler(msg,id)
return True
def commandHandler(cmd,id):
global needOp
needOp = False
global matchListing
if server is True:
cmdArgList = cmd.split(',')
cmd = cmdArgList.pop(0)
while len(cmdArgList) > 0:
argument = 1
locals()["arg" + str(argument)] = cmdArgList.pop(0)
argument += 1
if cmd == "Seeking":
if needOp != False and needOp != id:
needOp = str(needOp)
id = str(id)
pubnub.publish({
'channel' : 'MBPocketChange',
#Message order is, and should remain:
#----------Recipient, Command,Arguments, Sender
'message' : needOp + " FoundOp," + id + " server"
})
print ("Attempting to match " + id + " with " + needOp + ".")
needOp = False
matchListing[needOp] = id
else:
needOp = id
pubnub.publish({
'channel' : 'MBPocketChange',
#Message order is, and should remain:
#----------Recipient, Command,Arguments, Sender
'message' : id + ' Searching server'
})
print "Finding a match for: " + id
elif cmd == "Confirm":
if matchListing[id] == arg1:
pubnub.publish({
'channel' : 'MBPocketChange',
#Message order is, and should remain:
#----------Recipient, Command,Arguments, Sender
'message' : arg1 + ' FoundCOp,' + id + ' server'
})
matchListing[arg1] = id
else:
pass #Cheater.
elif cmd == "SConfirm":
if matchListing[id] == arg1 and matchListing[arg1] == id:
os.system('python server.py MBPocketChange' + arg1)
#Here, the argument tells both players what room to join.
#The room is created from the first player's ID.
pubnub.publish({
'channel' : 'MBPocketChange',
#Message order is, and should remain:
#----------Recipient, Command,Arguments, Sender
'message' : id + ' GameStart,' + arg1 + ' server'
})
pubnub.publish({
'channel' : 'MBPocketChange',
#Message order is, and should remain:
#----------Recipient, Command,Arguments, Sender
'message' : arg1 + ' GameStart,' + arg1 + ' server'
})
else:
pass #hax
else:
pass
def connected():
pass
try:
channel = sys.argv[1]
server = False
print("Listening for messages on '%s' channel..." % channel)
pubnub.subscribe({
'channel' : channel,
'connect' : connected,
'callback' : receive
})
except:
channel = "MBPocketChange"
server = True
print("Listening for messages on '%s' channel..." % channel)
pubnub.subscribe({
'channel' : channel,
'connect' : connected,
'callback' : receive
})
tornado.ioloop.IOLoop.instance().start()
如果运行以下命令,则会出现此错误消息:
string.split(nil, ' ')
仔细检查您的输入,以确保您确实在传递字符串
编辑:特别是,msglist[0]
不是Lua中数组的第一个位置,Lua数组从1开始
另一方面,这个函数是在您打算使用冒号语法sugar时编写的,例如
msglist=msg:split(' ')
在您定义的普通Lua(而不是Corona SDK)中,它似乎工作得很好
msg=“1316982303搜索服务器”
.Hrm。在科罗纳也是这样。我将在帖子中添加更多代码。我从Pubnub获取输入,但我再次认为这不相关,因为我用type(msg)确认它确实是一个字符串。您确定这是引发此错误的行,而不是string.split(cmdarg,,)
?两者都引发相同的错误,BMitch。我收回这一点。我注释掉了第一行,它仍然给出了两个错误。我现在认为你是对的。这将使解决方案更容易。我可以解决这个问题。非常感谢。我将其更改为sTest=tostring(msg)msglist=sTest:split(“”),但它仍然不起作用。好的,在进行更多实验后,无论出于何种原因,cmdarg=msglist[0],都会使cmdarg为零。我一点也不明白。是的!哇。我在StackOverflow的其他地方得到了这段代码,所以我认为它是正确的。现在一切都很好。
msglist=msg:split(' ')