2011-09-25 56 views
0

简单的事实,我从底部的http://lua-users.org/wiki/SplitJoin获得了此函数,并且正试图在Corona SDK中使用它,尽管我怀疑这很重要。“错误:尝试在string.split函数中索引本地'self'(一个零值)”

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搜索服务器”

msglist = string.split(msg, ' ') 

让我在标题中错误。有任何想法吗?我相当肯定它只是功能已过时。

编辑:很多更多的代码 这里的一些从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() 
+0

它似乎在你定义'msg =“1316982303搜索服务器”'纯Lua(而不是电晕SDK)中工作正常。 – lhf

+0

Hrm。它在科罗娜也是这样工作的。我会在帖子中添加更多代码。我从Pubnub获得输入,但是我不认为它是相关的,因为我使用type(msg)确认它确实是一个字符串。 –

+0

你确定这是引发这个错误的行而不是'string.split(cmdarg,',')'? – BMitch

回答

2

此错误消息发生,如果您运行:

string.split(nil, ' ') 

仔细检查您输入,以确保你真的传递一个字符串。

编辑:特别是,msglist[0]不是在Lua数组中的第一位置时,lua阵从1开始

顺便说一句,该功能被写时,你应该使用结肠句法的意图糖,例如

msglist=msg:split(' ') 
+0

我将其更改为 sTest = tostring(msg) msglist = sTest:split('') 并且它仍然不起作用。 –

+0

好吧,经过一些更多的实验后,无论出于何种原因,cmdarg = msglist [0],都会使cmdarg为零。我根本不懂。 –

+2

哦,我看到你的错误。 Array在Lua中从1开始,而不是0. – BMitch

相关问题