Lua'da Loop için


87

Benim görevim, for döngüsünün nasıl yapılacağı. Rakamlarla çözdüm ama isimlerle çözemiyorum. Bir isim listesi çalıştıran bir for döngüsü oluşturmak istiyorum. Şu ana kadar sahip olduğum şey şu:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

Başka şeyler denedim ama işe yaramıyor, terminal her zaman sadece 1, 2, 3'ü listeliyor ... Neyi yanlış yapıyorum?

Yanıtlar:


204

Senin sorunun basit:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

Bu kod ilk olarak adlı global bir değişkeni bildirir names. Ardından, bir for döngüsü başlatırsınız. For döngüsü , sadece çağrılacak olan yerel bir değişken bildirir names; bir değişkenin daha önce ile tanımlanmış namesolması tamamen konu dışıdır. namesFor döngüsünün herhangi bir kullanımı , global olana değil yerel olana atıfta bulunacaktır .

For döngüsü, döngünün iç kısmının names = 1, sonra names = 2ve sonunda ile çağrılacağını söyler names = 3. For döngüsü , ilk sayıdan sonuncuya kadar sayan bir sayaç bildirir ve saydığı her değer için iç kodu bir kez çağırır.

Aslında istediğin şey şuydu:

names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
  print (names[nameCount])
end

[] Sözdizimi, bir Lua tablosunun üyelerine nasıl eriştiğinizdir. Lua tabloları "anahtarları" "değerler" ile eşler. Diziniz otomatik olarak artan tamsayı türünde anahtarlar oluşturur. Yani tablodaki "Joe" ile ilişkili anahtar 2'dir (Lua endeksleri her zaman 1'den başlar).

Bu nedenle, aldığınız 1'den 3'e kadar sayılan bir for döngüsüne ihtiyacınız var. Öğeye tablodan erişmek için count değişkenini kullanırsınız.

Ancak bunun bir kusuru var. Listedeki öğelerden birini kaldırırsanız ne olur?

names = {'John', 'Joe'}
for nameCount = 1, 3 do
  print (names[nameCount])
end

Şimdi anlıyoruz John Joe nil, çünkü var olmayan bir tablodan değerlere erişmeye çalışmak sonuçlanır nil. Bunu önlemek için 1'den tablonun uzunluğuna kadar saymamız gerekir:

names = {'John', 'Joe'}
for nameCount = 1, #names do
  print (names[nameCount])
end

#Uzunluk operatördür. Tablolar ve dizeler üzerinde çalışır, ikisinin uzunluğunu döndürür. Şimdi, ne kadar büyük veya küçük olursa olsun names, bu her zaman işe yarayacaktır.

Ancak, bir dizi öğeyi yinelemenin daha uygun bir yolu vardır:

names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
  print (name)
end

ipairsbir liste üzerinde yinelenen bir Lua standart işlevidir. Bu fordöngü stili, döngü için yineleyici, bu tür yineleme işlevini kullanır. iDeğeri dizisinin girişin endeksidir. nameO dizinde değer değerdir. Yani temelde sizin için çok fazla iş yapıyor.


1
Yani, for ipairs () başka dillerde foreach () olarak çalışır
boctulus

15
Harika cevap, son örnekte _var kullanılmadığında kullanılmasının oldukça alışılmış olduğunu ekleyeceğim . örneğinnames = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
Fraser

19

Çevrimiçi okuyarak ( tablo eğitimi ), tablolar diziler gibi davranıyor gibi görünüyor, bu yüzden şunları arıyorsunuz:

Yol1

names = {'John', 'Joe', 'Steve'}
for i = 1,3 do print( names[i] ) end

Yol2

names = {'John', 'Joe', 'Steve'}
for k,v in pairs(names) do print(v) end

Way1 tablosunu kullanır index/keysenin masada, namesher element örneğin 1'den başlayarak bir anahtar vardır:

names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John

Yani i1'den 3'e gidin.

On Way2 yerine çalıştırmak ve örneğin onun anahtar ve değer için bir değişken atamak istediklerini tablo belirtin:

names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end

aşağıdakileri yazdırır:

1   John
2   Joe
myKey   myValue

6
Tablo eğitimini okudunuz ama görmediniz ipairsmi? Veya pairsanahtar değerleri belirli bir sırayla döndürmek zorunda olmayan kısım ?
Nicol Bolas

Aslında ipairsilk başta kullandım ama sayısal olmayan tuşa myKey="myValue"ihtiyaç duyan örneği eklediğimde pairsgeri kalanını da değiştirmeye karar verdim pairs. Siparişin çiftlerle garanti edilmediğini atladıysam özür dilerim, ancak bağlantıyı okuması için orada bıraktım.
derp

1
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. Tablonuzu siliyorsunuz ve onu bir int ile değiştiriyorsunuz
  2. Tablodan bir değer almıyorsun

Deneyin:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end

1
Olumsuz oy veren: Lütfen olumsuz oylama için geçerli bir neden belirtin. Yanıtın yanıltıcı olduğunu düşünmeme rağmen names(tamsayı sayacı), forkapsamda belirtildiği gibi yerel bir değişken sunar, bu da names(tablo dizisini) genel kapsamda bildirildiği gibi gölgeler .
Dejavu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.