Elixir - Pemahaman
Pemahaman daftar adalah gula sintaksis untuk mengulang melalui enumerabel di Elixir. Dalam bab ini kita akan menggunakan pemahaman untuk iterasi dan generasi.
Dasar
Ketika kita melihat modul Enum di bab enumerables, kita menemukan fungsi peta.
Enum.map(1..3, &(&1 * 2))
Dalam contoh ini, kami akan meneruskan fungsi sebagai argumen kedua. Setiap item dalam rentang tersebut akan diteruskan ke fungsi tersebut, dan kemudian daftar baru akan dikembalikan berisi nilai baru.
Pemetaan, pemfilteran, dan transformasi adalah tindakan yang sangat umum di Elixir sehingga ada cara yang sedikit berbeda untuk mencapai hasil yang sama seperti contoh sebelumnya -
for n <- 1..3, do: n * 2
Ketika kami menjalankan kode di atas, itu menghasilkan hasil sebagai berikut -
[2, 4, 6]
Contoh kedua adalah pemahaman, dan seperti yang mungkin Anda lihat, itu hanyalah gula sintaksis untuk apa yang juga dapat Anda capai jika Anda menggunakan Enum.mapfungsi. Namun, tidak ada manfaat nyata menggunakan pemahaman atas fungsi dari modul Enum dalam hal kinerja.
Pemahaman tidak terbatas pada daftar tetapi dapat digunakan dengan semua enumerable.
Saring
Anda dapat menganggap filter sebagai semacam penjaga pemahaman. Saat nilai yang difilter kembalifalse atau nilitu dikecualikan dari daftar akhir. Mari kita mengulang suatu rentang dan hanya mengkhawatirkan bilangan genap. Kami akan menggunakanis_even fungsi dari modul Integer untuk memeriksa apakah suatu nilai genap atau tidak.
import Integer
IO.puts(for x <- 1..10, is_even(x), do: x)
Ketika kode di atas dijalankan, itu menghasilkan hasil sebagai berikut -
[2, 4, 6, 8, 10]
Kami juga dapat menggunakan beberapa filter dalam pemahaman yang sama. Tambahkan filter lain yang Anda inginkan setelahis_even filter dipisahkan dengan koma.
: ke dalam Opsi
Dalam contoh di atas, semua pemahaman mengembalikan daftar sebagai hasilnya. Namun, hasil pemahaman dapat dimasukkan ke dalam struktur data yang berbeda dengan melewatkan:into pilihan untuk pemahaman.
Misalnya, a bitstring generator dapat digunakan dengan opsi: into untuk dengan mudah menghapus semua spasi dalam string -
IO.puts(for <<c <- " hello world ">>, c != ?\s, into: "", do: <<c>>)
Ketika kode di atas dijalankan, itu menghasilkan hasil sebagai berikut -
helloworld
Kode di atas menghapus semua spasi dari string yang digunakan c != ?\s filter dan kemudian menggunakan opsi: into, ini menempatkan semua karakter yang dikembalikan dalam sebuah string.