Lua &引用;错误:尝试索引本地';自我';(无价值)“;在string.split函数中

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

简单介绍一下,我从最底层获得了这个函数,并试图在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 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(' ')