Sebenarnya ada apa dengan postingan ini? saya sedang belajar rust lang. Metode yang menurut saya efektif untuk belajar adalah menuliskannya di blog dan menjelaskan kembali hal tersebut. Saya amat sangat menerima kritik dan saran.
Pendahuluan
Rust memiliki pendekatan yang unik terhadap null value berbeda dengan bahasa seperti Java, Javascript, Ruby, dan Swift. Null mengambarkan sebuah kekosongan atau ketiadaan terhadap suatu objek, artinya pada bahasa seperti Java terdapat dua kondisi null atau bukan null.
Pada tahun 2009 inventor tipe null pada seminar Null References: The Billion Dollar Mistake yang dikutip dari The Rust Book berkata:
I call it my billion-dollar mistake. At that time, I was designing the first comprehensive type system for references in an object-oriented language. My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn’t resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
-Tony Hoare
Salah satu masalah dari null values adalah bug atau error akan terjadi ketika kita berusaha menggunakan null value menjadi bukan null. Hal ini disebabkan karena null value bersifat pervasif yang berarti tidak memiliki nilai apapun didalamnya dan tidak ada yang bisa kita interpretasikan.
I completely disagree with the concept that nulls are bad in computer science. What is bad is languages implementation of it, and developers not accounting for them correctly.
Jon
Option
Option adalah enum yang merupakan bagian dari standard library. Dengan menggunakan Option singkatnya dapat diketahui apakah nilai tersebut berisi sesuatu atau tidak “it coulbe be nothing or something“.
Jadi walaupun rust tidak memiliki konsep null value, tetapi enum memiliki mekanisme yang sama untuk menyatakan bahwa suatu objek bersifat present atau absent.
#![allow(unused)]
fn main() {
enum Option<T> {
None,
Some(T),
}
}Contoh 1.0
syntax <T> adalah parameter tipe generik yang ada pada varian Some. Varian tersebut dapat menyimpan semua tipe data. Ketika suatu data menggunakan fitur tersebut maka tipe datanya menjadi Option <tipe data>.
Kita tidak perlu menggunakan enum Option tersebut secara eksplisit seperti Option::None karena sudah terdapat di standard library. Cukup deklarasikan menggunakan Some atau None.
fn main () {
let some_string: Option<str> = Some("Hi");
let some_angka: Option<i32> =Some(27);
let kosong : Option<i32> = None;
}Contoh 1.1
Ketika menggunakan text editor seperti VS codium kita tidak perlu menuliskan Option<str>. Kompiler secara otomatis dapat mengetahui tipe value pada Some. Tetapi ketika kita hendak menggunakan mekanisme null value wajib menuliskan secara eksplisit Option <tipe data>. Alasannya sederhana, kompiler bukanlah peramal.
Artinya Some akan bersanding dengan nilai (present) dan None (absent). Dengan cara demikian Option <T> adalah tipe data yang berbeda dengan T. Kita tidak bisa melakukan operasi Option <T> + T mirip seperti String + i32.
fn main(){
let jumlah_bola = 27;
let some_bola = Some(32);
let z = jumlah_bola + some_bola;
}Contoh 1.2
Output dari kode tersebut adalah sebagai berikut.
error[E0277]: cannot add `Option<{integer}>` to `{integer}`
--> src/main.rs:5:25
|
5 | let z = jumlah_bola + some_bola;
| ^ no implementation for `{integer} + Option<{integer}>`
|
= help: the trait `Add<Option<{integer}>>` is not implemented for `{integer}`
= help: the following other types implement trait `Add<Rhs>`:
<isize as Add>
<isize as Add<&isize>>
<i8 as Add>
<i8 as Add<&i8>>
<i16 as Add>
<i16 as Add<&i16>>
<i32 as Add>
<i32 as Add<&i32>>
and 48 othersContoh 1.3
Maka dari itu nilai i8 pada Rust akan terjamin merupakan nilai yang valid. Jika terdapat option <T> maka kemungkinan terdapat null value atau absent yang dapat dengan mudah diketahui.
Kita tidak perlu memikirkan mengenai null atau not null. Nilai yang memiliki tipe selain dari Option <T> adalah nilai yang valid, bukan null value.
Kesimpulan
Masih banyak hal lain yang perlu untuk dieksplor sehubungan dengan enum dan Option <T>. Mekanisme yang mirip dengan null value menjadikan kita lebih percaya diri dalam menulsikan kode karena tidak perlu memikirkan mengenai kondisi null dan not null.