2014-11-25 5 views
1

Попытки разрешить каскадную таблицу ссылаться как таковые:Получить определенное значение из каскадной таблицы

local group = table.concat(arguments, ",", 1) 

где аргументы = { «1,1,1»}

В настоящее время, делая group[2] дает мне запятую. Как избежать этого, сохраняя при этом двузначные числа?

(фрагмент из того, что я пытаюсь использовать его для)

for i = 1, #group do target:SetGroup(i, tonumber(group[i])) end

+1

'table.concat' превращает таблицу в строку. Если 'arguments' является таблицей одной строки,' table.concat' не будет делать ничего особенно значимого для вас. –

ответ

0

Может быть, вы хотите что-то вроде

local i = 1 
for v in string.gmatch(s, "(%w+),*") do 
    group[i] = v 
    i = i + 1 
end 

пересмотренной версии в ответ на комментарий, избегая стол в целом:

local i = 1 
for v in string.gmatch(s, "(%w+),*") do 
    target:SetGroup(i, tonumber(v)) 
    i = i + 1 
end 
+0

Я хотел, чтобы цель: функция SetGroup выполнялась столько раз, сколько есть чисел (если она «1,1,1», выполняется 3 раза, каждый раз, когда первый «i» в группе set меняется от 1 до 2 до 3) , Он также будет использовать номера из прилагаемой таблицы. Как бы это реализовать? – Zombine

+0

Код, который я предоставил, создает таблицу из строки. Код в вашем вопросе должен отлично работать с таблицей 'group', которую он создает. Или вы можете вообще отказаться от таблиц с пересмотренной версией. –

0

функция разделения (вы должны добавить ее в код)

split = function(str, delim) 
    if not delim then 
     delim = " " 
    end 
    -- Eliminate bad cases... 
    if string.find(str, delim) == nil then 
     return { str } 
    end 
    local result = {} 
    local pat = "(.-)" .. delim .. "()" 
    local nb = 0 
    local lastPos 
    for part, pos in string.gfind(str, pat) do 
     nb = nb + 1 
     result[nb] = part 
     lastPos = pos 
    end 
    -- Handle the last field 
    result[nb + 1] = string.sub(str, lastPos) 
    return result 
end 

так

local arguments = {"1,1,1"}; 
local group = split(arguments[1], ","); 

for i = 1, #group do 
    target:SetGroup(i, tonumber(group[i])) 
end 

также отметить, что

local arguments = {"1,1,1"}; 
local group = split(arguments[1], ","); 
local group_count = #group; 

for i = 1, group_count do 
    target:SetGroup(i, tonumber(group[i])) 
end 

быстрее код;)

+0

Вторая версия - это не быстрый код. Это может быть даже немного медленнее, потому что у него есть дополнительное назначение для локальной переменной (и есть больше кода для синтаксического анализа/компиляции) ... – siffiejoe

+0

@siffiejoe oh sorry, я, возможно, ошибаюсь на другом языке .. – odie2

Смежные вопросы