Strings
Tentang String di Elixir, Char list, Grapheme, dan Codepoint.
String di Elixir
String Elixir tidak lebih dari serangkaian byte. Mari lihat sebuah contoh:
iex> string = <<104,101,108,108,111>>
"hello"
PERHATIKAN: Menggunakan sintaks << >> kita memberitahukan ke compiler bahwa elemen-elemen di dalam simbol ini adalah byte.
Char list
Secara internal, string Elixir direpresentasikan dengan serangkaian byte dan bukannya array dari karakter, dan Elixir juga punya tipe char list (list dari karaketer). String Elixir dibuat dengan kutip ganda, sedangkan char list dibuat dengan kutip tunggal.
Apa beda antara keduanya? Setiap value dari char list adalah nilai ASCII dari karakter tersebut. Mari kita dalami:
iex> char_list = 'hello'
'hello'
iex> [hd|tl] = char_list
'hello'
iex> {hd, tl}
{104, 'ello'}
iex> Enum.reduce(char_list, "", fn char, acc -> acc <> to_string(char) <> "," end)
"104,101,108,108,111,"
Ketika membuat program di Elixir, kita biasanya tidak memakai char list melainkan String. Dukungan terhadap char list diberikan karena char list dibutuhkan oleh beberapa modul Erlang.
Grapheme and codepoint
Codepoint adalah karakter Unicode sederhana, yang bisa direpresentasikan dengan satu atau dua byte. Sebagai contoh, karakter dengan tilde atau aksen: á, ñ, è
. Grapheme terdiri dari beberapa codepoint yang tampak sebagai satu karakter sederhana.
Modul String sudah menyediakan dua fungsi untuk menggunakannya, graphemes/1
and codepoints/1
. Mari kita lihat contohnya:
iex> string = "\u0061\u0301"
"á"
iex> String.codepoints string
["a", "́"]
iex> String.graphemes string
["á"]
Fungsi String
Mari kita review beberapa fungsi yang paling penting dan berguna yang disediakan modul String untuk kita.
length/1
Mengembalikan jumlah Grapheme dalam string tersebut.
iex> String.length "Hello"
5
replace/3
Mengembalikan sebuah string baru, mengganti sebuah pola yang ada dalam string tersebut dngan string baru.
iex> String.replace("Hello", "e", "a")
"Hallo"
duplicate/2
Mengembalikan sebuah string baru yang diulang n kali.
iex> String.duplicate("Oh my ", 3)
"Oh my Oh my Oh my "
split/2
Mengembalikan sebuah array dari string setelah dipisah oleh sebuah pola.
iex> String.split("Hello World", " ")
["Hello", "World"]
Latihan
Mari langsung mencoba dengan dua latihan sederhana untuk mendemonstrasikan bahwa kita sudah paham String!
Anagram
A dan B dianggap anagram jika dengan mengubah urutan karakternya kita bisa membuatnya jadi sama. Sebagai contoh: A = super B = perus
Jika kita mengubah urutan karakter-karakter di string A, kita bisa dapatkan string B, dan sebaliknya.
Jadi, bagaimana cara mengecek apakah dua string adalah Anagram di Elixir?
Cara yang termudah adalah dengan mengurutkan kedua string secara alfabet dan mencek apakah sama. Mari cek contoh berikut:
defmodule Anagram do
def anagrams?(a, b) when is_binary(a) and is_binary(b) do
sort_string(a) == sort_string(b)
end
def sort_string(string) do
string
|> String.downcase()
|> String.graphemes()
|> Enum.sort()
end
end
Mari pertama-tama mengamati anagrams?/2
. Kita mengecek apakah parameter yang kita terima adalah binary atau bukan. Itulah cara untuk mengecek apakah sebuah parameter adalah String di Elixir.
Setelah itu, kita memanggil sebuah fungsi yang mengurutkan kedua string dalam urutan alfabetis, pertama-tama mengubahnya jadi huruf kecil dan lalu menggunakan String.graphemes
yang mengembalikan array berisi Grapheme dari string tersebut.
Mari kita cek outputnya di iex:
iex> Anagram.anagrams?("Hello", "ohell")
true
iex> Anagram.anagrams?("María", "íMara")
true
iex> Anagram.anagrams?(3, 5)
** (FunctionClauseError) no function clause matching in Anagram.anagrams?/2
The following arguments were given to Anagram.anagrams?/2:
# 1
3
# 2
5
iex:11: Anagram.anagrams?/2
Sebagaimana bisa anda lihat, pemanggilan terakhir ke anagrams?
mengakibatkan FunctionClauseError. Error ini memberitahu kita bahwa tidak ada fungsi di modul kita yang cocok dengan pola menerima dua argumen non-biner, dan itu persis yang kita inginkan, menerima dua string dan tidak yang lain.
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!