2016-10-12 8 views
3

Я переменный следующийLooping над значениями массива в Lua

local armies = { 
    [1] = "ARMY_1", 
    [2] = "ARMY_3", 
    [3] = "ARMY_6", 
    [4] = "ARMY_7", 
} 

Теперь я хочу, чтобы выполнить действие для каждого значения. Каков наилучший способ перебрать значения? Типичная вещь, которую я нахожу в интернете это:

for i, armyName in pairs(armies) do 
    doStuffWithArmyName(armyName) 
end 

мне не нравится, что, как это приводит к неиспользуемой переменной i. Следующий подход позволяет избежать этого и является то, что я в настоящее время с помощью:

for i in pairs(armies) do 
    doStuffWithArmyName(armies[i]) 
end 

Однако это еще не читаемыми и просто, как хотелось бы, так как это итерация над клавишами, а затем получить значение с помощью клавиши (весьма императивно). Другое преимущество, которое у меня есть с обоими подходами, заключается в том, что требуется pairs. Значение, зацикливаемое здесь, - это тот, который я контролирую, и я бы предпочел, чтобы его можно было зациклировать как можно проще.

Есть ли лучший способ сделать такой цикл, если я только забочусь о значениях? Есть ли способ решить перечисленные проблемы?

Я использую Lua 5.0 (и я совершенно новой для языка)

+0

Независимо от того, что вы делаете (даже с помощью пользовательского итератора) индекс должен быть сохранен * где *, а не потому, что ** ВЫ ** нуждаетесь в этом, но потому, что итератор делает. – warspyking

ответ

9

идиоматических способ перебрать массив является:

for _, armyName in ipairs(armies) do 
    doStuffWithArmyName(armyName) 
end 

Обратите внимание, что:

  1. Использование ipairs over pairs для массивов
  2. Если ключ не является тем, что вас интересует, используйте _ в качестве заполнителя.

Если по какой-то причине, что _ заполнителя до сих пор относится к вам, сделать свой собственный итератор. Программирование в Lua предоставляет его в качестве примера:

function values(t) 
    local i = 0 
    return function() i = i + 1; return t[i] end 
end 

Использование:

for v in values(armies) do 
    print(v) 
end 

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

  • Нет связанных вопросов^_^