Do you want to pick up from where you left of?
Take me there

Sigil

Membuat dan menggunakan sigil.

Gambaran Keseluruhan Sigil

Elixir membekalkan satu sintaks alternatif untuk mewakili dan memanipulasi string. Satu sigil dimulakan dengan satu simbol tilde ~ dan dikuti oleh satu aksara. Kod teras Elixir ada membekalkan beberapa sigil yang telah disiap-pasang. Walaupun begitu kita masih dibenarkan untuk membuat sigil kita sendiri apabila ada keperluan untuk mengembangkan bahasa ini.

Senarai sigil yang tersedia termasuk:

Senarai kata-kata sempadan(delimiters) termasuk:

List Aksara

Sigil-sigil ~c dan ~C digunakan untuk menjana list aksara. Sebagai contoh:

iex> ~c/2 + 7 = #{2 + 7}/
'2 + 7 = 9'

iex> ~C/2 + 7 = #{2 + 7}/
'2 + 7 = \#{2 + 7}'

Kita dapat lihat apabila menggunakan huruf kecil, iaitu ~c, ia akan membuat interpolasi(menjalankan proses dan memulangkan hasil proses) pengiraan di dalam string tersebut, sementara sigil huruf besar ~C tidak melakukan interpolasi. Kita akan dapat melihat bagaimana penggunaan huruf kecil/huruf besar ini menjadi tema lazim di dalam keseluruhan sigil-sigil yang disiap-pasang.

Ungkapan Nalar

Sigil-sigil ~r dan ~R digunakan untuk mewakili Ungkapan Nalar(Regular Expression). Kita membuat mereka secara layang(on the fly) atau untuk kegunaan dari dalam fungsi-fungsi Regex. Sebagai contoh:

iex> re = ~r/elixir/
~r/elixir/

iex> "Elixir" =~ re
false

iex> "elixir" =~ re
true

Kita dapat lihat di dalam ujian persamaan yang pertama, perkataan Elixir tidak sepadan dengan ungkapan nalar tersebut. Ini kerana huruf pertamanya adalah huruf besar. Oleh sebab Elixir menyokong format Perl Compatible Regular Expressions (PCRE), kita boleh menambah i pada penghujung sigil untuk menyingkirkan kesensitifan huruf.

iex> re = ~r/elixir/i
~r/elixir/i

iex> "Elixir" =~ re
true

iex> "elixir" =~ re
true

Seterusnya, Elixir menyediakan API Regex yang dibina di atas pustaka ungkapan nalar Erlang. Mari kita laksanakan Regex.split/2 menggunakan sigil ungkapan nalar:

iex> string = "100_000_000"
"100_000_000"

iex> Regex.split(~r/_/, string)
["100", "000", "000"]

Sebagaimana yang dapat kita lihat, string "100_000_000" telah diceraikan berdasarkan simbol garis bawah melalui sigil ~r/_/ kita. Fungsi Regex.split itu memulangkan satu list.

String

Sigil-sigil ~s and ~S digunakan untuk menjana data string. Sebagai contoh:

iex> ~s/the cat in the hat on the mat/
"the cat in the hat on the mat"

iex> ~S/the cat in the hat on the mat/
"the cat in the hat on the mat"

Tetapi apakah perbezaannya? Perbezaannya adalah sama dengan sigil List Aksara yang telah kita lihat. Jawapannya adalah ‘interpolation’ dan ‘escape sequence’. Jika kita lihat satu lagi contoh:

iex> ~s/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir school"

iex> ~S/welcome to elixir #{String.downcase "SCHOOL"}/
"welcome to elixir \#{String.downcase \"SCHOOL\"}"

List Perkataan

Sigil list perkataan adalah amat berguna. Ia dapat menjimatkan masa, ‘keystroke’ dan megurangkan kerumitan di dalam ‘codebase’. Lihat contoh mudah ini:

iex> ~w/i love elixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love elixir school/
["i", "love", "elixir", "school"]

Kita dapat lihat apa yang ditaip di antara kedua-dua sempadan itu dipisahkan oleh ‘whitespace’ ke dalam satu list. Walaupun begitu, tidak ada yang membezakan antara kedua-dua contoh tersebut. Perbezaannya adalah ‘interpolation’ dan ‘escape sequence’. Lihat contoh di bawah:

iex> ~w/i love #{'e'}lixir school/
["i", "love", "elixir", "school"]

iex> ~W/i love #{'e'}lixir school/
["i", "love", "\#{'e'}lixir", "school"]

Membuat Sigil

Salah satu matlamat Elixir ialah menjadi satu bahasa aturcara yang boleh dikembangkan. Oleh itu tidak mengejutkan jika anda boleh membuat sigil-sigil anda sendiri. Di dalam contoh ini, kita akan membuat satu sigil untuk menukarkan satu string ke dalam bentuk huruf besar. Oleh kerana sudah terdapat fungsi yang sama di dalam teras ELixir(String.upcase/1), kita akan bungkuskan sigil kita diatas fungsi tersebut.


iex> defmodule MySigils do
...>   def sigil_u(string, []), do: String.upcase(string)
...> end

iex> import MySigils
nil

iex> ~u/elixir school/
ELIXIR SCHOOL

Mula-mula kita takrifkan satu modul berama MySigil dan di dalam modul tersebut, kita membuat satu fungsi dipanggil sigil_u. Oleh kerana sigil ~u masih belum wujud, kita akan gunakannya. Simbol _u memberitahu kita mahu menggunakan u sebagai aksara selepas simbol tilde. Pengenalan fungsi itu wajib mempunyai dua argumen, satu input dan satu list.

Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!