Fork me on GitHub

Enum

Some contents of this translation may be outdated.
Several major changes were applied to the original lesson since the last update.

Satu kumpulan algorithm untuk memproses satu persatu(enumerate) isi kandungan ‘collection’.

Isi Kandungan

Enum

Modul Enum mengandungi lebih dari satu ratus fungsi-fungsi untuk bekerja dengan ‘collection’ yang telah kita pelajari dalam pelajaran lepas.

Pelajaran ini cuma akan meliputi sedikit sahaja daripada fungsi-fungsi yang tersedia, untuk melihat fungsi-fungsi lengkap lawati dokumentasi rasmi Enum; untuk kaedah ‘lazy enumeration’ gunakan modul Stream.

all?

Apabila menggunakan all?, dan sebahagian besar dari Enum, kita bekalkan satu fungsi untuk dilaksanakan ke atas item-item di dalam ‘collection’ kita. Di dalam kes all?, keseluruhan ‘collection’ mesti dinilaikan kepada true jika tidak false akan dipulangkan.

iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 3 end)
false
iex> Enum.all?(["foo", "bar", "hello"], fn(s) -> String.length(s) > 1 end)
true

any?

Tidak seperti di atas, any? akan memulangkan true jika sekurang-kurangnya satu item di dalam ‘collection’ dinilaikan kepada true.

iex> Enum.any?(["foo", "bar", "hello"], fn(s) -> String.length(s) == 5 end)
true

chunk

Jika anda perlu untuk menceraikan ‘collection’ kepada kumpulan-kumpulan kecil, gunakan fungsi chunk:

iex> Enum.chunk([1, 2, 3, 4, 5, 6], 2)
[[1, 2], [3, 4], [5, 6]]

Terdapat beberapa pilihan untuk chunk tetapi kita tidak akan sebutkan di sini, lihat dokumentasi rasmi chunk/2 untuk maklumat lebih lanjut.

chunk_by

Jika kita perlu untuk membuat pengasingan kepada ‘collection’ berdasarkan kepada kriteria selain dari saiz, kita boleh gunakan fungsi chunk_by:

iex> Enum.chunk_by(["one", "two", "three", "four", "five"], fn(x) -> String.length(x) end)
[["one", "two"], ["three"], ["four", "five"]]

each

Jika perlu untuk memproses satu persatu elemen di dalam ‘collection’ tanpa menghasilkan nilai baru, kita akan gunakan each:

iex> Enum.each(["one", "two", "three"], fn(s) -> IO.puts(s) end)
one
two
three
:ok

Nota: Fungsi each akan memulangkan atom :ok.

map

Untuk melaksanakan fungsi kepada setiap item di dalam ‘collection’ dan menghasilkan satu ‘collection’ baru, gunakan fungsi map:

iex> Enum.map([0, 1, 2, 3], fn(x) -> x - 1 end)
[-1, 0, 1, 2]

min

Untuk mencari nilai min di dalam ‘collection’:

iex> Enum.min([5, 3, 0, -1])
-1

max

Untuk mencari nilai max di dalam ‘collection’:

iex> Enum.max([5, 3, 0, -1])
5

reduce

Dengan reduce kita boleh memampatkan ‘collection’ kepada satu nilai. Untuk ini kita hantarkan satu ‘accumulator’ pilihan (10 di dalam contoh di bawah) kepada fungsi; jika tiada ‘accumulator’ dibekalkan, nilai pertama akan digunakan:

iex> Enum.reduce([1, 2, 3], 10, fn(x, acc) -> x + acc end)
16
iex> Enum.reduce([1, 2, 3], fn(x, acc) -> x + acc end)
6
iex> Enum.reduce(["a","b","c"], "1", fn(x,acc)-> x <> acc end)
"cba1"

sort

Pengisihan(sorting) ‘collection’ dipermudahkan bukan dengan satu, tetapi dua fungsi sort. Pilihan pertama yang disediakan kepada kita menggunakan tertiban istilah Elixir untuk menentukan susunan isihan:

iex> Enum.sort([5, 6, 1, 3, -1, 4])
[-1, 1, 3, 4, 5, 6]

iex> Enum.sort([:foo, "bar", Enum, -1, 4])
[-1, 4, Enum, :foo, "bar"]

Pilihan kedua membenarkan kita menyediakan satu fungsi isihan:

# with our function
iex> Enum.sort([%{:val => 4}, %{:val => 1}], fn(x, y) -> x[:val] > y[:val] end)
[%{val: 4}, %{val: 1}]

# without
iex> Enum.sort([%{:count => 4}, %{:count => 1}])
[%{count: 1}, %{count: 4}]

uniq

Kita boleh gunakan uniq untuk menyingkirkan pertindanan daripada ‘collection’ kita:

iex> Enum.uniq([1, 2, 2, 3, 3, 3, 4, 4, 4, 4])
[1, 2, 3, 4]

Share This Page