İksir - Listeler ve Demetler
(Bağlantılı) Listeler
Bağlantılı bir liste, bellekte farklı konumlarda depolanan ve referanslar kullanılarak izlenen öğelerin heterojen bir listesidir. Bağlantılı listeler, özellikle fonksiyonel programlamada kullanılan veri yapılarıdır.
Elixir, bir değer listesi belirtmek için köşeli parantez kullanır. Değerler herhangi bir türde olabilir -
[1, 2, true, 3]
Elixir yazdırılabilir ASCII numaralarının bir listesini gördüğünde, Elixir bunu bir karakter listesi (kelimenin tam anlamıyla bir karakter listesi) olarak yazdıracaktır. IEx'te bir değer gördüğünüzde ve ne olduğundan emin olmadığınızda,i bununla ilgili bilgi alma işlevi.
IO.puts([104, 101, 108, 108, 111])
Listedeki yukarıdaki karakterlerin tümü yazdırılabilir. Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -
hello
Ayrıca tek tırnak işaretleri kullanarak listeleri tam tersi şekilde de tanımlayabilirsiniz -
IO.puts(is_list('Hello'))
Yukarıdaki program çalıştırıldığında, aşağıdaki sonucu verir -
true
Tek tırnaklı ve çift tırnaklı temsillerin Elixir'de farklı türlerle temsil edildikleri için eşdeğer olmadığını unutmayın.
Bir Listenin Uzunluğu
Bir listenin uzunluğunu bulmak için aşağıdaki programdaki gibi uzunluk fonksiyonunu kullanıyoruz -
IO.puts(length([1, 2, :true, "str"]))
Yukarıdaki program aşağıdaki sonucu üretir -
4
Birleştirme ve Çıkarma
Kullanılarak iki liste birleştirilebilir ve çıkarılabilir. ++ ve --operatörler. İşlevleri anlamak için aşağıdaki örneği düşünün.
IO.puts([1, 2, 3] ++ [4, 5, 6])
IO.puts([1, true, 2, false, 3, true] -- [true, false])
Bu size birinci durumda birleştirilmiş bir dize ve ikinci durumda bir çıkarılmış dize verecektir. Yukarıdaki program aşağıdaki sonucu üretir -
[1, 2, 3, 4, 5, 6]
[1, 2, 3, true]
Bir Listenin Başı ve Sonu
Baş, bir listenin ilk öğesidir ve kuyruk, bir listenin geri kalanıdır. Fonksiyonlar ile geri çağrılabilirlerhd ve tl. Bir değişkene bir liste atayalım ve başını ve sonunu alalım.
list = [1, 2, 3]
IO.puts(hd(list))
IO.puts(tl(list))
Bu bize listenin başını ve sonunu çıktı olarak verecektir. Yukarıdaki program aşağıdaki sonucu üretir -
1
[2, 3]
Note - Boş bir listenin başını veya sonunu almak bir hatadır.
Diğer Liste işlevleri
Elixir standart kitaplığı, listelerle uğraşmak için çok sayıda işlev sağlar. Bunlardan bazılarına burada bir göz atacağız. Burada kalanını kontrol edebilirsiniz Liste .
S.no. | İşlev Adı ve Açıklaması |
---|---|
1 | delete(list, item) Verilen öğeyi listeden siler. Öğe olmadan bir liste döndürür. Öğe listede birden fazla yer alıyorsa, yalnızca ilk geçtiği yer kaldırılır. |
2 | delete_at(list, index) Belirtilen dizindeki değeri kaldırarak yeni bir liste oluşturur. Negatif endeksler, listenin sonundan bir ofseti gösterir. Dizin sınırların dışındaysa, orijinal liste döndürülür. |
3 | first(list) Listedeki ilk öğeyi döndürür veya liste boşsa nil'i döndürür. |
4 | flatten(list) Verilen iç içe listelerin listesini düzleştirir. |
5 | insert_at(list, index, value) Belirtilen dizine eklenen değere sahip bir liste döndürür. Dizinin liste uzunluğunda sınırlandırıldığını unutmayın. Negatif endeksler, listenin sonundan bir ofseti gösterir. |
6 | last(list) Listedeki son öğeyi döndürür veya liste boşsa sıfırdır. |
Tuples
Tuple'lar ayrıca, içlerinde bir dizi başka yapıyı depolayan veri yapılarıdır. Listelerden farklı olarak, öğeleri bitişik bir bellek bloğunda saklarlar. Bu, indeks başına bir tuple öğesine erişmenin veya tuple boyutunu almanın hızlı bir işlem olduğu anlamına gelir. Dizinler sıfırdan başlar.
Elixir, tupleları tanımlamak için küme parantezleri kullanır. Listeler gibi, tuplelar da herhangi bir değeri tutabilir -
{:ok, "hello"}
Bir Demetin Uzunluğu
Bir demetin uzunluğunu elde etmek için, tuple_size aşağıdaki programdaki gibi işlev görür -
IO.puts(tuple_size({:ok, "hello"}))
Yukarıdaki program aşağıdaki sonucu üretir -
2
Bir Değer Eklemek
Başlığa bir değer eklemek için Tuple.append işlevini kullanın -
tuple = {:ok, "Hello"}
Tuple.append(tuple, :world)
Bu, yeni bir demet oluşturacak ve döndürecektir: {: ok, "Merhaba",: dünya}
Bir Değer Eklemek
Belirli bir konuma bir değer eklemek için, Tuple.insert_at function veya the put_elemişlevi. Aynısını anlamak için aşağıdaki örneği düşünün -
tuple = {:bar, :baz}
new_tuple_1 = Tuple.insert_at(tuple, 0, :foo)
new_tuple_2 = put_elem(tuple, 1, :foobar)
Dikkat edin put_elem ve insert_atyeni kayıtlar döndürdü. Tuple değişkeninde depolanan orijinal demet, Elixir veri türleri değişmez olduğu için değiştirilmedi. Değişmez olduğu için Elixir kodunun akıl yürütmesi daha kolaydır, çünkü belirli bir kod veri yapınızı yerinde değiştiriyorsa endişelenmenize gerek kalmaz.
Tuples ve Listeler
Listeler ve demetler arasındaki fark nedir?
Listeler, bağlantılı listeler olarak bellekte depolanır, yani listedeki her öğenin değerini tuttuğu ve listenin sonuna ulaşılana kadar aşağıdaki öğeyi gösterdiği anlamına gelir. Her bir değer çiftini çağırıyoruz ve bir eksiler hücresi gösteriyoruz. Bu, bir listenin uzunluğuna erişmenin doğrusal bir işlem olduğu anlamına gelir: Büyüklüğünü anlamak için tüm listeyi taramamız gerekir. Öğeleri önceden eklediğimiz sürece bir listeyi güncellemek hızlıdır.
Öte yandan, diziler bitişik olarak bellekte depolanır. Bu, tuple boyutunu elde etmenin veya indeksle bir öğeye erişmenin hızlı olduğu anlamına gelir. Bununla birlikte, kayıtlara eleman eklemek veya güncellemek pahalıdır çünkü hafızadaki tüm demetin kopyalanmasını gerektirir.