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

Pencocokan Pola

Pencocokan pola (Pattern matching) adalah sebuah bagian Elixir yang powerful, memungkinkan kita mencocokkan value sederhana, struktur data, dan bahkan fungsi. Dalam pelajaran ini kita akan mulai melihat bagaimana pencocokan pola ini digunakan.

Table of Contents

Match operator

Siap untuk dibuat bingung? Dalam Elixir, operator = sebetulnya adalah operator pencocokan (match operator), dapat disamakan dengan tanda ‘sama dengan’ di aljabar. Saat dipakai, akan mengubah ekspresi menjadi persamaan dan membuat Elixir mencocokkan nilai di sisi kiri dengan nilai di sisi kanan. Jika nilainya cocok, akan dikembalikan nilai dari persamaan tersebut. Mari kita lihat:

iex> x = 1
1

Sekarang mari coba pencocokan sederhana:

iex> 1 = x
1
iex> 2 = x
** (MatchError) no match of right hand side value: 1

Mari coba dengan sebagian collection yang kita tahu:

# Lists
iex> list = [1, 2, 3]
[1, 2, 3]
iex> [1, 2, 3] = list
[1, 2, 3]
iex> [] = list
** (MatchError) no match of right hand side value: [1, 2, 3]

iex> [1 | tail] = list
[1, 2, 3]
iex> tail
[2, 3]
iex> [2 | _] = list
** (MatchError) no match of right hand side value: [1, 2, 3]

# Tuples
iex> {:ok, value} = {:ok, "Successful!"}
{:ok, "Successful!"}
iex> value
"Successful!"
iex> {:ok, value} = {:error}
** (MatchError) no match of right hand side value: {:error}

Pin operator

Kita baru saja pelajari bahwa operator pencocokan melakukan assignment ketika sisi kiri pencocokan berisi variabel. Dalam beberapa kasus perilaku ini, variable rebinding, tidak diinginkan. Untuk situasi semacam ini, kita punya pin operator: ^.

Ketika kita melakukan pin sebuah variabel, kita mencocokkan terhadap value yang ada dan bukannya melakukan rebinding terhadap value yang baru. Mari lihat bagaimana ini terjadi:

iex> x = 1
1
iex> ^x = 2
** (MatchError) no match of right hand side value: 2
iex> {x, ^x} = {2, 1}
{2, 1}
iex> x
2

Elixir 1.2 menambahkan dukungan pada pin dalam key dari map dan klausa fungsi:

iex> key = "hello"
"hello"
iex> %{^key => value} = %{"hello" => "world"}
%{"hello" => "world"}
iex> value
"world"
iex> %{^key => value} = %{:hello => "world"}
** (MatchError) no match of right hand side value: %{hello: "world"}

Sebuah contoh pinning dalam klausa fungsi:

iex> greeting = "Hello"
"Hello"
iex> greet = fn
...>   (^greeting, name) -> "Hi #{name}"
...>   (greeting, name) -> "#{greeting}, #{name}"
...> end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex> greet.("Hello", "Sean")
"Hi Sean"
iex> greet.("Mornin'", "Sean")
"Mornin', Sean"
iex> greeting
"Hello"

Perhatikan pada contoh "Mornin'" bahwa perubahan value dari greeting menjadi "Mornin'" hanya terjadi di dalam fungsi. Di luar fungsi, value greeting masih tetap "Hello".

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