<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Drian </title>
    <description>The latest articles on DEV Community by Drian  (@driannaird).</description>
    <link>https://dev.to/driannaird</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F943301%2F4b85577e-3e96-47ac-9876-557608da08f6.jpeg</url>
      <title>DEV Community: Drian </title>
      <link>https://dev.to/driannaird</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/driannaird"/>
    <language>en</language>
    <item>
      <title>Membongkar Sihir di Balik Video Call: WebRTC</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Tue, 23 Dec 2025 10:36:54 +0000</pubDate>
      <link>https://dev.to/driannaird/membongkar-sihir-di-balik-video-call-webrtc-50e7</link>
      <guid>https://dev.to/driannaird/membongkar-sihir-di-balik-video-call-webrtc-50e7</guid>
      <description>&lt;p&gt;Pernahkah kamu berpikir, saat kamu melakukan video call via browser, bagaimana wajah temanmu bisa muncul di layarmu dengan begitu cepat? Apakah videonya harus "terbang" dulu ke server perusahaan di luar negeri, baru turun ke HP-mu? &lt;/p&gt;

&lt;p&gt;Jawabannya: &lt;strong&gt;Tidak selalu&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Selamat datang di dunia WebRTC (Web Real-Time Communication). Teknologi ajaib yang memungkinkan browser kita untuk "ngobrol" secara langsung satu sama lain. Mari kita bedah cara kerjanya tanpa pusing dengan istilah rumit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzsaewr4pveckk5n1q2c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqzsaewr4pveckk5n1q2c.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Konsep Dasar: Peer-to-Peer (P2P)
&lt;/h2&gt;

&lt;p&gt;Di web tradisional, komunikasi itu seperti mengirim surat lewat kantor pos. Kamu (Client) kirim surat ke Kantor Pos (Server), lalu Kantor Pos mengirimnya ke temanmu. Aman, tapi lambat.&lt;/p&gt;

&lt;p&gt;WebRTC berbeda. Ia menggunakan konsep &lt;strong&gt;Peer-to-Peer&lt;/strong&gt;. Bayangkan kamu dan temanmu berada di satu ruangan dan saling berbicara langsung. Tanpa perantara, tanpa kantor pos. Hasilnya? Komunikasi super cepat (real-time) dan kualitas video yang tinggi.&lt;/p&gt;

&lt;p&gt;Tapi, di internet yang luas ini, "bertemu di satu ruangan" itu tidak mudah. Ada banyak halangan.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tantangan: "Kamu Ada di Mana?"
&lt;/h2&gt;

&lt;p&gt;Masalah utama internet adalah: Komputer kita seringkali "pemalu". Mereka bersembunyi di balik Router WiFi rumah atau kantor. Ini disebut &lt;strong&gt;NAT (Network Address Translation)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Akibat NAT, komputer kita tidak tahu alamat asli (IP Public) dirinya sendiri. Jika komputer A bilang ke B, "Hai, alamatku 192.168.1.5", si B tidak akan bisa menemukannya karena itu adalah alamat lokal (privat).&lt;/p&gt;

&lt;p&gt;Lalu, bagaimana solusinya? WebRTC punya tim khusus untuk menangani ini.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Si Mak Comblang (Signaling)
&lt;/h3&gt;

&lt;p&gt;Sebelum bisa ngobrol langsung, browser A dan B butuh perantara sebentar untuk tukaran kontak. Proses ini disebut &lt;strong&gt;Signaling&lt;/strong&gt;. Mereka bertukar info:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Aku dukung video resolusi HD."&lt;/li&gt;
&lt;li&gt;"Jaringanku ada di alamat ini." &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setelah kontak bertukar, si Mak Comblang ini minggir dan membiarkan A dan B ngobrol langsung.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Cermin Ajaib (STUN Server)
&lt;/h3&gt;

&lt;p&gt;Karena komputer kita tidak tahu alamat publiknya sendiri, dia bertanya ke &lt;strong&gt;STUN Server&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Komputer:&lt;/strong&gt; "STUN, aku kelihatan dari luar alamatnya berapa sih?"&lt;/li&gt;
&lt;li&gt;STUN: "Kamu terlihat memakai alamat IP 203.0.113.5."
Berbekal info ini, komputer kita bisa kasih tahu temannya alamat yang benar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  C. Jalur Darurat (TURN Server)
&lt;/h3&gt;

&lt;p&gt;Kadang, jaringan kantor atau firewall sangat ketat. Seperti ada tembok tinggi yang memblokir koneksi langsung, meskipun kita sudah pakai STUN.&lt;br&gt;
Di sinilah TURN Server beraksi. Jika jalan langsung buntu, TURN bertindak sebagai "orang di atas tembok".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Komputer A melempar data ke TURN.&lt;/li&gt;
&lt;li&gt;TURN mengoper data ke Komputer B.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ini adalah Rencana B. Koneksi jadi sedikit lebih lambat dan memakan biaya server, tapi yang penting panggilan tetap tersambung!&lt;/p&gt;

&lt;h3&gt;
  
  
  D. Sang Manajer (ICE)
&lt;/h3&gt;

&lt;p&gt;Protokol yang mengatur pemilihan jalur ini (apakah lewat jalur langsung, atau terpaksa lewat TURN) disebut &lt;strong&gt;ICE (Interactive Connectivity Establishment)&lt;/strong&gt;. Dia yang cerdas memilih jalur terbaik dan tercepat.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Senjata Utama WebRTC (API)
&lt;/h3&gt;

&lt;p&gt;Untuk para developer, WebRTC menyediakan tiga "senjata" utama dalam JavaScript:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. MediaStream (getUserMedia)&lt;/strong&gt;: Ini adalah gerbang indera. API ini meminta izin untuk menyalakan kamera dan mikrofon, lalu mengubahnya menjadi aliran data digital.&lt;br&gt;
&lt;strong&gt;2. RTCPeerConnection&lt;/strong&gt;: Ini adalah "mesin" utamanya. Dia yang mengurus koneksi, mengecek bandwidth, dan memastikan video sampai ke seberang dengan aman.&lt;br&gt;
&lt;strong&gt;3. RTCDataChannel&lt;/strong&gt;: Bukan cuma suara dan video, WebRTC bisa kirim data apa saja! File gambar, teks chat, atau data game multiplayer. Kelebihannya? Data dikirim langsung (P2P) sehingga sangat cepat dan privasinya terjaga karena tidak mampir ke server database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;WebRTC adalah teknologi yang memotong jalur birokrasi internet. Dengan bantuan STUN untuk mengetahui lokasi, TURN untuk menembus tembok api, dan API yang powerful, browser kita bisa menjadi alat komunikasi canggih tanpa perlu instal aplikasi tambahan.&lt;/p&gt;

&lt;p&gt;Jadi, saat kamu video call nanti, ingatlah kerja keras si "ICE" yang sedang sibuk mencari jalan tikus terbaik agar wajah temanmu tidak buffering!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>webrtc</category>
      <category>videocall</category>
    </item>
    <item>
      <title>Membongkar Sihir di Balik Video Call: WebRTC</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Tue, 23 Dec 2025 10:30:36 +0000</pubDate>
      <link>https://dev.to/driannaird/membongkar-sihir-di-balik-video-call-panduan-webrtc-yang-mudah-dipahami-1d5k</link>
      <guid>https://dev.to/driannaird/membongkar-sihir-di-balik-video-call-panduan-webrtc-yang-mudah-dipahami-1d5k</guid>
      <description>&lt;p&gt;Pernahkah kamu berpikir, saat kamu melakukan video call via browser, bagaimana wajah temanmu bisa muncul di layarmu dengan begitu cepat? Apakah videonya harus "terbang" dulu ke server perusahaan di luar negeri, baru turun ke HP-mu? &lt;/p&gt;

&lt;p&gt;Jawabannya: &lt;strong&gt;Tidak selalu&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Selamat datang di dunia WebRTC (Web Real-Time Communication). Teknologi ajaib yang memungkinkan browser kita untuk "ngobrol" secara langsung satu sama lain. Mari kita bedah cara kerjanya tanpa pusing dengan istilah rumit.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Konsep Dasar: Peer-to-Peer (P2P)
&lt;/h2&gt;

&lt;p&gt;Di web tradisional, komunikasi itu seperti mengirim surat lewat kantor pos. Kamu (Client) kirim surat ke Kantor Pos (Server), lalu Kantor Pos mengirimnya ke temanmu. Aman, tapi lambat.&lt;/p&gt;

&lt;p&gt;WebRTC berbeda. Ia menggunakan konsep &lt;strong&gt;Peer-to-Peer&lt;/strong&gt;. Bayangkan kamu dan temanmu berada di satu ruangan dan saling berbicara langsung. Tanpa perantara, tanpa kantor pos. Hasilnya? Komunikasi super cepat (real-time) dan kualitas video yang tinggi.&lt;/p&gt;

&lt;p&gt;Tapi, di internet yang luas ini, "bertemu di satu ruangan" itu tidak mudah. Ada banyak halangan.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Tantangan: "Kamu Ada di Mana?"
&lt;/h2&gt;

&lt;p&gt;Masalah utama internet adalah: Komputer kita seringkali "pemalu". Mereka bersembunyi di balik Router WiFi rumah atau kantor. Ini disebut &lt;strong&gt;NAT (Network Address Translation)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Akibat NAT, komputer kita tidak tahu alamat asli (IP Public) dirinya sendiri. Jika komputer A bilang ke B, "Hai, alamatku 192.168.1.5", si B tidak akan bisa menemukannya karena itu adalah alamat lokal (privat).&lt;/p&gt;

&lt;p&gt;Lalu, bagaimana solusinya? WebRTC punya tim khusus untuk menangani ini.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Si Mak Comblang (Signaling)
&lt;/h3&gt;

&lt;p&gt;Sebelum bisa ngobrol langsung, browser A dan B butuh perantara sebentar untuk tukaran kontak. Proses ini disebut &lt;strong&gt;Signaling&lt;/strong&gt;. Mereka bertukar info:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Aku dukung video resolusi HD."&lt;/li&gt;
&lt;li&gt;"Jaringanku ada di alamat ini." &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Setelah kontak bertukar, si Mak Comblang ini minggir dan membiarkan A dan B ngobrol langsung.&lt;/p&gt;

&lt;h3&gt;
  
  
  B. Cermin Ajaib (STUN Server)
&lt;/h3&gt;

&lt;p&gt;Karena komputer kita tidak tahu alamat publiknya sendiri, dia bertanya ke &lt;strong&gt;STUN Server&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Komputer:&lt;/strong&gt; "STUN, aku kelihatan dari luar alamatnya berapa sih?"&lt;/li&gt;
&lt;li&gt;STUN: "Kamu terlihat memakai alamat IP 203.0.113.5."
Berbekal info ini, komputer kita bisa kasih tahu temannya alamat yang benar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  C. Jalur Darurat (TURN Server)
&lt;/h3&gt;

&lt;p&gt;Kadang, jaringan kantor atau firewall sangat ketat. Seperti ada tembok tinggi yang memblokir koneksi langsung, meskipun kita sudah pakai STUN.&lt;br&gt;
Di sinilah TURN Server beraksi. Jika jalan langsung buntu, TURN bertindak sebagai "orang di atas tembok".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Komputer A melempar data ke TURN.&lt;/li&gt;
&lt;li&gt;TURN mengoper data ke Komputer B.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ini adalah Rencana B. Koneksi jadi sedikit lebih lambat dan memakan biaya server, tapi yang penting panggilan tetap tersambung!&lt;/p&gt;

&lt;h3&gt;
  
  
  D. Sang Manajer (ICE)
&lt;/h3&gt;

&lt;p&gt;Protokol yang mengatur pemilihan jalur ini (apakah lewat jalur langsung, atau terpaksa lewat TURN) disebut &lt;strong&gt;ICE (Interactive Connectivity Establishment)&lt;/strong&gt;. Dia yang cerdas memilih jalur terbaik dan tercepat.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Senjata Utama WebRTC (API)
&lt;/h3&gt;

&lt;p&gt;Untuk para developer, WebRTC menyediakan tiga "senjata" utama dalam JavaScript:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. MediaStream (getUserMedia)&lt;/strong&gt;: Ini adalah gerbang indera. API ini meminta izin untuk menyalakan kamera dan mikrofon, lalu mengubahnya menjadi aliran data digital.&lt;br&gt;
&lt;strong&gt;2. RTCPeerConnection&lt;/strong&gt;: Ini adalah "mesin" utamanya. Dia yang mengurus koneksi, mengecek bandwidth, dan memastikan video sampai ke seberang dengan aman.&lt;br&gt;
&lt;strong&gt;3. RTCDataChannel&lt;/strong&gt;: Bukan cuma suara dan video, WebRTC bisa kirim data apa saja! File gambar, teks chat, atau data game multiplayer. Kelebihannya? Data dikirim langsung (P2P) sehingga sangat cepat dan privasinya terjaga karena tidak mampir ke server database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;WebRTC adalah teknologi yang memotong jalur birokrasi internet. Dengan bantuan STUN untuk mengetahui lokasi, TURN untuk menembus tembok api, dan API yang powerful, browser kita bisa menjadi alat komunikasi canggih tanpa perlu instal aplikasi tambahan.&lt;/p&gt;

&lt;p&gt;Jadi, saat kamu video call nanti, ingatlah kerja keras si "ICE" yang sedang sibuk mencari jalan tikus terbaik agar wajah temanmu tidak buffering!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>webrtc</category>
    </item>
    <item>
      <title>DOKUMEN STANDAR: Laravel Safe Email System</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Thu, 20 Nov 2025 07:57:30 +0000</pubDate>
      <link>https://dev.to/driannaird/dokumen-standar-laravel-safe-email-system-4cae</link>
      <guid>https://dev.to/driannaird/dokumen-standar-laravel-safe-email-system-4cae</guid>
      <description>&lt;p&gt;&lt;strong&gt;Infrastruktur:&lt;/strong&gt; Shared Hosting (Hostinger/Qwords)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Laravel 8, 9, 10, atau 11&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Tujuan:&lt;/strong&gt; Mencegah blokir SMTP dengan kebijakan &lt;em&gt;Zero Bounce&lt;/em&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  BAGIAN 1: Fondasi Infrastruktur (Wajib)
&lt;/h2&gt;

&lt;p&gt;Sebelum menulis kode Laravel, Anda harus memastikan domain Anda memiliki "Surat Izin Mengemudi" di internet. Tanpa ini, validasi Laravel tidak ada gunanya karena email tetap akan ditolak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Langkah Konfigurasi di Panel Hosting:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Masuk ke &lt;strong&gt;hPanel&lt;/strong&gt; (Hostinger) atau &lt;strong&gt;cPanel&lt;/strong&gt; (Qwords).&lt;/li&gt;
&lt;li&gt; Cari menu &lt;strong&gt;Email Deliverability&lt;/strong&gt; atau &lt;strong&gt;DNS Zone Editor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Pastikan dua &lt;em&gt;record&lt;/em&gt; ini aktif:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SPF (Sender Policy Framework):&lt;/strong&gt; Mengizinkan IP hosting mengirim email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DKIM (DomainKeys Identified Mail):&lt;/strong&gt; Menandatangani email agar tidak dianggap palsu.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Peringatan:&lt;/strong&gt; Jika status SPF/DKIM belum "Active/Valid" (berwarna hijau), jangan lanjutkan ke tahap coding. Hubungi CS Hosting Anda jika bingung cara mengaktifkannya.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  BAGIAN 2: Validasi Tingkat Lanjut (The Gatekeeper)
&lt;/h2&gt;

&lt;p&gt;Di Laravel, kita tidak validasi di Controller, melainkan menggunakan &lt;strong&gt;Form Request&lt;/strong&gt; agar kode bersih dan reusable. Kita akan menggunakan fitur validasi DNS bawaan Laravel.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Buat Request Validation
&lt;/h3&gt;

&lt;p&gt;Jalankan perintah terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:request StoreUserRequest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Terapkan Aturan Ketat
&lt;/h3&gt;

&lt;p&gt;Buka file &lt;code&gt;app/Http/Requests/StoreUserRequest.php&lt;/code&gt; dan ubah menjadi seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Requests&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Foundation\Http\FormRequest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Validation\Rule&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StoreUserRequest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormRequest&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;authorize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Pastikan true agar bisa dipakai&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'required'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'string'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="c1"&gt;// -------------------------------------------------------&lt;/span&gt;
                &lt;span class="c1"&gt;// LAPIS 1: Syntax Check&lt;/span&gt;
                &lt;span class="c1"&gt;// 'rfc' memeriksa kesesuaian format standar internet (RFC)&lt;/span&gt;
                &lt;span class="c1"&gt;// -------------------------------------------------------&lt;/span&gt;
                &lt;span class="c1"&gt;// LAPIS 2: DNS Check (Paling Penting)&lt;/span&gt;
                &lt;span class="c1"&gt;// 'dns' melakukan ping ke domain penerima (MX Record).&lt;/span&gt;
                &lt;span class="c1"&gt;// Jika domain mati/palsu, validasi ini akan GAGAL.&lt;/span&gt;
                &lt;span class="c1"&gt;// -------------------------------------------------------&lt;/span&gt;
                &lt;span class="s1"&gt;'email:rfc,dns'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 

                &lt;span class="c1"&gt;// LAPIS 3: Blacklist Manual (Untuk bot/spam user umum)&lt;/span&gt;
                &lt;span class="s1"&gt;'not_in:test@gmail.com,admin@gmail.com,user@example.com,root@localhost'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

                &lt;span class="c1"&gt;// LAPIS 4: Database Check (Agar tidak duplikat)&lt;/span&gt;
                &lt;span class="s1"&gt;'unique:users,email'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="c1"&gt;// Validasi input lainnya (misal file upload)&lt;/span&gt;
            &lt;span class="s1"&gt;'file'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'required|file|max:2048'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'email.required'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Email wajib diisi.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'email.email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Format email tidak valid.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="c1"&gt;// Pesan ini muncul jika domain penerima mati/tidak ada&lt;/span&gt;
            &lt;span class="s1"&gt;'email.dns'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Domain email tidak ditemukan atau tidak aktif. Mohon gunakan email asli.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'email.not_in'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Alamat email sistem/testing tidak diizinkan.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'email.unique'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Email ini sudah terdaftar.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Opsi Tambahan: Anti-Disposable Email (Opsional)
&lt;/h3&gt;

&lt;p&gt;Jika Anda ingin memblokir email sementara (seperti yopmail), Anda bisa menginstal &lt;em&gt;package&lt;/em&gt; tambahan. Namun, jika ingin tanpa &lt;em&gt;package&lt;/em&gt; (hemat resource), Anda bisa membuat &lt;strong&gt;Custom Rule&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buat Rule:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:rule DisposableEmail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Edit &lt;code&gt;app/Rules/DisposableEmail.php&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;passes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$attribute&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strrchr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"@"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Daftar domain sampah (Anda bisa update manual atau ambil dari API/Json)&lt;/span&gt;
    &lt;span class="nv"&gt;$blockedDomains&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'yopmail.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'mailinator.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'10minutemail.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'tempmail.com'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;in_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;strtolower&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$domain&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nv"&gt;$blockedDomains&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Email sementara (disposable) tidak diizinkan.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pasang di Request tadi:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Rules\DisposableEmail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'required'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'email:rfc,dns'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DisposableEmail&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  BAGIAN 3: Implementasi di Controller
&lt;/h2&gt;

&lt;p&gt;Sekarang controller Anda bersih. Jika kode masuk ke dalam &lt;em&gt;method&lt;/em&gt; controller, berarti email &lt;strong&gt;DIJAMIN&lt;/strong&gt; valid, aktif, dan bukan spam.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Http\Requests\StoreUserRequest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Models\User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Mail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Mail\WelcomeEmail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;StoreUserRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// 1. Upload File (Aman, karena email sudah valid)&lt;/span&gt;
    &lt;span class="nv"&gt;$path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'uploads'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// 2. Simpan User&lt;/span&gt;
    &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
        &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="c1"&gt;// 3. Kirim Email Menggunakan QUEUE (Wajib untuk Shared Hosting)&lt;/span&gt;
    &lt;span class="c1"&gt;// Jangan pakai send(), pakai queue()&lt;/span&gt;
    &lt;span class="nc"&gt;Mail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WelcomeEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;response&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'message'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Registrasi sukses! Cek email Anda.'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  BAGIAN 4: Mengatur Antrean (Queue) di Shared Hosting
&lt;/h2&gt;

&lt;p&gt;Shared hosting memiliki batas waktu eksekusi (timeout) dan batas pengiriman email per jam. Mengirim email secara langsung (&lt;code&gt;send()&lt;/code&gt;) akan membuat loading lama dan berisiko error.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Ubah Driver Queue
&lt;/h3&gt;

&lt;p&gt;Edit file &lt;code&gt;.env&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;QUEUE_CONNECTION=database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Siapkan Tabel Queue
&lt;/h3&gt;

&lt;p&gt;Jalankan di terminal (lokal atau SSH hosting):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan queue:table
php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Setup Worker di Shared Hosting (CRON JOB)
&lt;/h3&gt;

&lt;p&gt;Karena di shared hosting Anda biasanya tidak bisa menjalankan &lt;code&gt;supervisor&lt;/code&gt;, kita gunakan &lt;strong&gt;Cron Job&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Masuk ke panel hosting, cari menu &lt;strong&gt;Cron Jobs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Buat Cron Job baru yang berjalan &lt;strong&gt;Setiap Menit&lt;/strong&gt; (&lt;code&gt;* * * * *&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Masukkan perintah (sesuaikan path dengan hosting Anda):&lt;/li&gt;
&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/bin/php /home/username_hosting/public_html/artisan queue:work &lt;span class="nt"&gt;--stop-when-empty&lt;/span&gt; &lt;span class="nt"&gt;--tries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 &lt;span class="nt"&gt;--timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;90
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Penjelasan Command:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--stop-when-empty&lt;/code&gt;: Worker akan berhenti jika tidak ada email antre (hemat RAM hosting).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--tries=3&lt;/code&gt;: Jika gagal kirim, coba ulang 3 kali sebelum menyerah.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--timeout=90&lt;/code&gt;: Batas waktu proses.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  BAGIAN 5: Tips Keamanan Tambahan (Rate Limiting)
&lt;/h2&gt;

&lt;p&gt;Untuk menghindari blokir dari Hostinger karena mengirim terlalu cepat, tambahkan jeda pada Mailable Anda.&lt;/p&gt;

&lt;p&gt;Buka file Mail Anda (contoh: &lt;code&gt;app/Mail/WelcomeEmail.php&lt;/code&gt;), tambahkan implementasi &lt;code&gt;ShouldQueue&lt;/code&gt; dan properti delay:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Mail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Bus\Queueable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Contracts\Queue\ShouldQueue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Mail\Mailable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Queue\SerializesModels&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Pastikan implement ShouldQueue&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WelcomeEmail&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Mailable&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;ShouldQueue&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Queueable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;SerializesModels&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'emails.welcome'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Selamat Datang!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Trik Delay saat mengirim:&lt;/strong&gt;&lt;br&gt;
Jika Anda melakukan &lt;em&gt;blasting&lt;/em&gt; (kirim ke banyak orang sekaligus), beri jeda manual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Kirim email setiap 10 detik agar Hostinger tidak marah&lt;/span&gt;
    &lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$index&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
    &lt;span class="nc"&gt;Mail&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;later&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$delay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WelcomeEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  RINGKASAN (Checklist)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; ✅ &lt;strong&gt;DNS:&lt;/strong&gt; SPF &amp;amp; DKIM Hostinger sudah aktif.&lt;/li&gt;
&lt;li&gt; ✅ &lt;strong&gt;Validasi:&lt;/strong&gt; Menggunakan &lt;code&gt;email:rfc,dns&lt;/code&gt; di FormRequest.&lt;/li&gt;
&lt;li&gt; ✅ &lt;strong&gt;Queue:&lt;/strong&gt; Menggunakan database queue, bukan &lt;code&gt;sync&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; ✅ &lt;strong&gt;Cron Job:&lt;/strong&gt; Cron job aktif untuk memproses queue di background.&lt;/li&gt;
&lt;li&gt; ✅ &lt;strong&gt;Testing:&lt;/strong&gt; Sudah mencoba kirim ke email sendiri dan &lt;strong&gt;TIDAK&lt;/strong&gt; mencoba ke &lt;code&gt;test@gmail.com&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dokumentasi ini sudah siap Anda gunakan sebagai pedoman standar (SOP) untuk tim development Anda.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>tutorial</category>
      <category>security</category>
      <category>laravel</category>
    </item>
    <item>
      <title>TUTORIAL: Implementasi Email Aman &amp; Anti-Blokir (Zero Bounce Policy)</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Thu, 20 Nov 2025 07:50:17 +0000</pubDate>
      <link>https://dev.to/driannaird/tutorial-implementasi-email-aman-anti-blokir-zero-bounce-policy-2o0c</link>
      <guid>https://dev.to/driannaird/tutorial-implementasi-email-aman-anti-blokir-zero-bounce-policy-2o0c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Target:&lt;/strong&gt; Developer Node.js &amp;amp; Laravel&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Infrastruktur:&lt;/strong&gt; Shared Hosting (Hostinger, Qwords, Niagahoster, dll)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Tujuan:&lt;/strong&gt; Mencegah domain terblokir akibat pengiriman ke email sampah/mati.&lt;/p&gt;


&lt;h2&gt;
  
  
  BAGIAN 1: Persiapan Infrastruktur (Wajib)
&lt;/h2&gt;

&lt;p&gt;Sebelum menyentuh kodingan, Anda &lt;strong&gt;wajib&lt;/strong&gt; memastikan "SIM" (Surat Izin Mengemudi) email domain Anda valid. Tanpa ini, email Anda akan masuk Spam atau ditolak, sebagus apapun kodenya.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Setting DNS (SPF &amp;amp; DKIM)
&lt;/h3&gt;

&lt;p&gt;Masuk ke &lt;strong&gt;hPanel (Hostinger)&lt;/strong&gt; atau &lt;strong&gt;cPanel (Qwords)&lt;/strong&gt; Anda. Cari menu &lt;strong&gt;"Email Deliverability"&lt;/strong&gt; atau &lt;strong&gt;"DNS Zone Editor"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pastikan record berikut ada dan aktif:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Jenis Record&lt;/th&gt;
&lt;th&gt;Nama (Host)&lt;/th&gt;
&lt;th&gt;Value (Contoh)&lt;/th&gt;
&lt;th&gt;Fungsi&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TXT (SPF)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;v=spf1 include:_spf.mail.hostinger.com ~all&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Memberi izin server hosting mengirim email.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TXT (DKIM)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default._domainkey&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(Kode panjang acak dari hosting)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Tanda tangan digital anti-pemalsuan.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Penting:&lt;/strong&gt; Jika status SPF/DKIM di panel hosting belum "Active" (biasanya hijau), jangan lanjut ke tahap koding. Perbaiki ini dulu dengan menghubungi support hosting jika perlu.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  BAGIAN 2: Implementasi di Node.js (Express)
&lt;/h2&gt;

&lt;p&gt;Kita akan membuat middleware yang memvalidasi apakah domain penerima benar-benar punya server email (MX Record) sebelum file di-upload atau email dikirim.&lt;/p&gt;
&lt;h3&gt;
  
  
  Langkah 1: Install Library
&lt;/h3&gt;

&lt;p&gt;Kita butuh library untuk daftar domain sampah (temp mail) agar tidak perlu input manual.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;disposable-email-domains
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 2: Buat Helper Validasi (&lt;code&gt;utils/emailValidator.js&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Copy kode ini. Kode ini menggabungkan Regex, Blacklist Manual, Anti-Disposable, dan Pengecekan DNS MX.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dns&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dns/promises&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;disposableDomains&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;disposable-email-domains&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Fungsi Validasi Email Ketat
 * @param {string} email - Email yang akan dicek
 * @returns {Promise&amp;lt;{isValid: boolean, message: string}&amp;gt;}
 */&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verifyEmailStatus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Cek Format Dasar (Regex)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailRegex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;[^\s&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+@&lt;/span&gt;&lt;span class="se"&gt;[^\s&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;\.[^\s&lt;/span&gt;&lt;span class="sr"&gt;@&lt;/span&gt;&lt;span class="se"&gt;]&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;emailRegex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Format email tidak valid.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Cek Blacklist User (Mencegah kirim ke bot/sistem)&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blockedUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;noreply&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postmaster&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;guest&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blockedUsers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;localPart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alamat email sistem/test tidak diizinkan.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// 3. Cek Domain Sampah (Disposable)&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;disposableDomains&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email sementara (temp mail) ditolak.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// 4. Cek DNS MX Record (INTI KEAMANAN)&lt;/span&gt;
  &lt;span class="c1"&gt;// Memastikan domain tersebut benar-benar melayani email&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mxRecords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolveMx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;mxRecords&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;mxRecords&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Domain email tidak aktif/mati.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Error code ENOTFOUND atau ENODATA berarti domain tidak ada&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Domain email tidak ditemukan.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Email valid.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 3: Pasang di Middleware Upload
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;verifyEmailStatus&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./utils/emailValidator.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Import helper tadi&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uploadMiddleware&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Jalankan validasi ketat&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;validation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;verifyEmailStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isValid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// HAPUS FILE jika email invalid (Penting untuk hemat storage)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unlinkSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Gagal hapus file:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
      &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;validation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; 
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  BAGIAN 3: Implementasi di Laravel (PHP)
&lt;/h2&gt;

&lt;p&gt;Laravel memiliki fitur &lt;code&gt;dns&lt;/code&gt; validation bawaan yang sangat powerfull. Anda tidak perlu koding manual untuk cek MX Record.&lt;/p&gt;

&lt;h3&gt;
  
  
  Langkah 1: Buat Form Request (Rekomendasi)
&lt;/h3&gt;

&lt;p&gt;Jangan validasi di Controller agar kode rapi. Buat Request baru:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:request StoreUserRequest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 2: Terapkan Aturan Validasi
&lt;/h3&gt;

&lt;p&gt;Buka file &lt;code&gt;app/Http/Requests/StoreUserRequest.php&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Requests&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Foundation\Http\FormRequest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Validation\Rule&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StoreUserRequest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;FormRequest&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;authorize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="s1"&gt;'required'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s1"&gt;'string'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="c1"&gt;// PENTING: 'dns' akan melakukan ping ke server email penerima&lt;/span&gt;
                &lt;span class="c1"&gt;// 'rfc' memastikan format standar internet&lt;/span&gt;
                &lt;span class="s1"&gt;'email:rfc,dns'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                &lt;span class="c1"&gt;// Blacklist manual&lt;/span&gt;
                &lt;span class="s1"&gt;'not_in:test@gmail.com,admin@gmail.com,user@example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
            &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="s1"&gt;'file'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'required|file|max:2048'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'email.dns'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Domain email tidak valid atau server email tidak ditemukan.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'email.email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Format email salah.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Langkah 3: Gunakan di Controller
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;StoreUserRequest&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Jika kode sampai sini, berarti email SUDAH PASTI VALID &amp;amp; AKTIF.&lt;/span&gt;
    &lt;span class="c1"&gt;// Laravel otomatis me-redirect kembali dengan error jika validasi DNS gagal.&lt;/span&gt;

    &lt;span class="nv"&gt;$path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$request&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'file'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'uploads'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Lanjut logika kirim email...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  BAGIAN 4: Konfigurasi SMTP (Agar Tidak Terblokir)
&lt;/h2&gt;

&lt;p&gt;Karena Anda menggunakan Shared Hosting, ada batasan kecepatan (Rate Limit). Jangan kirim email secepat kilat.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Nodemailer (Node.js)
&lt;/h3&gt;

&lt;p&gt;Gunakan opsi &lt;code&gt;pool&lt;/code&gt; dan &lt;code&gt;rateLimit&lt;/code&gt; agar pengiriman antre dan tidak membebani server Hostinger.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transporter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;nodemailer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTransport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;smtp.hostinger.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Sesuaikan dengan hosting Anda&lt;/span&gt;
  &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;465&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;secure&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SMTP_USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;pass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;SMTP_PASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// KONFIGURASI PENTING UNTUK SHARED HOSTING:&lt;/span&gt;
  &lt;span class="na"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Menggunakan koneksi yang di-reuse&lt;/span&gt;
  &lt;span class="na"&gt;maxConnections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Jangan buka banyak koneksi sekaligus&lt;/span&gt;
  &lt;span class="na"&gt;maxMessages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Kirim maks 50 pesan per koneksi&lt;/span&gt;
  &lt;span class="na"&gt;rateLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;// Hanya kirim 5 email per detik (Throttling)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setting Laravel
&lt;/h3&gt;

&lt;p&gt;Di Laravel, cara terbaik menangani limit hosting adalah menggunakan &lt;strong&gt;Queue&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Ubah &lt;code&gt;.env&lt;/code&gt;: &lt;code&gt;QUEUE_CONNECTION=database&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Jalankan &lt;code&gt;php artisan queue:table&lt;/code&gt; dan &lt;code&gt;php artisan migrate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Saat mengirim email, gunakan &lt;code&gt;Mail::to($user)-&amp;gt;queue(new WelcomeMail());&lt;/code&gt; (bukan &lt;code&gt;send()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Jalankan worker dengan delay: &lt;code&gt;php artisan queue:work --delay=5&lt;/code&gt; (Jeda 5 detik antar job).&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  BAGIAN 5: Checklist Keamanan &amp;amp; Testing
&lt;/h2&gt;

&lt;p&gt;Sebelum upload ke production, lakukan tes ini.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test ke Email Sendiri:&lt;/strong&gt;&lt;br&gt;
Kirim email dari aplikasi ke &lt;code&gt;email.asli.anda@gmail.com&lt;/code&gt;. Apakah masuk Inbox?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cek Skor Kualitas (Mail-Tester):&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * Buka [mail-tester.com](https://www.mail-tester.com/).
  * Copy alamat email aneh yang diberikan website tersebut.
  * Kirim email dari aplikasi Anda ke alamat tersebut.
  * Cek skornya.
  * 
  * **Target:** Skor minimal **8/10**. Jika di bawah itu, cek lagi SPF/DKIM di Bagian 1.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Test Validasi Error:&lt;/strong&gt;
Coba input email &lt;code&gt;ngawur@domainyanggakada123.com&lt;/code&gt;. Aplikasi &lt;strong&gt;harus&lt;/strong&gt; menolak dan memberikan pesan error "Domain tidak valid". Jika aplikasi menerima email ini, berarti validasi MX Record Anda belum jalan.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Ringkasan "Survival Kit" Anda
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;SPF/DKIM:&lt;/strong&gt; Wajib aktif di hosting.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Node.js:&lt;/strong&gt; Gunakan &lt;code&gt;dns.resolveMx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Laravel:&lt;/strong&gt; Gunakan validasi &lt;code&gt;email:dns&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Rate Limit:&lt;/strong&gt; Jangan kirim email massal sekaligus.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Dilarang:&lt;/strong&gt; Menggunakan &lt;code&gt;test@gmail.com&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dengan mengikuti panduan ini, Anda bisa tenang menggunakan email Hostinger/Qwords untuk production tanpa takut terblokir. Selamat coding!&lt;/p&gt;

</description>
      <category>node</category>
      <category>tutorial</category>
      <category>security</category>
      <category>laravel</category>
    </item>
    <item>
      <title>The Rust Programming Language bahasa indonesia</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Tue, 06 May 2025 10:11:29 +0000</pubDate>
      <link>https://dev.to/driannaird/the-rust-programming-language-bahasa-indonesia-359n</link>
      <guid>https://dev.to/driannaird/the-rust-programming-language-bahasa-indonesia-359n</guid>
      <description>&lt;h2&gt;
  
  
  📌 Konsep Dasar Rust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pengantar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust adalah bahasa pemrograman sistem yang mengutamakan kecepatan, keamanan, dan kontrol atas memori.&lt;/li&gt;
&lt;li&gt;Menyediakan kekuatan low-level (seperti C/C++) dengan ergonomi high-level.&lt;/li&gt;
&lt;li&gt;Compiler Rust sangat ketat, membantu mencegah bug sejak awal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Siapa yang Cocok Menggunakan Rust?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tim Developer:&lt;/strong&gt; Mempermudah kolaborasi dengan sistem type dan error yang kuat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mahasiswa &amp;amp; Pelajar:&lt;/strong&gt; Komunitas terbuka dan mendukung pembelajaran sistem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perusahaan:&lt;/strong&gt; Digunakan di CLI tools, embedded, web service, machine learning, dsb.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Source Developer:&lt;/strong&gt; Banyak peluang kontribusi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Penggemar Kecepatan &amp;amp; Stabilitas:&lt;/strong&gt; Fokus pada zero-cost abstraction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Instalasi dan Dasar Penggunaan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Instalasi Rust
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;rustup&lt;/code&gt; untuk instalasi dan manajemen versi.&lt;/li&gt;
&lt;li&gt;Dilengkapi dengan dokumentasi lokal (&lt;code&gt;rustup doc&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Alat penting:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rustc&lt;/code&gt;: Compiler utama.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo&lt;/code&gt;: Package manager &amp;amp; build system.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Menulis Program Pertama: Hello, World!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;File: &lt;code&gt;main.rs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Struktur dasar:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Kompilasi manual: &lt;code&gt;rustc main.rs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Eksekusi: &lt;code&gt;./main&lt;/code&gt; atau &lt;code&gt;main.exe&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Manajemen Proyek dengan Cargo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Cargo?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tools default untuk membuat, membangun, dan menjalankan proyek Rust.&lt;/li&gt;
&lt;li&gt;Mengelola dependensi (crates), build, dan distribusi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dasar-dasar Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cargo new project_name&lt;/code&gt;: Membuat proyek baru.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo build&lt;/code&gt;: Kompilasi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo run&lt;/code&gt;: Kompilasi &amp;amp; eksekusi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo check&lt;/code&gt;: Mengecek kesalahan tanpa build.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo build --release&lt;/code&gt;: Build dengan optimisasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Struktur Proyek Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Cargo.toml&lt;/code&gt;: Konfigurasi proyek dan dependensi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/main.rs&lt;/code&gt;: Entry point program.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎮 Bab 2: Membuat Game "Guess the Number"
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tujuan Proyek
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menebak angka acak antara 1-100.&lt;/li&gt;
&lt;li&gt;Program memberi tahu apakah tebakan terlalu tinggi, rendah, atau tepat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Konsep yang Diperkenalkan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;use std::io;&lt;/code&gt;: Mengambil input dari pengguna.&lt;/li&gt;
&lt;li&gt;Variabel dengan &lt;code&gt;let&lt;/code&gt; dan &lt;code&gt;mut&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;String dan konversi ke angka (&lt;code&gt;parse::&amp;lt;u32&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Shadowing: Mendeklarasikan ulang variabel dengan nama yang sama.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rand&lt;/code&gt; crate: Digunakan untuk menghasilkan angka acak.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ordering&lt;/code&gt; dan &lt;code&gt;match&lt;/code&gt;: Digunakan untuk membandingkan dan menangani hasil tebakan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh Match Expression
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="nf"&gt;.cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;secret_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Less&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Too small!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Greater&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Too big!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You win!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error Handling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;expect("error message")&lt;/code&gt;: Menangani error pada operasi I/O atau parsing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Floating Topics (Topik Tambahan)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crate dan Dependency Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Semua crate eksternal dideklarasikan di &lt;code&gt;[dependencies]&lt;/code&gt; dalam &lt;code&gt;Cargo.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cargo akan membuat &lt;code&gt;Cargo.lock&lt;/code&gt; untuk menjaga versi dependensi tetap konsisten.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools Pendukung
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rustfmt&lt;/code&gt;: Formatter otomatis untuk kode Rust.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rust-analyzer&lt;/code&gt;: IntelliSense &amp;amp; error hints di editor.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>The Rust Programming Language bahasa indonesia</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Tue, 15 Apr 2025 10:34:28 +0000</pubDate>
      <link>https://dev.to/driannaird/the-rust-programming-language-bahasa-indonesia-1el1</link>
      <guid>https://dev.to/driannaird/the-rust-programming-language-bahasa-indonesia-1el1</guid>
      <description>&lt;h2&gt;
  
  
  📌 Konsep Dasar Rust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pengantar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust adalah bahasa pemrograman sistem yang mengutamakan kecepatan, keamanan, dan kontrol atas memori.&lt;/li&gt;
&lt;li&gt;Menyediakan kekuatan low-level (seperti C/C++) dengan ergonomi high-level.&lt;/li&gt;
&lt;li&gt;Compiler Rust sangat ketat, membantu mencegah bug sejak awal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Siapa yang Cocok Menggunakan Rust?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tim Developer:&lt;/strong&gt; Mempermudah kolaborasi dengan sistem type dan error yang kuat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mahasiswa &amp;amp; Pelajar:&lt;/strong&gt; Komunitas terbuka dan mendukung pembelajaran sistem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perusahaan:&lt;/strong&gt; Digunakan di CLI tools, embedded, web service, machine learning, dsb.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Source Developer:&lt;/strong&gt; Banyak peluang kontribusi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Penggemar Kecepatan &amp;amp; Stabilitas:&lt;/strong&gt; Fokus pada zero-cost abstraction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Instalasi dan Dasar Penggunaan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Instalasi Rust
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;rustup&lt;/code&gt; untuk instalasi dan manajemen versi.&lt;/li&gt;
&lt;li&gt;Dilengkapi dengan dokumentasi lokal (&lt;code&gt;rustup doc&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Alat penting:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rustc&lt;/code&gt;: Compiler utama.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo&lt;/code&gt;: Package manager &amp;amp; build system.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Menulis Program Pertama: Hello, World!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;File: &lt;code&gt;main.rs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Struktur dasar:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Kompilasi manual: &lt;code&gt;rustc main.rs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Eksekusi: &lt;code&gt;./main&lt;/code&gt; atau &lt;code&gt;main.exe&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Manajemen Proyek dengan Cargo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Cargo?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tools default untuk membuat, membangun, dan menjalankan proyek Rust.&lt;/li&gt;
&lt;li&gt;Mengelola dependensi (crates), build, dan distribusi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dasar-dasar Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cargo new project_name&lt;/code&gt;: Membuat proyek baru.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo build&lt;/code&gt;: Kompilasi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo run&lt;/code&gt;: Kompilasi &amp;amp; eksekusi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo check&lt;/code&gt;: Mengecek kesalahan tanpa build.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo build --release&lt;/code&gt;: Build dengan optimisasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Struktur Proyek Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Cargo.toml&lt;/code&gt;: Konfigurasi proyek dan dependensi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/main.rs&lt;/code&gt;: Entry point program.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎮 Bab 2: Membuat Game "Guess the Number"
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tujuan Proyek
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menebak angka acak antara 1-100.&lt;/li&gt;
&lt;li&gt;Program memberi tahu apakah tebakan terlalu tinggi, rendah, atau tepat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Konsep yang Diperkenalkan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;use std::io;&lt;/code&gt;: Mengambil input dari pengguna.&lt;/li&gt;
&lt;li&gt;Variabel dengan &lt;code&gt;let&lt;/code&gt; dan &lt;code&gt;mut&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;String dan konversi ke angka (&lt;code&gt;parse::&amp;lt;u32&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Shadowing: Mendeklarasikan ulang variabel dengan nama yang sama.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rand&lt;/code&gt; crate: Digunakan untuk menghasilkan angka acak.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ordering&lt;/code&gt; dan &lt;code&gt;match&lt;/code&gt;: Digunakan untuk membandingkan dan menangani hasil tebakan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh Match Expression
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="nf"&gt;.cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;secret_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Less&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Too small!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Greater&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Too big!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You win!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error Handling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;expect("error message")&lt;/code&gt;: Menangani error pada operasi I/O atau parsing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Floating Topics (Topik Tambahan)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crate dan Dependency Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Semua crate eksternal dideklarasikan di &lt;code&gt;[dependencies]&lt;/code&gt; dalam &lt;code&gt;Cargo.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cargo akan membuat &lt;code&gt;Cargo.lock&lt;/code&gt; untuk menjaga versi dependensi tetap konsisten.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools Pendukung
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rustfmt&lt;/code&gt;: Formatter otomatis untuk kode Rust.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rust-analyzer&lt;/code&gt;: IntelliSense &amp;amp; error hints di editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧾 Variabel dan Mutabilitas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Variabel
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dideklarasikan dengan &lt;code&gt;let&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Secara default &lt;strong&gt;immutable&lt;/strong&gt; (tidak bisa diubah).&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;mut&lt;/code&gt; untuk menjadikannya mutable.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// immutable&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// mutable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Shadowing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Variabel dapat dideklarasikan ulang dengan nama yang sama.&lt;/li&gt;
&lt;li&gt;Berguna untuk mengganti tipe data atau memperbarui nilai.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔢 Tipe Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scalar Types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integer (&lt;code&gt;i32&lt;/code&gt;, &lt;code&gt;u32&lt;/code&gt;, dll)&lt;/li&gt;
&lt;li&gt;Floating-point (&lt;code&gt;f64&lt;/code&gt;, &lt;code&gt;f32&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Boolean (&lt;code&gt;bool&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Character (&lt;code&gt;char&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compound Types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tuple: Dapat menggabungkan beberapa tipe.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Array: Koleksi dengan ukuran tetap.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Fungsi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Didefinisikan dengan &lt;code&gt;fn&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Bisa mengembalikan nilai dengan &lt;code&gt;-&amp;gt; T&lt;/code&gt; dan &lt;code&gt;return&lt;/code&gt;, atau langsung ekspresi di akhir blok.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💬 Komentar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Komentar satu baris: &lt;code&gt;// komentar&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Komentar dokumentasi: &lt;code&gt;///&lt;/code&gt; (digunakan di crate atau API docs)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔁 Kontrol Alur
&lt;/h2&gt;

&lt;h3&gt;
  
  
  if Expressions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dapat digunakan seperti ekspresi, bukan hanya statement.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  loop
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Perulangan tak hingga sampai &lt;code&gt;break&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  while
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Perulangan dengan syarat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Paling idiomatik untuk iterasi koleksi.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.rev&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{number}!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔐 Apa Itu Ownership?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Konsep Dasar
&lt;/h3&gt;

&lt;p&gt;Ownership adalah sistem pengelolaan memori di Rust dengan aturan yang dicek oleh compiler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Setiap nilai memiliki satu "pemilik" (owner)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hanya satu owner yang aktif dalam satu waktu&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ketika owner keluar dari scope, nilai akan di-&lt;em&gt;drop&lt;/em&gt; secara otomatis&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Keuntungan:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tidak ada &lt;em&gt;garbage collector&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Menghindari memory leak dan double free.&lt;/li&gt;
&lt;li&gt;Performa tinggi dan aman.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Stack vs Heap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan untuk data berukuran tetap.&lt;/li&gt;
&lt;li&gt;Akses cepat, LIFO (Last In First Out).&lt;/li&gt;
&lt;li&gt;Contoh: integer, float, boolean.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Heap
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Untuk data berukuran dinamis.&lt;/li&gt;
&lt;li&gt;Alokasi lebih lambat, tapi fleksibel.&lt;/li&gt;
&lt;li&gt;Contoh: &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Vec&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎁 Ownership pada Tipe Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tipe Copy vs Move
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tipe sederhana (seperti &lt;code&gt;i32&lt;/code&gt;) di-&lt;em&gt;copy&lt;/em&gt; secara default.&lt;/li&gt;
&lt;li&gt;Tipe kompleks (seperti &lt;code&gt;String&lt;/code&gt;) di-&lt;em&gt;move&lt;/em&gt;:

&lt;ul&gt;
&lt;li&gt;Setelah dipindahkan, variabel asal tidak bisa digunakan lagi.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// Copy&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// x masih bisa digunakan&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// s1 sudah tidak bisa digunakan&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clone
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;.clone()&lt;/code&gt; untuk menyalin data kompleks jika ingin kedua variabel tetap valid.&lt;/p&gt;




&lt;h2&gt;
  
  
  📤 Fungsi dan Ownership
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Passing ke fungsi &lt;strong&gt;memindahkan&lt;/strong&gt; ownership (jika bukan tipe Copy).&lt;/li&gt;
&lt;li&gt;Fungsi dapat &lt;strong&gt;mengembalikan ownership&lt;/strong&gt; agar nilai bisa digunakan kembali.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;takes_ownership&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;gives_ownership&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 Borrowing dan Referensi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Immutable Reference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;&amp;amp;&lt;/code&gt; untuk meminjam nilai tanpa mengambil kepemilikan.&lt;/li&gt;
&lt;li&gt;Hanya bisa memiliki &lt;strong&gt;satu atau lebih immutable borrow&lt;/strong&gt; secara bersamaan.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;calculate_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mutable Reference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;&amp;amp;mut&lt;/code&gt; untuk referensi yang bisa diubah.&lt;/li&gt;
&lt;li&gt;Hanya boleh ada &lt;strong&gt;satu mutable borrow&lt;/strong&gt; dalam satu waktu.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;some_string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;some_string&lt;/span&gt;&lt;span class="nf"&gt;.push_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", world"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Tidak boleh campur &lt;code&gt;&amp;amp;&lt;/code&gt; dan &lt;code&gt;&amp;amp;mut&lt;/code&gt; pada saat bersamaan karena akan menimbulkan race condition.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✂️ Slices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Slice memungkinkan akses ke bagian dari koleksi tanpa mengambil ownership.&lt;/li&gt;
&lt;li&gt;Contoh: &lt;code&gt;&amp;amp;str&lt;/code&gt;, &lt;code&gt;&amp;amp;[T]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;  &lt;span class="c1"&gt;// slice ke "hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  String Slice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Umum digunakan untuk parameter fungsi yang menerima &lt;code&gt;&amp;amp;str&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Ownership memungkinkan Rust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mengelola memori tanpa runtime GC.&lt;/li&gt;
&lt;li&gt;Mencegah bug umum seperti use-after-free dan race condition.&lt;/li&gt;
&lt;li&gt;Mengutamakan keamanan dan efisiensi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Struct&lt;/strong&gt;, yaitu tipe data yang memungkinkan pengelompokan data secara terstruktur dan bermakna. Struct juga membuka pintu bagi pendekatan object-oriented melalui method dan fungsi terkait.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Definisi dan Pembuatan Struct
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Struct Biasa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Struct didefinisikan dengan keyword &lt;code&gt;struct&lt;/code&gt;, diikuti nama, dan daftar field.&lt;/li&gt;
&lt;li&gt;Field memiliki nama dan tipe.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sign_in_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instansiasi Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;{}&lt;/code&gt; dengan pasangan &lt;code&gt;field: value&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;user1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"someone@example.com"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"someuser"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sign_in_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Struct Update Syntax
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;..&lt;/code&gt; untuk menyalin nilai dari struct lain.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;user2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"another@example.com"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;user1&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Perlu diperhatikan: field yang bertipe &lt;code&gt;String&lt;/code&gt; akan &lt;em&gt;moved&lt;/em&gt; jika dipakai dalam &lt;code&gt;..user1&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 Jenis Struct Lain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tuple Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Seperti tuple, tapi dengan nama struct sebagai pembeda tipe.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nf"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Unit-like Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Struct tanpa field, berguna untuk trait atau marker.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;AlwaysEqual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📐 Method dan &lt;code&gt;impl&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Block &lt;code&gt;impl&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tempat mendefinisikan method dan fungsi terkait (associated functions).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.height&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;can_hold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.width&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="py"&gt;.width&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.height&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="py"&gt;.height&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method vs Associated Function
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Method: memiliki parameter &lt;code&gt;&amp;amp;self&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Associated function: tidak memiliki &lt;code&gt;self&lt;/code&gt;, dipanggil dengan &lt;code&gt;::&lt;/code&gt;, seperti constructor.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📏 Studi Kasus: Menghitung Luas Persegi Panjang
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Refactor Kode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dari parameter longgar → tuple → struct.&lt;/li&gt;
&lt;li&gt;Struct membuat kode lebih bermakna dan eksplisit.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Struct adalah cara idiomatik Rust untuk membuat tipe kustom.&lt;/li&gt;
&lt;li&gt;Memberikan konteks dan keterbacaan lebih baik daripada tuple.&lt;/li&gt;
&lt;li&gt;Melalui &lt;code&gt;impl&lt;/code&gt;, kita bisa menambahkan perilaku (behavior) ke struct.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;enum&lt;/strong&gt;, salah satu fitur paling ekspresif di Rust, serta &lt;em&gt;pattern matching&lt;/em&gt; menggunakan &lt;code&gt;match&lt;/code&gt; dan &lt;code&gt;if let&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎲 Apa Itu Enum?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enum (enumeration) adalah tipe data yang bisa memiliki beberapa &lt;em&gt;variant&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Setiap variant bisa menyimpan data berbeda.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;IpAddrKind&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;V6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enum dengan Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Variant bisa membawa data, mirip struct atau tuple.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;IpAddr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;V6&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enum vs Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan struct jika semua data diperlukan bersamaan.&lt;/li&gt;
&lt;li&gt;Gunakan enum jika hanya satu dari sekian kemungkinan yang relevan dalam satu waktu.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Contoh Kasus: IP Address
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Struct alternatif (lebih verbose):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;IpAddr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IpAddrKind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enum lebih ringkas:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;IpAddr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;V6&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✨ Pattern Matching dengan &lt;code&gt;match&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan untuk mencocokkan nilai dengan pola tertentu.&lt;/li&gt;
&lt;li&gt;Menjamin semua kasus ditangani (exhaustive).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;coin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Penny&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nickel&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Quarter&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;match&lt;/code&gt; dengan Enum
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dapat mengambil dan menggunakan data dalam variant.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Quit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Move&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Move&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Move to {x}, {y}"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📦 Enum &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mengganti penggunaan null (tidak ada nilai).&lt;/li&gt;
&lt;li&gt;Bentuk:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Some(T)&lt;/code&gt; jika ada nilai.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;None&lt;/code&gt; jika tidak ada nilai.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;some_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;absent_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching dengan Option
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nb"&gt;None&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Rust memaksa penanganan semua kemungkinan (&lt;code&gt;Some&lt;/code&gt; dan &lt;code&gt;None&lt;/code&gt;) untuk mencegah bug.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Idiomatik: &lt;code&gt;if let&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sintaks ringkas untuk menangani satu pola.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;some_value&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Three!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enum membantu representasi logika program yang kompleks dan bervariasi.&lt;/li&gt;
&lt;li&gt;Digabungkan dengan &lt;code&gt;match&lt;/code&gt;, memberikan kontrol alur yang powerful dan aman.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt; adalah contoh enum yang banyak digunakan dalam Rust untuk menangani ketidakpastian nilai tanpa null.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini menjelaskan bagaimana Rust mengorganisasi program dalam skala besar, termasuk struktur proyek, pemisahan kode, dan kontrol visibilitas.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Package dan Crate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Unit kompilasi terkecil di Rust.&lt;/li&gt;
&lt;li&gt;Bisa berupa:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Binary crate&lt;/strong&gt;: memiliki fungsi &lt;code&gt;main()&lt;/code&gt;, menghasilkan executable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Library crate&lt;/strong&gt;: tidak memiliki &lt;code&gt;main()&lt;/code&gt;, digunakan sebagai pustaka.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Package
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kumpulan dari satu atau lebih crate.&lt;/li&gt;
&lt;li&gt;Harus memiliki minimal satu crate (binary atau library).&lt;/li&gt;
&lt;li&gt;Didefinisikan melalui &lt;code&gt;Cargo.toml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Konvensi Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/main.rs&lt;/code&gt;: root dari binary crate.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/lib.rs&lt;/code&gt;: root dari library crate.&lt;/li&gt;
&lt;li&gt;Bisa memiliki banyak binary crate di &lt;code&gt;src/bin/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Module
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tujuan Module
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mengorganisasi kode menjadi bagian-bagian yang reusable dan terpisah.&lt;/li&gt;
&lt;li&gt;Mencegah konflik nama dan meningkatkan keterbacaan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cara Mendeklarasikan Module
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mod nama_module;&lt;/code&gt; di file utama (&lt;code&gt;main.rs&lt;/code&gt; atau &lt;code&gt;lib.rs&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;File atau folder yang sesuai harus tersedia:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mod garden;&lt;/code&gt; → akan cari di &lt;code&gt;garden.rs&lt;/code&gt; atau &lt;code&gt;garden/mod.rs&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Submodule
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bisa didefinisikan di dalam file module utama, atau dalam file tersendiri di dalam folder module.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔐 Kontrol Visibilitas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Default: item bersifat privat dalam module.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;pub&lt;/code&gt; untuk membuat item publik (dapat diakses dari luar module).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;add_to_waitlist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;use&lt;/code&gt; untuk mengimpor path agar lebih singkat.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;front_of_house&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hosting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nn"&gt;hosting&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;add_to_waitlist&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Paths dalam Module
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Absolute Path
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dimulai dari crate root.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;front_of_house&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;hosting&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;add_to_waitlist&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Relative Path
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dimulai dari module saat ini menggunakan &lt;code&gt;self&lt;/code&gt;, &lt;code&gt;super&lt;/code&gt;, atau nama module langsung.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✂️ Pemisahan File
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Structurisasi kode modular dengan memecah file besar.&lt;/li&gt;
&lt;li&gt;Setiap &lt;code&gt;mod&lt;/code&gt; bisa dideklarasikan ke file terpisah.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;front_of_house&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// front_of_house.rs&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;back_of_house&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// back_of_house.rs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Packages dan crates mengelola distribusi dan kompilasi kode.&lt;/li&gt;
&lt;li&gt;Modules membantu pemisahan logika dan kontrol akses.&lt;/li&gt;
&lt;li&gt;Fitur &lt;code&gt;use&lt;/code&gt;, &lt;code&gt;mod&lt;/code&gt;, &lt;code&gt;pub&lt;/code&gt;, dan path sangat penting untuk proyek skala besar.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini membahas tiga struktur data penting yang disediakan oleh pustaka standar Rust: &lt;code&gt;Vec&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, dan &lt;code&gt;HashMap&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Vector (&lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Struktur data dinamis untuk menyimpan elemen bertipe sama.&lt;/li&gt;
&lt;li&gt;Disimpan berdampingan dalam memori (heap).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// makro literal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Akses dan Iterasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan indeks: &lt;code&gt;v[0]&lt;/code&gt;, atau &lt;code&gt;.get(index)&lt;/code&gt; untuk hasil &lt;code&gt;Option&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Iterasi menggunakan &lt;code&gt;for&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{i}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mutasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dapat dimutasi menggunakan &lt;code&gt;.push()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Borrow checker mencegah kombinasi pinjam immutable dan mutable secara bersamaan.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧵 String (&lt;code&gt;String&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tipe dan Representasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;String&lt;/code&gt; adalah koleksi karakter berbasis UTF-8 yang dapat dimodifikasi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;str&lt;/code&gt; adalah string slice (biasanya literal string).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pembuatan dan Manipulasi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.push_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", world!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Indexing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tidak bisa diindeks seperti array karena karakter UTF-8 bisa lebih dari 1 byte.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Iterasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.chars()&lt;/code&gt; untuk karakter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.bytes()&lt;/code&gt; untuk byte
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s"&gt;"Зд"&lt;/span&gt;&lt;span class="nf"&gt;.chars&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{c}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🗺️ Hash Map (&lt;code&gt;HashMap&amp;lt;K, V&amp;gt;&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Koleksi pasangan kunci-nilai, seperti dictionary di bahasa lain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Blue"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Akses dan Iterasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;.get()&lt;/code&gt; untuk mengakses nilai.&lt;/li&gt;
&lt;li&gt;Iterasi dengan &lt;code&gt;for (key, value) in &amp;amp;hash_map&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ownership
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Key dan value bisa &lt;em&gt;move&lt;/em&gt; ke dalam map.&lt;/li&gt;
&lt;li&gt;Tipe &lt;code&gt;Copy&lt;/code&gt; disalin, &lt;code&gt;String&lt;/code&gt; dipindahkan.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Borrowing dan Koleksi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Koleksi berbasis heap bisa mengubah lokasi memori saat mutasi (contoh: &lt;code&gt;.push()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Rust mencegah penggunaan referensi setelah potensi perubahan memori.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// error: borrow conflict&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Koleksi di Rust mengutamakan efisiensi dan keamanan memori.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Vec&lt;/code&gt; untuk daftar nilai, &lt;code&gt;String&lt;/code&gt; untuk teks, &lt;code&gt;HashMap&lt;/code&gt; untuk asosiatif.&lt;/li&gt;
&lt;li&gt;Semua koleksi mengikuti aturan ownership dan borrowing yang ketat.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Rust membedakan dua jenis error:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unrecoverable Errors&lt;/strong&gt;: Tidak bisa diperbaiki, program akan dihentikan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recoverable Errors&lt;/strong&gt;: Bisa ditangani dan program bisa lanjut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rust tidak menggunakan &lt;em&gt;exceptions&lt;/em&gt;, tetapi memakai enum &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt; dan makro &lt;code&gt;panic!&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💥 Unrecoverable Errors dengan &lt;code&gt;panic!&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Penggunaan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Untuk error serius yang tidak dapat diantisipasi.&lt;/li&gt;
&lt;li&gt;Akan menghentikan eksekusi program dan mencetak pesan error.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;panic!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Something went wrong!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Default Behavior
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust melakukan &lt;strong&gt;unwinding&lt;/strong&gt;: membersihkan stack.&lt;/li&gt;
&lt;li&gt;Bisa diubah menjadi &lt;strong&gt;abort&lt;/strong&gt; untuk binary lebih kecil:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[profile.release]&lt;/span&gt;
&lt;span class="py"&gt;panic&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'abort'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Recoverable Errors dengan &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Struktur
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ok(T)&lt;/code&gt; → Operasi sukses.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Err(E)&lt;/code&gt; → Operasi gagal dengan alasan tertentu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh Penggunaan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.txt"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;match&lt;/code&gt; atau &lt;code&gt;if let&lt;/code&gt; untuk menangani &lt;code&gt;Result&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// gunakan file&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ❓ Operator &lt;code&gt;?&lt;/code&gt; untuk Propagasi Error
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fungsi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mempermudah propagasi error ke pemanggil fungsi.&lt;/li&gt;
&lt;li&gt;Jika hasil &lt;code&gt;Result&lt;/code&gt; adalah &lt;code&gt;Err&lt;/code&gt;, maka akan langsung return dari fungsi.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔧 Menentukan Strategi Penanganan Error
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gunakan &lt;code&gt;panic!&lt;/code&gt; jika:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Error adalah bug (contoh: indeks di luar batas array).&lt;/li&gt;
&lt;li&gt;Program tidak bisa lanjut.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gunakan &lt;code&gt;Result&lt;/code&gt; jika:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Error bisa terjadi karena kondisi eksternal (file tidak ditemukan, koneksi gagal).&lt;/li&gt;
&lt;li&gt;Program bisa mengambil tindakan alternatif.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📌 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust mengharuskan kita untuk &lt;em&gt;menyadari dan menangani error&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;panic!&lt;/code&gt; untuk error fatal, &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt; untuk error yang dapat ditangani.&lt;/li&gt;
&lt;li&gt;Operator &lt;code&gt;?&lt;/code&gt; menyederhanakan penanganan error yang dibungkus dalam &lt;code&gt;Result&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini memperkenalkan tiga fitur powerful untuk menulis kode fleksibel dan reusable di Rust: &lt;strong&gt;Generics&lt;/strong&gt;, &lt;strong&gt;Traits&lt;/strong&gt;, dan &lt;strong&gt;Lifetimes&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Generics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Generic?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generic adalah placeholder tipe yang memungkinkan fungsi, struct, enum, dan method digunakan dengan berbagai tipe tanpa mengulang kode.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;largest&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;PartialOrd&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Penggunaan Generic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fungsi: Gunakan &lt;code&gt;T&lt;/code&gt; sebagai pengganti tipe konkret.&lt;/li&gt;
&lt;li&gt;Struct:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enum:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Monomorphization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust akan mengubah generic menjadi tipe konkret saat kompilasi → &lt;strong&gt;tidak ada cost runtime&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Traits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi Trait
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Trait adalah kumpulan method yang dapat diimplementasikan oleh tipe.&lt;/li&gt;
&lt;li&gt;Mirip konsep interface di bahasa lain.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;Summary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trait Bound
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan untuk membatasi generic hanya ke tipe yang mengimplementasikan trait tertentu.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Summary&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Breaking news! {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="nf"&gt;.summarize&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Bisa juga menggunakan &lt;code&gt;where&lt;/code&gt; untuk memperjelas kode panjang.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧬 Lifetimes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Lifetime?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lifetime adalah anotasi pada referensi untuk memastikan referensi tetap valid.&lt;/li&gt;
&lt;li&gt;Tujuan utama: mencegah &lt;strong&gt;dangling references&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh Sederhana
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;longest&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// mengembalikan referensi yang berlaku selama lifetime 'a&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lifetime Elision
&lt;/h3&gt;

&lt;p&gt;Rust sering bisa menyimpulkan lifetime secara otomatis. Tapi saat kompleksitas meningkat, kita perlu menuliskannya secara eksplisit.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;'static&lt;/code&gt; Lifetime
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menunjukkan bahwa referensi berlaku sepanjang umur program.&lt;/li&gt;
&lt;li&gt;Semua string literal memiliki lifetime &lt;code&gt;'static&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Kombinasi: Generics + Trait Bounds + Lifetimes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;announce_and_return_part&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;announcement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Display&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Announcement: {announcement}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generics&lt;/strong&gt;: Kode lebih fleksibel dan reusable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traits&lt;/strong&gt;: Membuat abstraksi perilaku dan batasan tipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifetimes&lt;/strong&gt;: Mencegah kesalahan referensi memori secara aman.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semua fitur ini dicek &lt;strong&gt;di waktu kompilasi&lt;/strong&gt;, sehingga aman dan tetap efisien.&lt;/p&gt;




&lt;p&gt;Part ini membahas bagaimana menulis dan menjalankan &lt;em&gt;unit tests&lt;/em&gt; dan &lt;em&gt;integration tests&lt;/em&gt; di Rust. Tujuannya adalah memastikan bahwa program berjalan sesuai harapan dan tetap benar setelah perubahan kode.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Struktur Dasar Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fungsi Test
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Test adalah fungsi biasa dengan atribut &lt;code&gt;#[test]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dijalankan menggunakan perintah:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  cargo &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;it_works&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tiga Langkah Umum Test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Setup data atau state.&lt;/li&gt;
&lt;li&gt;Jalankan kode yang ingin diuji.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;em&gt;assertion&lt;/em&gt; untuk memastikan hasil sesuai ekspektasi.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ Macro untuk Assertion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assert!(condition)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert_eq!(left, right)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert_ne!(left, right)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika assertion gagal, &lt;code&gt;panic!&lt;/code&gt; akan terjadi dan test akan gagal.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Unit Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Karakteristik:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diletakkan dalam file yang sama dengan kode (&lt;code&gt;src/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Di dalam module &lt;code&gt;#[cfg(test)]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dapat mengakses item private.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;#[test]&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;internal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;internal_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔗 Integration Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Karakteristik:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diletakkan di folder &lt;code&gt;tests/&lt;/code&gt; di luar &lt;code&gt;src/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Diperlakukan sebagai crate terpisah.&lt;/li&gt;
&lt;li&gt;Hanya bisa mengakses public API.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/integration_test.rs&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;adder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;add_two&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;it_adds_two&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;add_two&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Pengaturan Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#[should_panic]&lt;/code&gt;: Menandai bahwa test seharusnya gagal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[ignore]&lt;/code&gt;: Melewatkan test secara default, bisa dijalankan dengan &lt;code&gt;cargo test -- --ignored&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="nd"&gt;#[should_panic(expected&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"panic message"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;it_panics&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;panic!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"panic message"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Dokumentasi dan Test
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Komentar dokumentasi (&lt;code&gt;///&lt;/code&gt;) bisa berisi contoh kode.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo test&lt;/code&gt; akan menjalankan contoh di dokumen sebagai test (doc-tests).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// # Examples&lt;/span&gt;
&lt;span class="cd"&gt;/// ```&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/// assert_eq!(add(2, 2), 4);&lt;/span&gt;
&lt;span class="cd"&gt;///&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🧠 Kesimpulan

- Rust mendukung testing terstruktur dengan `#[test]` dan `cargo test`.
- Unit test dan integration test membantu memverifikasi baik fungsi tunggal maupun interaksi antarbagian.
- Tools dan makro test-nya efisien, aman, dan mudah digunakan untuk pengembangan yang andal.

---

Part ini menerapkan berbagai konsep Rust melalui proyek nyata: membuat program CLI yang mencari string dalam file, mirip dengan alat UNIX `grep`.

---

## 🎯 Tujuan Proyek

- Membangun tool CLI `minigrep`.
- Input: 2 argumen command line (`search term` dan `file path`).
- Output: Menampilkan baris dalam file yang mengandung `search term`.

---

## 🧱 Struktur Proyek

### File dan Module
- `src/main.rs`: entry point, bertugas parsing argumen dan memanggil logika dari `lib.rs`.
- `src/lib.rs`: berisi fungsi utama program dan logic `search`.

### Konsep yang Dipakai
- Argument parsing via `std::env::args`.
- Error handling dengan `Result`.
- File I/O dengan `std::fs`.
- Unit testing.
- Environment variable (`CASE_INSENSITIVE`).
- Penulisan ke `stderr` untuk pesan error.

---

## ⚙️ Tahapan Implementasi

### 1. Membaca Argument CLI


```rust
use std::env;

fn main() {
    let args: Vec&amp;lt;String&amp;gt; = env::args().collect();
    dbg!(args);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Struktur &lt;code&gt;Config&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Memisahkan parsing ke dalam struct &lt;code&gt;Config&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fungsi &lt;code&gt;Config::build&lt;/code&gt; mengembalikan &lt;code&gt;Result&amp;lt;Config, &amp;amp;str&amp;gt;&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Membaca File dan Menjalankan Pencarian
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;read_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="py"&gt;.file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="py"&gt;.query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{line}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Fungsi &lt;code&gt;search&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menerima query dan konten, mengembalikan vector string yang cocok.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="nf"&gt;.lines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="nf"&gt;.contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Menambahkan Test
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;case_sensitive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"duct"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;
Rust:
safe, fast, productive.
Pick three."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"safe, fast, productive."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Environment Variable untuk Case-Insensitive
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jika &lt;code&gt;CASE_INSENSITIVE&lt;/code&gt; diset, program akan menggunakan pencarian yang tidak sensitif terhadap kapital.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CASE_INSENSITIVE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.is_ok&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🖨️ Output ke stderr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;eprintln!()&lt;/code&gt; untuk error message → memungkinkan output utama bisa diarahkan ke file (&lt;code&gt;&amp;gt; output.txt&lt;/code&gt;), sedangkan error tetap tampil di terminal.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Proyek &lt;code&gt;minigrep&lt;/code&gt; adalah penerapan nyata konsep Rust:

&lt;ul&gt;
&lt;li&gt;Argument parsing&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Modularisasi kode&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;File I/O&lt;/li&gt;
&lt;li&gt;Trait, lifetime, dan closure dasar&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Memberi gambaran bagaimana membangun CLI tool profesional.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini membahas fitur Rust yang terinspirasi dari paradigma fungsional, seperti &lt;strong&gt;closures&lt;/strong&gt; dan &lt;strong&gt;iterators&lt;/strong&gt;, yang menawarkan cara ekspresif namun efisien untuk memproses data.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Closures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Closure&lt;/strong&gt; adalah fungsi anonim yang bisa menangkap lingkungan tempat ia dibuat.&lt;/li&gt;
&lt;li&gt;Sintaks umum:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Capturing Environment
&lt;/h3&gt;

&lt;p&gt;Closures bisa menangkap nilai dengan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Borrow immutable (&lt;code&gt;&amp;amp;T&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Borrow mutable (&lt;code&gt;&amp;amp;mut T&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Ownership (&lt;code&gt;T&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pemilihan mekanisme tergantung dari isi closure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perbedaan dengan Fungsi Biasa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fungsi: eksplisit dalam parameter.&lt;/li&gt;
&lt;li&gt;Closure: bisa menangkap variabel dari lingkungan.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"red"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;print_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Color: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔁 Iterators
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Iterator&lt;/strong&gt; adalah trait dengan satu method wajib: &lt;code&gt;next()&lt;/code&gt;, yang mengembalikan &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cara Kerja
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lazy (malas): tidak melakukan apapun sampai dikonsumsi.&lt;/li&gt;
&lt;li&gt;Dapat digunakan dengan &lt;code&gt;for&lt;/code&gt; loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Konsumsi dan Adaptasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consuming adapters&lt;/strong&gt;: &lt;code&gt;.sum()&lt;/code&gt;, &lt;code&gt;.collect()&lt;/code&gt;, dsb → memakan iterator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterator adapters&lt;/strong&gt;: &lt;code&gt;.map()&lt;/code&gt;, &lt;code&gt;.filter()&lt;/code&gt; → membentuk iterator baru.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Closures dalam Iterators
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Closure sering digunakan sebagai parameter ke method seperti &lt;code&gt;.map()&lt;/code&gt;, &lt;code&gt;.filter()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Closure bisa menangkap variabel di luar sebagai kriteria logika.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;shoe_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;shoes&lt;/span&gt;&lt;span class="nf"&gt;.into_iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="py"&gt;.size&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;shoe_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ Kinerja
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust menerapkan &lt;strong&gt;zero-cost abstractions&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Closures dan iterator tidak memperlambat performa runtime.&lt;/li&gt;
&lt;li&gt;Kompilasi menghasilkan kode setara atau bahkan lebih cepat dari manual loop.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Closures memungkinkan fungsi fleksibel dan reusable.&lt;/li&gt;
&lt;li&gt;Iterators memberikan cara aman dan efisien untuk memproses koleksi data.&lt;/li&gt;
&lt;li&gt;Kombinasi keduanya menciptakan gaya pemrograman deklaratif dan bersih—tanpa mengorbankan performa.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini membahas cara memublikasikan crate buatan kita ke komunitas Rust melalui &lt;strong&gt;crates.io&lt;/strong&gt;, serta bagaimana menyusun crate agar lebih mudah digunakan dan didokumentasikan.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Menyiapkan Crate untuk Publikasi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Persiapan Dasar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pastikan &lt;code&gt;Cargo.toml&lt;/code&gt; memiliki metadata:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;license&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tanpa metadata ini, publikasi akan gagal.
&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[package]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"guessing_game"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2021"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"A fun game where you guess a number"&lt;/span&gt;
&lt;span class="py"&gt;license&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"MIT OR Apache-2.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Akun crates.io
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Login ke &lt;a href="https://crates.io" rel="noopener noreferrer"&gt;crates.io&lt;/a&gt; dengan akun GitHub.&lt;/li&gt;
&lt;li&gt;Ambil token API dari &lt;a href="https://crates.io/me" rel="noopener noreferrer"&gt;crates.io/me&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Jalankan:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   cargo login &amp;lt;token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Publikasi ke crates.io
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Langkah-langkah
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Cek crate unik (nama belum digunakan).&lt;/li&gt;
&lt;li&gt;Tambahkan metadata.&lt;/li&gt;
&lt;li&gt;Jalankan:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   cargo publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Versi yang sudah dipublikasikan &lt;strong&gt;tidak bisa dihapus&lt;/strong&gt;. crates.io adalah arsip permanen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Update Versi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan semantic versioning (&lt;code&gt;1.0.0&lt;/code&gt;, &lt;code&gt;1.0.1&lt;/code&gt;, &lt;code&gt;2.0.0&lt;/code&gt;, dst).&lt;/li&gt;
&lt;li&gt;Untuk update: ubah versi → &lt;code&gt;cargo publish&lt;/code&gt; ulang.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Menarik Versi Lama (Yanking)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tidak bisa menghapus versi crate, tapi bisa di-&lt;em&gt;yank&lt;/em&gt; agar tidak bisa dipakai proyek baru.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo yank &lt;span class="nt"&gt;--vers&lt;/span&gt; 1.0.1
cargo yank &lt;span class="nt"&gt;--vers&lt;/span&gt; 1.0.1 &lt;span class="nt"&gt;--undo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Berguna untuk menarik versi yang rusak, tanpa mengganggu proyek yang sudah menggunakannya.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Dokumentasi Crate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Komentar Dokumentasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;///&lt;/code&gt; sebelum item publik.&lt;/li&gt;
&lt;li&gt;Bisa menyertakan contoh kode dengan Markdown.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// Adds one to the number.&lt;/span&gt;
&lt;span class="cd"&gt;/// # Examples&lt;/span&gt;
&lt;span class="cd"&gt;/// ```&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/// let x = 5;&lt;/span&gt;
&lt;span class="cd"&gt;/// assert_eq!(6, my_crate::add_one(x));&lt;/span&gt;
&lt;span class="cd"&gt;///&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;pub fn add_one(x: i32) -&amp;gt; i32 {&lt;br&gt;
    x + 1&lt;br&gt;
}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


- Jalankan `cargo doc` untuk menghasilkan HTML dokumentasi.
- Gunakan `cargo doc --open` untuk langsung membuka di browser.

---

## 🔄 Re-export API dengan `pub use`

- Untuk menyederhanakan struktur public API.
- Menyembunyikan struktur internal crate.



```rust
pub use self::utils::mix;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cargo memudahkan publikasi dan manajemen distribusi crate.&lt;/li&gt;
&lt;li&gt;Dokumentasi dan struktur API yang baik meningkatkan kegunaan crate di komunitas.&lt;/li&gt;
&lt;li&gt;crates.io adalah pusat ekosistem Rust, dan partisipasi aktif sangat dianjurkan.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini memperkenalkan &lt;strong&gt;smart pointers&lt;/strong&gt;, yaitu tipe data dengan kemampuan tambahan selain menyimpan alamat memori, seperti pengelolaan kepemilikan, penghitungan referensi, atau kontrol mutabilitas.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Apa Itu Smart Pointer?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Perbedaan dengan Referensi Biasa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Referensi (&lt;code&gt;&amp;amp;T&lt;/code&gt;) hanya meminjam data, tidak memiliki.&lt;/li&gt;
&lt;li&gt;Smart pointer umumnya &lt;strong&gt;memiliki data&lt;/strong&gt; dan menyimpan &lt;strong&gt;metadata tambahan&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ciri Umum Smart Pointer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diimplementasikan sebagai &lt;code&gt;struct&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Biasanya mengimplementasikan trait:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Deref&lt;/code&gt;: agar bisa diperlakukan seperti referensi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Drop&lt;/code&gt;: untuk mengeksekusi kode ketika keluar scope.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Box
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fungsi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menyimpan data di &lt;strong&gt;heap&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Digunakan saat:

&lt;ul&gt;
&lt;li&gt;Ukuran tipe tidak diketahui di compile time.&lt;/li&gt;
&lt;li&gt;Data besar yang ingin dipindah tanpa disalin.&lt;/li&gt;
&lt;li&gt;Trait object (untuk dynamic dispatch).
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  👥 Rc - Reference Counted
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tujuan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mendukung &lt;strong&gt;multiple ownership&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cocok untuk struktur data seperti graf atau pohon dengan banyak referensi ke satu node.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fitur
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menjaga hitungan pemilik aktif.&lt;/li&gt;
&lt;li&gt;Ketika count = 0, data dibersihkan otomatis.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Tidak thread-safe — gunakan &lt;code&gt;Arc&amp;lt;T&amp;gt;&lt;/code&gt; jika diperlukan di thread berbeda.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🌀 RefCell dan Interior Mutability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Interior Mutability?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Memungkinkan data &lt;strong&gt;diubah walau berada di konteks immutable&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  RefCell
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menyediakan mutasi runtime, bukan compile time seperti &lt;code&gt;&amp;amp;mut&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Panic saat aturan borrow dilanggar — dicek saat program berjalan.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RefCell&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RefCell&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="nf"&gt;.borrow_mut&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎭 Trait &lt;code&gt;Deref&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mengizinkan smart pointer digunakan layaknya referensi biasa (&lt;code&gt;*my_box&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Mendukung &lt;em&gt;deref coercion&lt;/em&gt;, yaitu otomatis konversi &lt;code&gt;&amp;amp;Box&amp;lt;T&amp;gt;&lt;/code&gt; → &lt;code&gt;&amp;amp;T&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💣 Trait &lt;code&gt;Drop&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Menentukan aksi saat smart pointer keluar scope.&lt;/li&gt;
&lt;li&gt;Misalnya untuk logging atau membebaskan sumber daya.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="nb"&gt;Drop&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;MyPointer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cleaning up!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔁 Weak dan Siklus Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt; bisa menyebabkan &lt;strong&gt;reference cycle&lt;/strong&gt; → memory leak.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;Weak&amp;lt;T&amp;gt;&lt;/code&gt; agar tidak ikut menaikkan hitungan pemilik.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Weak&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Smart pointer memberi kontrol memori tambahan:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt; untuk heap.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt; untuk banyak pemilik.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt; untuk runtime borrow check.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Kombinasi trait &lt;code&gt;Deref&lt;/code&gt; dan &lt;code&gt;Drop&lt;/code&gt; memberikan fleksibilitas dan keamanan.&lt;/li&gt;

&lt;li&gt;Penting untuk memahami kapan harus menggunakan pointer biasa, smart pointer, atau keduanya.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini membahas bagaimana Rust memungkinkan pemrograman serempak (multithreading, messaging, shared state) secara &lt;strong&gt;aman dan efisien&lt;/strong&gt;, tanpa race condition atau undefined behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔀 Thread
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;std::thread::spawn&lt;/code&gt; untuk menjalankan fungsi di thread terpisah.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from another thread!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Join
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Untuk menunggu thread selesai, gunakan &lt;code&gt;.join()&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="nf"&gt;.join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ownership dan &lt;code&gt;move&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Closure thread harus mengambil kepemilikan (&lt;code&gt;move&lt;/code&gt;) jika menggunakan data luar scope-nya.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📡 Message Passing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Channel
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;std::sync::mpsc&lt;/code&gt; untuk komunikasi antar-thread.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mpsc&lt;/code&gt; = multiple producer, single consumer.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;mpsc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="nf"&gt;.send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hi"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;received&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="nf"&gt;.recv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cloning Sender
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bisa membuat banyak pengirim (&lt;code&gt;tx&lt;/code&gt;) dengan &lt;code&gt;tx.clone()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Shared-State Concurrency
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mengelola akses eksklusif ke data bersama (mutual exclusion).&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;.lock()&lt;/code&gt; untuk mengakses data.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;Arc&amp;lt;T&amp;gt;&lt;/code&gt; (Atomic Reference Counted)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan agar &lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt; bisa dibagikan ke beberapa thread.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Konsep Tambahan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fearless Concurrency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust menghilangkan race condition dengan aturan borrow checker dan type system.&lt;/li&gt;
&lt;li&gt;Banyak error concurrency terdeteksi saat compile-time, bukan runtime.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust memberikan alat concurrency yang &lt;strong&gt;aman secara default&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilihan utama:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;thread::spawn&lt;/code&gt; untuk multithreading dasar.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mpsc&lt;/code&gt; untuk message passing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt; dan &lt;code&gt;Arc&amp;lt;T&amp;gt;&lt;/code&gt; untuk shared state.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tidak seperti bahasa lain, Rust memastikan keamanan memori dan thread tanpa garbage collector.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini menjelaskan bagaimana Rust mendukung pemrograman berorientasi objek (&lt;em&gt;Object-Oriented Programming / OOP&lt;/em&gt;) dengan pendekatan yang berbeda, yaitu menggunakan &lt;strong&gt;trait object&lt;/strong&gt; sebagai pengganti &lt;em&gt;inheritance&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 OOP dalam Konteks Rust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Karakteristik OOP Umum
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Objects&lt;/strong&gt;: Kombinasi data dan fungsi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulation&lt;/strong&gt;: Menyembunyikan detail implementasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance&lt;/strong&gt;: Pewarisan antar tipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polymorphism&lt;/strong&gt;: Kemampuan tipe berbeda bertindak serupa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rust mendukung &lt;strong&gt;object&lt;/strong&gt; dan &lt;strong&gt;encapsulation&lt;/strong&gt;, namun &lt;strong&gt;tidak memiliki inheritance secara langsung&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎭 Trait sebagai Pengganti Inheritance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Trait Object
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Trait object memungkinkan pemanggilan method pada berbagai tipe &lt;strong&gt;secara dinamis&lt;/strong&gt; selama mereka mengimplementasikan trait tertentu.&lt;/li&gt;
&lt;li&gt;Disusun menggunakan &lt;code&gt;Box&amp;lt;dyn Trait&amp;gt;&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;Draw&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Screen&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;Draw&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tipe-tipe konkret (&lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;SelectBox&lt;/code&gt;) bisa di-&lt;em&gt;wrap&lt;/em&gt; dalam trait object dan disimpan dalam vektor.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Draw&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 Polymorphism di Rust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Static vs Dynamic Dispatch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static&lt;/strong&gt;: Menggunakan generic + trait bound. Diketahui saat compile time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic&lt;/strong&gt;: Menggunakan trait object (&lt;code&gt;dyn Trait&lt;/code&gt;). Ditentukan saat runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Trait object digunakan saat tipe spesifik tidak diketahui saat kompilasi.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✨ Contoh: GUI Abstraksi
&lt;/h2&gt;

&lt;p&gt;Rust dapat membuat antarmuka seperti framework GUI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipe-tipe berbeda (&lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;TextField&lt;/code&gt;, dll.) di-&lt;em&gt;wrap&lt;/em&gt; dalam &lt;code&gt;Box&amp;lt;dyn Draw&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Disimpan dalam koleksi dan semuanya bisa dipanggil &lt;code&gt;.draw()&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="py"&gt;.components&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="nf"&gt;.draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust bukan bahasa OOP murni, tapi mendukung prinsip OOP secara idiomatik.&lt;/li&gt;
&lt;li&gt;Trait dan trait object adalah cara utama mengimplementasikan &lt;strong&gt;polymorphism&lt;/strong&gt; di Rust.&lt;/li&gt;
&lt;li&gt;Tidak ada inheritance, namun dapat dicapai melalui:

&lt;ul&gt;
&lt;li&gt;Trait dengan implementasi default.&lt;/li&gt;
&lt;li&gt;Komposisi dan trait bound.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pendekatan Rust mendorong desain kode yang eksplisit, aman, dan modular.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini adalah kulminasi dari perjalanan belajar Rust. Di sini, kita membuat &lt;strong&gt;web server multithreaded&lt;/strong&gt; dari nol sebagai proyek praktis untuk menerapkan konsep-konsep penting yang telah dipelajari.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Tujuan Proyek
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Membangun server HTTP sederhana:

&lt;ol&gt;
&lt;li&gt;Menerima koneksi TCP.&lt;/li&gt;
&lt;li&gt;Membaca dan mem-parsing request HTTP.&lt;/li&gt;
&lt;li&gt;Mengirimkan response sederhana.&lt;/li&gt;
&lt;li&gt;Menggunakan &lt;strong&gt;thread pool&lt;/strong&gt; untuk menangani permintaan secara paralel.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔌 Dasar-Dasar TCP &amp;amp; HTTP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TCP (Transmission Control Protocol)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menyediakan koneksi dua arah antara client-server.&lt;/li&gt;
&lt;li&gt;Rust menggunakan &lt;code&gt;std::net::TcpListener&lt;/code&gt; untuk membuka socket.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  HTTP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Berbasis teks, menggunakan protokol request-response.&lt;/li&gt;
&lt;li&gt;Request umum: &lt;code&gt;GET / HTTP/1.1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Tahapan Implementasi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Mendengarkan Koneksi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;TcpListener&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"127.0.0.1:7878"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Menangani Satu Request
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Membaca &lt;code&gt;TcpStream&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mengambil baris pertama dari HTTP request.&lt;/li&gt;
&lt;li&gt;Merespons hanya jika &lt;code&gt;GET /&lt;/code&gt;, kirimkan file HTML.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;status_line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"HTTP/1.1 200 OK"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;read_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.html"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧵 Membuat Thread Pool
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Konsep
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan fixed-size thread pool untuk efisiensi.&lt;/li&gt;
&lt;li&gt;Kirim pekerjaan (&lt;code&gt;Job&lt;/code&gt;) ke channel, pekerja akan mengeksekusinya.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Struktur
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ThreadPool&lt;/code&gt;: menyimpan thread dan pengirim (&lt;code&gt;Sender&amp;lt;Job&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Worker&lt;/code&gt;: thread yang mengambil dan menjalankan &lt;code&gt;Job&lt;/code&gt; dari channel.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧹 Graceful Shutdown
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Implementasi trait &lt;code&gt;Drop&lt;/code&gt; untuk &lt;code&gt;ThreadPool&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ketika server dimatikan, worker akan diberi sinyal untuk berhenti dan &lt;code&gt;join()&lt;/code&gt; dipanggil agar thread selesai dengan bersih.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚫 Bukan Production-Ready
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Proyek ini &lt;strong&gt;bukan web server siap produksi&lt;/strong&gt;, tapi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memberikan pemahaman langsung akan dasar HTTP.&lt;/li&gt;
&lt;li&gt;Memberi gambaran bagaimana runtime async atau framework seperti &lt;code&gt;hyper&lt;/code&gt; bekerja di balik layar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Web server ini melibatkan:

&lt;ul&gt;
&lt;li&gt;TCP, HTTP, I/O&lt;/li&gt;
&lt;li&gt;Threads, Channels, Mutex, Arc&lt;/li&gt;
&lt;li&gt;Ownership dan borrowing secara aman&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Proyek ini menunjukkan bahwa &lt;strong&gt;Rust ideal untuk low-level system programming&lt;/strong&gt;, bahkan untuk membangun tool tingkat tinggi seperti server.&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Lampiran (Appendix)
&lt;/h2&gt;

&lt;p&gt;Lampiran dalam buku ini memberikan referensi singkat dan tambahan penting untuk memperdalam pemahaman konsep-konsep Rust.&lt;/p&gt;




&lt;h2&gt;
  
  
  📄 Appendix B – Operator dan Simbol
&lt;/h2&gt;

&lt;p&gt;Berisi daftar lengkap operator dan simbol dalam Rust, termasuk konteks penggunaannya:&lt;/p&gt;

&lt;h3&gt;
  
  
  Beberapa contoh:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;!&lt;/code&gt;: macro expansion atau negasi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;: perbandingan nilai (&lt;code&gt;PartialEq&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;&amp;amp;mut&lt;/code&gt;: reference (borrow)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;::&lt;/code&gt;: akses namespace/module&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt;: parameter generic&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[attr]&lt;/code&gt;, &lt;code&gt;#![attr]&lt;/code&gt;: atribut metadata&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;...&lt;/code&gt;, &lt;code&gt;..=&lt;/code&gt;, &lt;code&gt;..&lt;/code&gt;: pola range (eksklusif/inklusif)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Appendix C – Trait yang Bisa Di-&lt;em&gt;derive&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Rust menyediakan trait tertentu yang bisa di-&lt;em&gt;derive&lt;/em&gt; otomatis oleh compiler:&lt;/p&gt;

&lt;h3&gt;
  
  
  Beberapa trait penting:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Debug&lt;/code&gt;: untuk debugging via &lt;code&gt;{:?}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PartialEq&lt;/code&gt;, &lt;code&gt;Eq&lt;/code&gt;: untuk perbandingan nilai&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Clone&lt;/code&gt;, &lt;code&gt;Copy&lt;/code&gt;: untuk duplikasi nilai&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Default&lt;/code&gt;: menyediakan nilai default&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Hash&lt;/code&gt;: memungkinkan objek dimasukkan ke &lt;code&gt;HashMap&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ord&lt;/code&gt;, &lt;code&gt;PartialOrd&lt;/code&gt;: untuk perbandingan dan pengurutan&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🗂️ Appendix D – Atribut Crate
&lt;/h2&gt;

&lt;p&gt;Atribut khusus crate yang bisa digunakan untuk mengatur perilaku compile:&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#![allow(unused)]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#![deny(warnings)]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔤 Appendix E – Keyword yang Dicadangkan
&lt;/h2&gt;

&lt;p&gt;Daftar kata kunci yang &lt;em&gt;reserved&lt;/em&gt; untuk masa depan, meskipun belum digunakan sekarang:&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;abstract&lt;/code&gt;, &lt;code&gt;final&lt;/code&gt;, &lt;code&gt;macro&lt;/code&gt;, &lt;code&gt;virtual&lt;/code&gt;, &lt;code&gt;typeof&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Appendix F – Tooling
&lt;/h2&gt;

&lt;p&gt;Daftar dan penjelasan alat-alat ekosistem Rust:&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool penting:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cargo&lt;/code&gt; – manajer proyek &amp;amp; build&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustc&lt;/code&gt; – compiler&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustdoc&lt;/code&gt; – generator dokumentasi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clippy&lt;/code&gt; – linting tool&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustfmt&lt;/code&gt; – formatting otomatis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustup&lt;/code&gt; – installer &amp;amp; pengelola versi Rust&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Kesimpulan Umum Lampiran
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Lampiran bukan bagian "wajib baca", tetapi &lt;strong&gt;sangat berguna sebagai referensi cepat&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Sangat membantu saat butuh penjelasan singkat tentang sintaks, tooling, atau kebiasaan idiomatik Rust.&lt;/li&gt;
&lt;/ul&gt;




</description>
    </item>
    <item>
      <title>The Rust Programming Language bahasa indonesia</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Tue, 15 Apr 2025 10:34:28 +0000</pubDate>
      <link>https://dev.to/driannaird/the-rust-programming-language-bahasa-indonesia-1phk</link>
      <guid>https://dev.to/driannaird/the-rust-programming-language-bahasa-indonesia-1phk</guid>
      <description>&lt;h2&gt;
  
  
  📌 Konsep Dasar Rust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pengantar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust adalah bahasa pemrograman sistem yang mengutamakan kecepatan, keamanan, dan kontrol atas memori.&lt;/li&gt;
&lt;li&gt;Menyediakan kekuatan low-level (seperti C/C++) dengan ergonomi high-level.&lt;/li&gt;
&lt;li&gt;Compiler Rust sangat ketat, membantu mencegah bug sejak awal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Siapa yang Cocok Menggunakan Rust?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tim Developer:&lt;/strong&gt; Mempermudah kolaborasi dengan sistem type dan error yang kuat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mahasiswa &amp;amp; Pelajar:&lt;/strong&gt; Komunitas terbuka dan mendukung pembelajaran sistem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perusahaan:&lt;/strong&gt; Digunakan di CLI tools, embedded, web service, machine learning, dsb.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Source Developer:&lt;/strong&gt; Banyak peluang kontribusi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Penggemar Kecepatan &amp;amp; Stabilitas:&lt;/strong&gt; Fokus pada zero-cost abstraction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Instalasi dan Dasar Penggunaan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Instalasi Rust
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;rustup&lt;/code&gt; untuk instalasi dan manajemen versi.&lt;/li&gt;
&lt;li&gt;Dilengkapi dengan dokumentasi lokal (&lt;code&gt;rustup doc&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Alat penting:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rustc&lt;/code&gt;: Compiler utama.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo&lt;/code&gt;: Package manager &amp;amp; build system.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Menulis Program Pertama: Hello, World!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;File: &lt;code&gt;main.rs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Struktur dasar:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Kompilasi manual: &lt;code&gt;rustc main.rs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Eksekusi: &lt;code&gt;./main&lt;/code&gt; atau &lt;code&gt;main.exe&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📦 Manajemen Proyek dengan Cargo
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Cargo?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tools default untuk membuat, membangun, dan menjalankan proyek Rust.&lt;/li&gt;
&lt;li&gt;Mengelola dependensi (crates), build, dan distribusi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dasar-dasar Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cargo new project_name&lt;/code&gt;: Membuat proyek baru.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo build&lt;/code&gt;: Kompilasi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo run&lt;/code&gt;: Kompilasi &amp;amp; eksekusi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo check&lt;/code&gt;: Mengecek kesalahan tanpa build.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo build --release&lt;/code&gt;: Build dengan optimisasi.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Struktur Proyek Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Cargo.toml&lt;/code&gt;: Konfigurasi proyek dan dependensi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/main.rs&lt;/code&gt;: Entry point program.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎮 Bab 2: Membuat Game "Guess the Number"
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tujuan Proyek
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menebak angka acak antara 1-100.&lt;/li&gt;
&lt;li&gt;Program memberi tahu apakah tebakan terlalu tinggi, rendah, atau tepat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Konsep yang Diperkenalkan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;use std::io;&lt;/code&gt;: Mengambil input dari pengguna.&lt;/li&gt;
&lt;li&gt;Variabel dengan &lt;code&gt;let&lt;/code&gt; dan &lt;code&gt;mut&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;String dan konversi ke angka (&lt;code&gt;parse::&amp;lt;u32&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Shadowing: Mendeklarasikan ulang variabel dengan nama yang sama.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rand&lt;/code&gt; crate: Digunakan untuk menghasilkan angka acak.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ordering&lt;/code&gt; dan &lt;code&gt;match&lt;/code&gt;: Digunakan untuk membandingkan dan menangani hasil tebakan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh Match Expression
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt;&lt;span class="nf"&gt;.cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;secret_number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Less&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Too small!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Greater&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Too big!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nn"&gt;Ordering&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Equal&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You win!"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Error Handling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;expect("error message")&lt;/code&gt;: Menangani error pada operasi I/O atau parsing.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Floating Topics (Topik Tambahan)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crate dan Dependency Management
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Semua crate eksternal dideklarasikan di &lt;code&gt;[dependencies]&lt;/code&gt; dalam &lt;code&gt;Cargo.toml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Cargo akan membuat &lt;code&gt;Cargo.lock&lt;/code&gt; untuk menjaga versi dependensi tetap konsisten.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools Pendukung
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;rustfmt&lt;/code&gt;: Formatter otomatis untuk kode Rust.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rust-analyzer&lt;/code&gt;: IntelliSense &amp;amp; error hints di editor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧾 Variabel dan Mutabilitas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Variabel
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dideklarasikan dengan &lt;code&gt;let&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Secara default &lt;strong&gt;immutable&lt;/strong&gt; (tidak bisa diubah).&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;mut&lt;/code&gt; untuk menjadikannya mutable.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;      &lt;span class="c1"&gt;// immutable&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// mutable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Shadowing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Variabel dapat dideklarasikan ulang dengan nama yang sama.&lt;/li&gt;
&lt;li&gt;Berguna untuk mengganti tipe data atau memperbarui nilai.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔢 Tipe Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scalar Types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Integer (&lt;code&gt;i32&lt;/code&gt;, &lt;code&gt;u32&lt;/code&gt;, dll)&lt;/li&gt;
&lt;li&gt;Floating-point (&lt;code&gt;f64&lt;/code&gt;, &lt;code&gt;f32&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Boolean (&lt;code&gt;bool&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Character (&lt;code&gt;char&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compound Types
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tuple: Dapat menggabungkan beberapa tipe.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Array: Koleksi dengan ukuran tetap.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎯 Fungsi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Didefinisikan dengan &lt;code&gt;fn&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Bisa mengembalikan nilai dengan &lt;code&gt;-&amp;gt; T&lt;/code&gt; dan &lt;code&gt;return&lt;/code&gt;, atau langsung ekspresi di akhir blok.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💬 Komentar
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Komentar satu baris: &lt;code&gt;// komentar&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Komentar dokumentasi: &lt;code&gt;///&lt;/code&gt; (digunakan di crate atau API docs)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔁 Kontrol Alur
&lt;/h2&gt;

&lt;h3&gt;
  
  
  if Expressions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dapat digunakan seperti ekspresi, bukan hanya statement.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  loop
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Perulangan tak hingga sampai &lt;code&gt;break&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  while
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Perulangan dengan syarat.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  for
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Paling idiomatik untuk iterasi koleksi.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.rev&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{number}!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔐 Apa Itu Ownership?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Konsep Dasar
&lt;/h3&gt;

&lt;p&gt;Ownership adalah sistem pengelolaan memori di Rust dengan aturan yang dicek oleh compiler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Setiap nilai memiliki satu "pemilik" (owner)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hanya satu owner yang aktif dalam satu waktu&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ketika owner keluar dari scope, nilai akan di-&lt;em&gt;drop&lt;/em&gt; secara otomatis&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Keuntungan:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tidak ada &lt;em&gt;garbage collector&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Menghindari memory leak dan double free.&lt;/li&gt;
&lt;li&gt;Performa tinggi dan aman.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Stack vs Heap
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan untuk data berukuran tetap.&lt;/li&gt;
&lt;li&gt;Akses cepat, LIFO (Last In First Out).&lt;/li&gt;
&lt;li&gt;Contoh: integer, float, boolean.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Heap
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Untuk data berukuran dinamis.&lt;/li&gt;
&lt;li&gt;Alokasi lebih lambat, tapi fleksibel.&lt;/li&gt;
&lt;li&gt;Contoh: &lt;code&gt;String&lt;/code&gt;, &lt;code&gt;Vec&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎁 Ownership pada Tipe Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tipe Copy vs Move
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tipe sederhana (seperti &lt;code&gt;i32&lt;/code&gt;) di-&lt;em&gt;copy&lt;/em&gt; secara default.&lt;/li&gt;
&lt;li&gt;Tipe kompleks (seperti &lt;code&gt;String&lt;/code&gt;) di-&lt;em&gt;move&lt;/em&gt;:

&lt;ul&gt;
&lt;li&gt;Setelah dipindahkan, variabel asal tidak bisa digunakan lagi.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// Copy&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;       &lt;span class="c1"&gt;// x masih bisa digunakan&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;     &lt;span class="c1"&gt;// s1 sudah tidak bisa digunakan&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Clone
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;.clone()&lt;/code&gt; untuk menyalin data kompleks jika ingin kedua variabel tetap valid.&lt;/p&gt;




&lt;h2&gt;
  
  
  📤 Fungsi dan Ownership
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Passing ke fungsi &lt;strong&gt;memindahkan&lt;/strong&gt; ownership (jika bukan tipe Copy).&lt;/li&gt;
&lt;li&gt;Fungsi dapat &lt;strong&gt;mengembalikan ownership&lt;/strong&gt; agar nilai bisa digunakan kembali.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;takes_ownership&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;gives_ownership&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 Borrowing dan Referensi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Immutable Reference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;&amp;amp;&lt;/code&gt; untuk meminjam nilai tanpa mengambil kepemilikan.&lt;/li&gt;
&lt;li&gt;Hanya bisa memiliki &lt;strong&gt;satu atau lebih immutable borrow&lt;/strong&gt; secara bersamaan.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;calculate_length&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mutable Reference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;&amp;amp;mut&lt;/code&gt; untuk referensi yang bisa diubah.&lt;/li&gt;
&lt;li&gt;Hanya boleh ada &lt;strong&gt;satu mutable borrow&lt;/strong&gt; dalam satu waktu.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;some_string&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;some_string&lt;/span&gt;&lt;span class="nf"&gt;.push_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", world"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Tidak boleh campur &lt;code&gt;&amp;amp;&lt;/code&gt; dan &lt;code&gt;&amp;amp;mut&lt;/code&gt; pada saat bersamaan karena akan menimbulkan race condition.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✂️ Slices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Slice memungkinkan akses ke bagian dari koleksi tanpa mengambil ownership.&lt;/li&gt;
&lt;li&gt;Contoh: &lt;code&gt;&amp;amp;str&lt;/code&gt;, &lt;code&gt;&amp;amp;[T]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;  &lt;span class="c1"&gt;// slice ke "hello"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  String Slice
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Umum digunakan untuk parameter fungsi yang menerima &lt;code&gt;&amp;amp;str&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Ownership memungkinkan Rust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mengelola memori tanpa runtime GC.&lt;/li&gt;
&lt;li&gt;Mencegah bug umum seperti use-after-free dan race condition.&lt;/li&gt;
&lt;li&gt;Mengutamakan keamanan dan efisiensi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Struct&lt;/strong&gt;, yaitu tipe data yang memungkinkan pengelompokan data secara terstruktur dan bermakna. Struct juga membuka pintu bagi pendekatan object-oriented melalui method dan fungsi terkait.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 Definisi dan Pembuatan Struct
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Struct Biasa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Struct didefinisikan dengan keyword &lt;code&gt;struct&lt;/code&gt;, diikuti nama, dan daftar field.&lt;/li&gt;
&lt;li&gt;Field memiliki nama dan tipe.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sign_in_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Instansiasi Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;{}&lt;/code&gt; dengan pasangan &lt;code&gt;field: value&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;user1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"someone@example.com"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"someuser"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sign_in_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Struct Update Syntax
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;..&lt;/code&gt; untuk menyalin nilai dari struct lain.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;user2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"another@example.com"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;user1&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Perlu diperhatikan: field yang bertipe &lt;code&gt;String&lt;/code&gt; akan &lt;em&gt;moved&lt;/em&gt; jika dipakai dalam &lt;code&gt;..user1&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 Jenis Struct Lain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tuple Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Seperti tuple, tapi dengan nama struct sebagai pembeda tipe.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nf"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nf"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Unit-like Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Struct tanpa field, berguna untuk trait atau marker.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;AlwaysEqual&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📐 Method dan &lt;code&gt;impl&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Block &lt;code&gt;impl&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tempat mendefinisikan method dan fungsi terkait (associated functions).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;area&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.height&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;can_hold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Rectangle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.width&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="py"&gt;.width&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.height&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="py"&gt;.height&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Method vs Associated Function
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Method: memiliki parameter &lt;code&gt;&amp;amp;self&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Associated function: tidak memiliki &lt;code&gt;self&lt;/code&gt;, dipanggil dengan &lt;code&gt;::&lt;/code&gt;, seperti constructor.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;Self&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📏 Studi Kasus: Menghitung Luas Persegi Panjang
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Refactor Kode
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dari parameter longgar → tuple → struct.&lt;/li&gt;
&lt;li&gt;Struct membuat kode lebih bermakna dan eksplisit.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Rectangle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Struct adalah cara idiomatik Rust untuk membuat tipe kustom.&lt;/li&gt;
&lt;li&gt;Memberikan konteks dan keterbacaan lebih baik daripada tuple.&lt;/li&gt;
&lt;li&gt;Melalui &lt;code&gt;impl&lt;/code&gt;, kita bisa menambahkan perilaku (behavior) ke struct.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;enum&lt;/strong&gt;, salah satu fitur paling ekspresif di Rust, serta &lt;em&gt;pattern matching&lt;/em&gt; menggunakan &lt;code&gt;match&lt;/code&gt; dan &lt;code&gt;if let&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎲 Apa Itu Enum?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enum (enumeration) adalah tipe data yang bisa memiliki beberapa &lt;em&gt;variant&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Setiap variant bisa menyimpan data berbeda.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;IpAddrKind&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;V6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enum dengan Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Variant bisa membawa data, mirip struct atau tuple.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;IpAddr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;V6&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enum vs Struct
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan struct jika semua data diperlukan bersamaan.&lt;/li&gt;
&lt;li&gt;Gunakan enum jika hanya satu dari sekian kemungkinan yang relevan dalam satu waktu.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Contoh Kasus: IP Address
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Struct alternatif (lebih verbose):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;IpAddr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IpAddrKind&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enum lebih ringkas:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;IpAddr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;V4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;V6&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✨ Pattern Matching dengan &lt;code&gt;match&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan untuk mencocokkan nilai dengan pola tertentu.&lt;/li&gt;
&lt;li&gt;Menjamin semua kasus ditangani (exhaustive).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;coin&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Penny&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Nickel&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Dime&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;Coin&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Quarter&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;match&lt;/code&gt; dengan Enum
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dapat mengambil dan menggunakan data dalam variant.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Quit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Move&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Move&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Move to {x}, {y}"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📦 Enum &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mengganti penggunaan null (tidak ada nilai).&lt;/li&gt;
&lt;li&gt;Bentuk:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Some(T)&lt;/code&gt; jika ada nilai.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;None&lt;/code&gt; jika tidak ada nilai.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;some_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;absent_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching dengan Option
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nb"&gt;None&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Rust memaksa penanganan semua kemungkinan (&lt;code&gt;Some&lt;/code&gt; dan &lt;code&gt;None&lt;/code&gt;) untuk mencegah bug.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Idiomatik: &lt;code&gt;if let&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sintaks ringkas untuk menangani satu pola.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;some_value&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Three!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enum membantu representasi logika program yang kompleks dan bervariasi.&lt;/li&gt;
&lt;li&gt;Digabungkan dengan &lt;code&gt;match&lt;/code&gt;, memberikan kontrol alur yang powerful dan aman.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt; adalah contoh enum yang banyak digunakan dalam Rust untuk menangani ketidakpastian nilai tanpa null.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini menjelaskan bagaimana Rust mengorganisasi program dalam skala besar, termasuk struktur proyek, pemisahan kode, dan kontrol visibilitas.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Package dan Crate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Crate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Unit kompilasi terkecil di Rust.&lt;/li&gt;
&lt;li&gt;Bisa berupa:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Binary crate&lt;/strong&gt;: memiliki fungsi &lt;code&gt;main()&lt;/code&gt;, menghasilkan executable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Library crate&lt;/strong&gt;: tidak memiliki &lt;code&gt;main()&lt;/code&gt;, digunakan sebagai pustaka.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Package
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Kumpulan dari satu atau lebih crate.&lt;/li&gt;
&lt;li&gt;Harus memiliki minimal satu crate (binary atau library).&lt;/li&gt;
&lt;li&gt;Didefinisikan melalui &lt;code&gt;Cargo.toml&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Konvensi Cargo
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;src/main.rs&lt;/code&gt;: root dari binary crate.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;src/lib.rs&lt;/code&gt;: root dari library crate.&lt;/li&gt;
&lt;li&gt;Bisa memiliki banyak binary crate di &lt;code&gt;src/bin/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Module
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tujuan Module
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mengorganisasi kode menjadi bagian-bagian yang reusable dan terpisah.&lt;/li&gt;
&lt;li&gt;Mencegah konflik nama dan meningkatkan keterbacaan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cara Mendeklarasikan Module
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mod nama_module;&lt;/code&gt; di file utama (&lt;code&gt;main.rs&lt;/code&gt; atau &lt;code&gt;lib.rs&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;File atau folder yang sesuai harus tersedia:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mod garden;&lt;/code&gt; → akan cari di &lt;code&gt;garden.rs&lt;/code&gt; atau &lt;code&gt;garden/mod.rs&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Submodule
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bisa didefinisikan di dalam file module utama, atau dalam file tersendiri di dalam folder module.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔐 Kontrol Visibilitas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Default: item bersifat privat dalam module.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;pub&lt;/code&gt; untuk membuat item publik (dapat diakses dari luar module).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;add_to_waitlist&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;use&lt;/code&gt; untuk mengimpor path agar lebih singkat.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;front_of_house&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hosting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nn"&gt;hosting&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;add_to_waitlist&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Paths dalam Module
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Absolute Path
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dimulai dari crate root.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;crate&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;front_of_house&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;hosting&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;add_to_waitlist&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Relative Path
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dimulai dari module saat ini menggunakan &lt;code&gt;self&lt;/code&gt;, &lt;code&gt;super&lt;/code&gt;, atau nama module langsung.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✂️ Pemisahan File
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Structurisasi kode modular dengan memecah file besar.&lt;/li&gt;
&lt;li&gt;Setiap &lt;code&gt;mod&lt;/code&gt; bisa dideklarasikan ke file terpisah.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;front_of_house&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// front_of_house.rs&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;back_of_house&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// back_of_house.rs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Packages dan crates mengelola distribusi dan kompilasi kode.&lt;/li&gt;
&lt;li&gt;Modules membantu pemisahan logika dan kontrol akses.&lt;/li&gt;
&lt;li&gt;Fitur &lt;code&gt;use&lt;/code&gt;, &lt;code&gt;mod&lt;/code&gt;, &lt;code&gt;pub&lt;/code&gt;, dan path sangat penting untuk proyek skala besar.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini membahas tiga struktur data penting yang disediakan oleh pustaka standar Rust: &lt;code&gt;Vec&lt;/code&gt;, &lt;code&gt;String&lt;/code&gt;, dan &lt;code&gt;HashMap&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Vector (&lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Struktur data dinamis untuk menyimpan elemen bertipe sama.&lt;/li&gt;
&lt;li&gt;Disimpan berdampingan dalam memori (heap).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Vec&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// makro literal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Akses dan Iterasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan indeks: &lt;code&gt;v[0]&lt;/code&gt;, atau &lt;code&gt;.get(index)&lt;/code&gt; untuk hasil &lt;code&gt;Option&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Iterasi menggunakan &lt;code&gt;for&lt;/code&gt;:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{i}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mutasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Dapat dimutasi menggunakan &lt;code&gt;.push()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Borrow checker mencegah kombinasi pinjam immutable dan mutable secara bersamaan.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧵 String (&lt;code&gt;String&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tipe dan Representasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;String&lt;/code&gt; adalah koleksi karakter berbasis UTF-8 yang dapat dimodifikasi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;str&lt;/code&gt; adalah string slice (biasanya literal string).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pembuatan dan Manipulasi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="nf"&gt;.push_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", world!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Indexing
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tidak bisa diindeks seperti array karena karakter UTF-8 bisa lebih dari 1 byte.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Iterasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.chars()&lt;/code&gt; untuk karakter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.bytes()&lt;/code&gt; untuk byte
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="s"&gt;"Зд"&lt;/span&gt;&lt;span class="nf"&gt;.chars&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{c}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🗺️ Hash Map (&lt;code&gt;HashMap&amp;lt;K, V&amp;gt;&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Koleksi pasangan kunci-nilai, seperti dictionary di bahasa lain.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;HashMap&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="nf"&gt;.insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Blue"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Akses dan Iterasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;.get()&lt;/code&gt; untuk mengakses nilai.&lt;/li&gt;
&lt;li&gt;Iterasi dengan &lt;code&gt;for (key, value) in &amp;amp;hash_map&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ownership
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Key dan value bisa &lt;em&gt;move&lt;/em&gt; ke dalam map.&lt;/li&gt;
&lt;li&gt;Tipe &lt;code&gt;Copy&lt;/code&gt; disalin, &lt;code&gt;String&lt;/code&gt; dipindahkan.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Borrowing dan Koleksi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Koleksi berbasis heap bisa mengubah lokasi memori saat mutasi (contoh: &lt;code&gt;.push()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Rust mencegah penggunaan referensi setelah potensi perubahan memori.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="nf"&gt;.push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// error: borrow conflict&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Koleksi di Rust mengutamakan efisiensi dan keamanan memori.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Vec&lt;/code&gt; untuk daftar nilai, &lt;code&gt;String&lt;/code&gt; untuk teks, &lt;code&gt;HashMap&lt;/code&gt; untuk asosiatif.&lt;/li&gt;
&lt;li&gt;Semua koleksi mengikuti aturan ownership dan borrowing yang ketat.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Rust membedakan dua jenis error:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Unrecoverable Errors&lt;/strong&gt;: Tidak bisa diperbaiki, program akan dihentikan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recoverable Errors&lt;/strong&gt;: Bisa ditangani dan program bisa lanjut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rust tidak menggunakan &lt;em&gt;exceptions&lt;/em&gt;, tetapi memakai enum &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt; dan makro &lt;code&gt;panic!&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  💥 Unrecoverable Errors dengan &lt;code&gt;panic!&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Penggunaan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Untuk error serius yang tidak dapat diantisipasi.&lt;/li&gt;
&lt;li&gt;Akan menghentikan eksekusi program dan mencetak pesan error.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;panic!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Something went wrong!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Default Behavior
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust melakukan &lt;strong&gt;unwinding&lt;/strong&gt;: membersihkan stack.&lt;/li&gt;
&lt;li&gt;Bisa diubah menjadi &lt;strong&gt;abort&lt;/strong&gt; untuk binary lebih kecil:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[profile.release]&lt;/span&gt;
&lt;span class="py"&gt;panic&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'abort'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Recoverable Errors dengan &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Struktur
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Ok(T)&lt;/code&gt; → Operasi sukses.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Err(E)&lt;/code&gt; → Operasi gagal dengan alasan tertentu.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh Penggunaan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.txt"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Matching
&lt;/h3&gt;

&lt;p&gt;Gunakan &lt;code&gt;match&lt;/code&gt; atau &lt;code&gt;if let&lt;/code&gt; untuk menangani &lt;code&gt;Result&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// gunakan file&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ❓ Operator &lt;code&gt;?&lt;/code&gt; untuk Propagasi Error
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fungsi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mempermudah propagasi error ke pemanggil fungsi.&lt;/li&gt;
&lt;li&gt;Jika hasil &lt;code&gt;Result&lt;/code&gt; adalah &lt;code&gt;Err&lt;/code&gt;, maka akan langsung return dari fungsi.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;read_file&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;File&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.txt"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔧 Menentukan Strategi Penanganan Error
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gunakan &lt;code&gt;panic!&lt;/code&gt; jika:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Error adalah bug (contoh: indeks di luar batas array).&lt;/li&gt;
&lt;li&gt;Program tidak bisa lanjut.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gunakan &lt;code&gt;Result&lt;/code&gt; jika:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Error bisa terjadi karena kondisi eksternal (file tidak ditemukan, koneksi gagal).&lt;/li&gt;
&lt;li&gt;Program bisa mengambil tindakan alternatif.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📌 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust mengharuskan kita untuk &lt;em&gt;menyadari dan menangani error&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;panic!&lt;/code&gt; untuk error fatal, &lt;code&gt;Result&amp;lt;T, E&amp;gt;&lt;/code&gt; untuk error yang dapat ditangani.&lt;/li&gt;
&lt;li&gt;Operator &lt;code&gt;?&lt;/code&gt; menyederhanakan penanganan error yang dibungkus dalam &lt;code&gt;Result&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini memperkenalkan tiga fitur powerful untuk menulis kode fleksibel dan reusable di Rust: &lt;strong&gt;Generics&lt;/strong&gt;, &lt;strong&gt;Traits&lt;/strong&gt;, dan &lt;strong&gt;Lifetimes&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Generics
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Generic?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generic adalah placeholder tipe yang memungkinkan fungsi, struct, enum, dan method digunakan dengan berbagai tipe tanpa mengulang kode.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;largest&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;PartialOrd&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Penggunaan Generic
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fungsi: Gunakan &lt;code&gt;T&lt;/code&gt; sebagai pengganti tipe konkret.&lt;/li&gt;
&lt;li&gt;Struct:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Enum:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nb"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Monomorphization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust akan mengubah generic menjadi tipe konkret saat kompilasi → &lt;strong&gt;tidak ada cost runtime&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Traits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi Trait
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Trait adalah kumpulan method yang dapat diimplementasikan oleh tipe.&lt;/li&gt;
&lt;li&gt;Mirip konsep interface di bahasa lain.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;Summary&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;summarize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Trait Bound
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan untuk membatasi generic hanya ke tipe yang mengimplementasikan trait tertentu.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Summary&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Breaking news! {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="nf"&gt;.summarize&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Bisa juga menggunakan &lt;code&gt;where&lt;/code&gt; untuk memperjelas kode panjang.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧬 Lifetimes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Lifetime?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lifetime adalah anotasi pada referensi untuk memastikan referensi tetap valid.&lt;/li&gt;
&lt;li&gt;Tujuan utama: mencegah &lt;strong&gt;dangling references&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh Sederhana
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;longest&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// mengembalikan referensi yang berlaku selama lifetime 'a&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lifetime Elision
&lt;/h3&gt;

&lt;p&gt;Rust sering bisa menyimpulkan lifetime secara otomatis. Tapi saat kompleksitas meningkat, kita perlu menuliskannya secara eksplisit.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;'static&lt;/code&gt; Lifetime
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menunjukkan bahwa referensi berlaku sepanjang umur program.&lt;/li&gt;
&lt;li&gt;Semua string literal memiliki lifetime &lt;code&gt;'static&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Kombinasi: Generics + Trait Bounds + Lifetimes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;announce_and_return_part&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;announcement&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
&lt;span class="k"&gt;where&lt;/span&gt;
    &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Display&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Announcement: {announcement}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generics&lt;/strong&gt;: Kode lebih fleksibel dan reusable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traits&lt;/strong&gt;: Membuat abstraksi perilaku dan batasan tipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lifetimes&lt;/strong&gt;: Mencegah kesalahan referensi memori secara aman.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semua fitur ini dicek &lt;strong&gt;di waktu kompilasi&lt;/strong&gt;, sehingga aman dan tetap efisien.&lt;/p&gt;




&lt;p&gt;Part ini membahas bagaimana menulis dan menjalankan &lt;em&gt;unit tests&lt;/em&gt; dan &lt;em&gt;integration tests&lt;/em&gt; di Rust. Tujuannya adalah memastikan bahwa program berjalan sesuai harapan dan tetap benar setelah perubahan kode.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Struktur Dasar Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fungsi Test
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Test adalah fungsi biasa dengan atribut &lt;code&gt;#[test]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dijalankan menggunakan perintah:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  cargo &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;it_works&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tiga Langkah Umum Test
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Setup data atau state.&lt;/li&gt;
&lt;li&gt;Jalankan kode yang ingin diuji.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;em&gt;assertion&lt;/em&gt; untuk memastikan hasil sesuai ekspektasi.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ✅ Macro untuk Assertion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;assert!(condition)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert_eq!(left, right)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;assert_ne!(left, right)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika assertion gagal, &lt;code&gt;panic!&lt;/code&gt; akan terjadi dan test akan gagal.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Unit Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Karakteristik:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diletakkan dalam file yang sama dengan kode (&lt;code&gt;src/&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Di dalam module &lt;code&gt;#[cfg(test)]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Dapat mengakses item private.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cfg(test)]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;#[test]&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;internal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;internal_adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔗 Integration Test
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Karakteristik:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diletakkan di folder &lt;code&gt;tests/&lt;/code&gt; di luar &lt;code&gt;src/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Diperlakukan sebagai crate terpisah.&lt;/li&gt;
&lt;li&gt;Hanya bisa mengakses public API.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/integration_test.rs&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;adder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;add_two&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;it_adds_two&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;add_two&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚙️ Pengaturan Tambahan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;#[should_panic]&lt;/code&gt;: Menandai bahwa test seharusnya gagal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[ignore]&lt;/code&gt;: Melewatkan test secara default, bisa dijalankan dengan &lt;code&gt;cargo test -- --ignored&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="nd"&gt;#[should_panic(expected&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"panic message"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;it_panics&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;panic!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"panic message"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📚 Dokumentasi dan Test
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Komentar dokumentasi (&lt;code&gt;///&lt;/code&gt;) bisa berisi contoh kode.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cargo test&lt;/code&gt; akan menjalankan contoh di dokumen sebagai test (doc-tests).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// # Examples&lt;/span&gt;
&lt;span class="cd"&gt;/// ```&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/// assert_eq!(add(2, 2), 4);&lt;/span&gt;
&lt;span class="cd"&gt;///&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🧠 Kesimpulan

- Rust mendukung testing terstruktur dengan `#[test]` dan `cargo test`.
- Unit test dan integration test membantu memverifikasi baik fungsi tunggal maupun interaksi antarbagian.
- Tools dan makro test-nya efisien, aman, dan mudah digunakan untuk pengembangan yang andal.

---

Part ini menerapkan berbagai konsep Rust melalui proyek nyata: membuat program CLI yang mencari string dalam file, mirip dengan alat UNIX `grep`.

---

## 🎯 Tujuan Proyek

- Membangun tool CLI `minigrep`.
- Input: 2 argumen command line (`search term` dan `file path`).
- Output: Menampilkan baris dalam file yang mengandung `search term`.

---

## 🧱 Struktur Proyek

### File dan Module
- `src/main.rs`: entry point, bertugas parsing argumen dan memanggil logika dari `lib.rs`.
- `src/lib.rs`: berisi fungsi utama program dan logic `search`.

### Konsep yang Dipakai
- Argument parsing via `std::env::args`.
- Error handling dengan `Result`.
- File I/O dengan `std::fs`.
- Unit testing.
- Environment variable (`CASE_INSENSITIVE`).
- Penulisan ke `stderr` untuk pesan error.

---

## ⚙️ Tahapan Implementasi

### 1. Membaca Argument CLI


```rust
use std::env;

fn main() {
    let args: Vec&amp;lt;String&amp;gt; = env::args().collect();
    dbg!(args);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Struktur &lt;code&gt;Config&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Memisahkan parsing ke dalam struct &lt;code&gt;Config&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Fungsi &lt;code&gt;Config::build&lt;/code&gt; mengembalikan &lt;code&gt;Result&amp;lt;Config, &amp;amp;str&amp;gt;&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;file_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Membaca File dan Menjalankan Pencarian
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;read_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="py"&gt;.file_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="py"&gt;.query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{line}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Fungsi &lt;code&gt;search&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menerima query dan konten, mengembalikan vector string yang cocok.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span class="nv"&gt;'a&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="nf"&gt;.lines&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="nf"&gt;.contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Menambahkan Test
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[test]&lt;/span&gt;
&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;case_sensitive&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"duct"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s"&gt;
Rust:
safe, fast, productive.
Pick three."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;assert_eq!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"safe, fast, productive."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Environment Variable untuk Case-Insensitive
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jika &lt;code&gt;CASE_INSENSITIVE&lt;/code&gt; diset, program akan menggunakan pencarian yang tidak sensitif terhadap kapital.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CASE_INSENSITIVE"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.is_ok&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🖨️ Output ke stderr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;eprintln!()&lt;/code&gt; untuk error message → memungkinkan output utama bisa diarahkan ke file (&lt;code&gt;&amp;gt; output.txt&lt;/code&gt;), sedangkan error tetap tampil di terminal.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Proyek &lt;code&gt;minigrep&lt;/code&gt; adalah penerapan nyata konsep Rust:

&lt;ul&gt;
&lt;li&gt;Argument parsing&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Modularisasi kode&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;File I/O&lt;/li&gt;
&lt;li&gt;Trait, lifetime, dan closure dasar&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Memberi gambaran bagaimana membangun CLI tool profesional.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini membahas fitur Rust yang terinspirasi dari paradigma fungsional, seperti &lt;strong&gt;closures&lt;/strong&gt; dan &lt;strong&gt;iterators&lt;/strong&gt;, yang menawarkan cara ekspresif namun efisien untuk memproses data.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔒 Closures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Closure&lt;/strong&gt; adalah fungsi anonim yang bisa menangkap lingkungan tempat ia dibuat.&lt;/li&gt;
&lt;li&gt;Sintaks umum:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;  &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Capturing Environment
&lt;/h3&gt;

&lt;p&gt;Closures bisa menangkap nilai dengan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Borrow immutable (&lt;code&gt;&amp;amp;T&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Borrow mutable (&lt;code&gt;&amp;amp;mut T&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Ownership (&lt;code&gt;T&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pemilihan mekanisme tergantung dari isi closure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perbedaan dengan Fungsi Biasa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fungsi: eksplisit dalam parameter.&lt;/li&gt;
&lt;li&gt;Closure: bisa menangkap variabel dari lingkungan.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"red"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;print_color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Color: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔁 Iterators
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definisi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Iterator&lt;/strong&gt; adalah trait dengan satu method wajib: &lt;code&gt;next()&lt;/code&gt;, yang mengembalikan &lt;code&gt;Option&amp;lt;T&amp;gt;&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="nb"&gt;Iterator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Option&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cara Kerja
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lazy (malas): tidak melakukan apapun sampai dikonsumsi.&lt;/li&gt;
&lt;li&gt;Dapat digunakan dengan &lt;code&gt;for&lt;/code&gt; loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Konsumsi dan Adaptasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consuming adapters&lt;/strong&gt;: &lt;code&gt;.sum()&lt;/code&gt;, &lt;code&gt;.collect()&lt;/code&gt;, dsb → memakan iterator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterator adapters&lt;/strong&gt;: &lt;code&gt;.map()&lt;/code&gt;, &lt;code&gt;.filter()&lt;/code&gt; → membentuk iterator baru.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Closures dalam Iterators
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Closure sering digunakan sebagai parameter ke method seperti &lt;code&gt;.map()&lt;/code&gt;, &lt;code&gt;.filter()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Closure bisa menangkap variabel di luar sebagai kriteria logika.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;shoe_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;shoes&lt;/span&gt;&lt;span class="nf"&gt;.into_iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="py"&gt;.size&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;shoe_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ Kinerja
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust menerapkan &lt;strong&gt;zero-cost abstractions&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Closures dan iterator tidak memperlambat performa runtime.&lt;/li&gt;
&lt;li&gt;Kompilasi menghasilkan kode setara atau bahkan lebih cepat dari manual loop.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Closures memungkinkan fungsi fleksibel dan reusable.&lt;/li&gt;
&lt;li&gt;Iterators memberikan cara aman dan efisien untuk memproses koleksi data.&lt;/li&gt;
&lt;li&gt;Kombinasi keduanya menciptakan gaya pemrograman deklaratif dan bersih—tanpa mengorbankan performa.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini membahas cara memublikasikan crate buatan kita ke komunitas Rust melalui &lt;strong&gt;crates.io&lt;/strong&gt;, serta bagaimana menyusun crate agar lebih mudah digunakan dan didokumentasikan.&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 Menyiapkan Crate untuk Publikasi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Persiapan Dasar
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pastikan &lt;code&gt;Cargo.toml&lt;/code&gt; memiliki metadata:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;license&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tanpa metadata ini, publikasi akan gagal.
&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[package]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"guessing_game"&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.1.0"&lt;/span&gt;
&lt;span class="py"&gt;edition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2021"&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"A fun game where you guess a number"&lt;/span&gt;
&lt;span class="py"&gt;license&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"MIT OR Apache-2.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Akun crates.io
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Login ke &lt;a href="https://crates.io" rel="noopener noreferrer"&gt;crates.io&lt;/a&gt; dengan akun GitHub.&lt;/li&gt;
&lt;li&gt;Ambil token API dari &lt;a href="https://crates.io/me" rel="noopener noreferrer"&gt;crates.io/me&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Jalankan:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   cargo login &amp;lt;token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Publikasi ke crates.io
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Langkah-langkah
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Cek crate unik (nama belum digunakan).&lt;/li&gt;
&lt;li&gt;Tambahkan metadata.&lt;/li&gt;
&lt;li&gt;Jalankan:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   cargo publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Versi yang sudah dipublikasikan &lt;strong&gt;tidak bisa dihapus&lt;/strong&gt;. crates.io adalah arsip permanen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Update Versi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan semantic versioning (&lt;code&gt;1.0.0&lt;/code&gt;, &lt;code&gt;1.0.1&lt;/code&gt;, &lt;code&gt;2.0.0&lt;/code&gt;, dst).&lt;/li&gt;
&lt;li&gt;Untuk update: ubah versi → &lt;code&gt;cargo publish&lt;/code&gt; ulang.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Menarik Versi Lama (Yanking)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tidak bisa menghapus versi crate, tapi bisa di-&lt;em&gt;yank&lt;/em&gt; agar tidak bisa dipakai proyek baru.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo yank &lt;span class="nt"&gt;--vers&lt;/span&gt; 1.0.1
cargo yank &lt;span class="nt"&gt;--vers&lt;/span&gt; 1.0.1 &lt;span class="nt"&gt;--undo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Berguna untuk menarik versi yang rusak, tanpa mengganggu proyek yang sudah menggunakannya.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Dokumentasi Crate
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Komentar Dokumentasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;///&lt;/code&gt; sebelum item publik.&lt;/li&gt;
&lt;li&gt;Bisa menyertakan contoh kode dengan Markdown.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="cd"&gt;/// Adds one to the number.&lt;/span&gt;
&lt;span class="cd"&gt;/// # Examples&lt;/span&gt;
&lt;span class="cd"&gt;/// ```&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cd"&gt;/// let x = 5;&lt;/span&gt;
&lt;span class="cd"&gt;/// assert_eq!(6, my_crate::add_one(x));&lt;/span&gt;
&lt;span class="cd"&gt;///&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;pub fn add_one(x: i32) -&amp;gt; i32 {&lt;br&gt;
    x + 1&lt;br&gt;
}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


- Jalankan `cargo doc` untuk menghasilkan HTML dokumentasi.
- Gunakan `cargo doc --open` untuk langsung membuka di browser.

---

## 🔄 Re-export API dengan `pub use`

- Untuk menyederhanakan struktur public API.
- Menyembunyikan struktur internal crate.



```rust
pub use self::utils::mix;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cargo memudahkan publikasi dan manajemen distribusi crate.&lt;/li&gt;
&lt;li&gt;Dokumentasi dan struktur API yang baik meningkatkan kegunaan crate di komunitas.&lt;/li&gt;
&lt;li&gt;crates.io adalah pusat ekosistem Rust, dan partisipasi aktif sangat dianjurkan.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Part ini memperkenalkan &lt;strong&gt;smart pointers&lt;/strong&gt;, yaitu tipe data dengan kemampuan tambahan selain menyimpan alamat memori, seperti pengelolaan kepemilikan, penghitungan referensi, atau kontrol mutabilitas.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 Apa Itu Smart Pointer?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Perbedaan dengan Referensi Biasa
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Referensi (&lt;code&gt;&amp;amp;T&lt;/code&gt;) hanya meminjam data, tidak memiliki.&lt;/li&gt;
&lt;li&gt;Smart pointer umumnya &lt;strong&gt;memiliki data&lt;/strong&gt; dan menyimpan &lt;strong&gt;metadata tambahan&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ciri Umum Smart Pointer:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Diimplementasikan sebagai &lt;code&gt;struct&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Biasanya mengimplementasikan trait:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Deref&lt;/code&gt;: agar bisa diperlakukan seperti referensi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Drop&lt;/code&gt;: untuk mengeksekusi kode ketika keluar scope.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Box
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fungsi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menyimpan data di &lt;strong&gt;heap&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Digunakan saat:

&lt;ul&gt;
&lt;li&gt;Ukuran tipe tidak diketahui di compile time.&lt;/li&gt;
&lt;li&gt;Data besar yang ingin dipindah tanpa disalin.&lt;/li&gt;
&lt;li&gt;Trait object (untuk dynamic dispatch).
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Box&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  👥 Rc - Reference Counted
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tujuan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mendukung &lt;strong&gt;multiple ownership&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Cocok untuk struktur data seperti graf atau pohon dengan banyak referensi ke satu node.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fitur
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menjaga hitungan pemilik aktif.&lt;/li&gt;
&lt;li&gt;Ketika count = 0, data dibersihkan otomatis.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Tidak thread-safe — gunakan &lt;code&gt;Arc&amp;lt;T&amp;gt;&lt;/code&gt; jika diperlukan di thread berbeda.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🌀 RefCell dan Interior Mutability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Apa Itu Interior Mutability?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Memungkinkan data &lt;strong&gt;diubah walau berada di konteks immutable&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  RefCell
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menyediakan mutasi runtime, bukan compile time seperti &lt;code&gt;&amp;amp;mut&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Panic saat aturan borrow dilanggar — dicek saat program berjalan.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RefCell&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RefCell&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="nf"&gt;.borrow_mut&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎭 Trait &lt;code&gt;Deref&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mengizinkan smart pointer digunakan layaknya referensi biasa (&lt;code&gt;*my_box&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Mendukung &lt;em&gt;deref coercion&lt;/em&gt;, yaitu otomatis konversi &lt;code&gt;&amp;amp;Box&amp;lt;T&amp;gt;&lt;/code&gt; → &lt;code&gt;&amp;amp;T&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💣 Trait &lt;code&gt;Drop&lt;/code&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Menentukan aksi saat smart pointer keluar scope.&lt;/li&gt;
&lt;li&gt;Misalnya untuk logging atau membebaskan sumber daya.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="nb"&gt;Drop&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;MyPointer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cleaning up!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔁 Weak dan Siklus Referensi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt; bisa menyebabkan &lt;strong&gt;reference cycle&lt;/strong&gt; → memory leak.&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;Weak&amp;lt;T&amp;gt;&lt;/code&gt; agar tidak ikut menaikkan hitungan pemilik.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Weak&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Smart pointer memberi kontrol memori tambahan:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Box&amp;lt;T&amp;gt;&lt;/code&gt; untuk heap.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Rc&amp;lt;T&amp;gt;&lt;/code&gt; untuk banyak pemilik.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RefCell&amp;lt;T&amp;gt;&lt;/code&gt; untuk runtime borrow check.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Kombinasi trait &lt;code&gt;Deref&lt;/code&gt; dan &lt;code&gt;Drop&lt;/code&gt; memberikan fleksibilitas dan keamanan.&lt;/li&gt;

&lt;li&gt;Penting untuk memahami kapan harus menggunakan pointer biasa, smart pointer, atau keduanya.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini membahas bagaimana Rust memungkinkan pemrograman serempak (multithreading, messaging, shared state) secara &lt;strong&gt;aman dan efisien&lt;/strong&gt;, tanpa race condition atau undefined behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔀 Thread
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dasar Penggunaan
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;std::thread::spawn&lt;/code&gt; untuk menjalankan fungsi di thread terpisah.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello from another thread!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Join
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Untuk menunggu thread selesai, gunakan &lt;code&gt;.join()&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="nf"&gt;.join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ownership dan &lt;code&gt;move&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Closure thread harus mengambil kepemilikan (&lt;code&gt;move&lt;/code&gt;) jika menggunakan data luar scope-nya.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;move&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{:?}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📡 Message Passing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Channel
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;std::sync::mpsc&lt;/code&gt; untuk komunikasi antar-thread.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mpsc&lt;/code&gt; = multiple producer, single consumer.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;mpsc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;tx&lt;/span&gt;&lt;span class="nf"&gt;.send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;String&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hi"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;received&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="nf"&gt;.recv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Cloning Sender
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bisa membuat banyak pengirim (&lt;code&gt;tx&lt;/code&gt;) dengan &lt;code&gt;tx.clone()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 Shared-State Concurrency
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mengelola akses eksklusif ke data bersama (mutual exclusion).&lt;/li&gt;
&lt;li&gt;Gunakan &lt;code&gt;.lock()&lt;/code&gt; untuk mengakses data.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="nf"&gt;.lock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;Arc&amp;lt;T&amp;gt;&lt;/code&gt; (Atomic Reference Counted)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digunakan agar &lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt; bisa dibagikan ke beberapa thread.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="nb"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Arc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Mutex&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Konsep Tambahan
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Fearless Concurrency
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rust menghilangkan race condition dengan aturan borrow checker dan type system.&lt;/li&gt;
&lt;li&gt;Banyak error concurrency terdeteksi saat compile-time, bukan runtime.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust memberikan alat concurrency yang &lt;strong&gt;aman secara default&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pilihan utama:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;thread::spawn&lt;/code&gt; untuk multithreading dasar.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mpsc&lt;/code&gt; untuk message passing.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Mutex&amp;lt;T&amp;gt;&lt;/code&gt; dan &lt;code&gt;Arc&amp;lt;T&amp;gt;&lt;/code&gt; untuk shared state.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tidak seperti bahasa lain, Rust memastikan keamanan memori dan thread tanpa garbage collector.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini menjelaskan bagaimana Rust mendukung pemrograman berorientasi objek (&lt;em&gt;Object-Oriented Programming / OOP&lt;/em&gt;) dengan pendekatan yang berbeda, yaitu menggunakan &lt;strong&gt;trait object&lt;/strong&gt; sebagai pengganti &lt;em&gt;inheritance&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 OOP dalam Konteks Rust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Karakteristik OOP Umum
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Objects&lt;/strong&gt;: Kombinasi data dan fungsi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encapsulation&lt;/strong&gt;: Menyembunyikan detail implementasi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inheritance&lt;/strong&gt;: Pewarisan antar tipe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polymorphism&lt;/strong&gt;: Kemampuan tipe berbeda bertindak serupa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rust mendukung &lt;strong&gt;object&lt;/strong&gt; dan &lt;strong&gt;encapsulation&lt;/strong&gt;, namun &lt;strong&gt;tidak memiliki inheritance secara langsung&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎭 Trait sebagai Pengganti Inheritance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Trait Object
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Trait object memungkinkan pemanggilan method pada berbagai tipe &lt;strong&gt;secara dinamis&lt;/strong&gt; selama mereka mengimplementasikan trait tertentu.&lt;/li&gt;
&lt;li&gt;Disusun menggunakan &lt;code&gt;Box&amp;lt;dyn Trait&amp;gt;&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;Draw&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Screen&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;dyn&lt;/span&gt; &lt;span class="n"&gt;Draw&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Implementasi
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Tipe-tipe konkret (&lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;SelectBox&lt;/code&gt;) bisa di-&lt;em&gt;wrap&lt;/em&gt; dalam trait object dan disimpan dalam vektor.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Draw&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔄 Polymorphism di Rust
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Static vs Dynamic Dispatch
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static&lt;/strong&gt;: Menggunakan generic + trait bound. Diketahui saat compile time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic&lt;/strong&gt;: Menggunakan trait object (&lt;code&gt;dyn Trait&lt;/code&gt;). Ditentukan saat runtime.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Trait object digunakan saat tipe spesifik tidak diketahui saat kompilasi.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✨ Contoh: GUI Abstraksi
&lt;/h2&gt;

&lt;p&gt;Rust dapat membuat antarmuka seperti framework GUI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tipe-tipe berbeda (&lt;code&gt;Button&lt;/code&gt;, &lt;code&gt;TextField&lt;/code&gt;, dll.) di-&lt;em&gt;wrap&lt;/em&gt; dalam &lt;code&gt;Box&amp;lt;dyn Draw&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Disimpan dalam koleksi dan semuanya bisa dipanggil &lt;code&gt;.draw()&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;component&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;screen&lt;/span&gt;&lt;span class="py"&gt;.components&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="nf"&gt;.draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rust bukan bahasa OOP murni, tapi mendukung prinsip OOP secara idiomatik.&lt;/li&gt;
&lt;li&gt;Trait dan trait object adalah cara utama mengimplementasikan &lt;strong&gt;polymorphism&lt;/strong&gt; di Rust.&lt;/li&gt;
&lt;li&gt;Tidak ada inheritance, namun dapat dicapai melalui:

&lt;ul&gt;
&lt;li&gt;Trait dengan implementasi default.&lt;/li&gt;
&lt;li&gt;Komposisi dan trait bound.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Pendekatan Rust mendorong desain kode yang eksplisit, aman, dan modular.&lt;/li&gt;

&lt;/ul&gt;




&lt;p&gt;Part ini adalah kulminasi dari perjalanan belajar Rust. Di sini, kita membuat &lt;strong&gt;web server multithreaded&lt;/strong&gt; dari nol sebagai proyek praktis untuk menerapkan konsep-konsep penting yang telah dipelajari.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌐 Tujuan Proyek
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Membangun server HTTP sederhana:

&lt;ol&gt;
&lt;li&gt;Menerima koneksi TCP.&lt;/li&gt;
&lt;li&gt;Membaca dan mem-parsing request HTTP.&lt;/li&gt;
&lt;li&gt;Mengirimkan response sederhana.&lt;/li&gt;
&lt;li&gt;Menggunakan &lt;strong&gt;thread pool&lt;/strong&gt; untuk menangani permintaan secara paralel.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔌 Dasar-Dasar TCP &amp;amp; HTTP
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TCP (Transmission Control Protocol)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Menyediakan koneksi dua arah antara client-server.&lt;/li&gt;
&lt;li&gt;Rust menggunakan &lt;code&gt;std::net::TcpListener&lt;/code&gt; untuk membuka socket.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  HTTP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Berbasis teks, menggunakan protokol request-response.&lt;/li&gt;
&lt;li&gt;Request umum: &lt;code&gt;GET / HTTP/1.1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧪 Tahapan Implementasi
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Mendengarkan Koneksi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;listener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;TcpListener&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"127.0.0.1:7878"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Menangani Satu Request
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Membaca &lt;code&gt;TcpStream&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Mengambil baris pertama dari HTTP request.&lt;/li&gt;
&lt;li&gt;Merespons hanya jika &lt;code&gt;GET /&lt;/code&gt;, kirimkan file HTML.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;status_line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"HTTP/1.1 200 OK"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;read_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello.html"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧵 Membuat Thread Pool
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Konsep
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan fixed-size thread pool untuk efisiensi.&lt;/li&gt;
&lt;li&gt;Kirim pekerjaan (&lt;code&gt;Job&lt;/code&gt;) ke channel, pekerja akan mengeksekusinya.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Struktur
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ThreadPool&lt;/code&gt;: menyimpan thread dan pengirim (&lt;code&gt;Sender&amp;lt;Job&amp;gt;&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Worker&lt;/code&gt;: thread yang mengambil dan menjalankan &lt;code&gt;Job&lt;/code&gt; dari channel.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧹 Graceful Shutdown
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Implementasi trait &lt;code&gt;Drop&lt;/code&gt; untuk &lt;code&gt;ThreadPool&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Ketika server dimatikan, worker akan diberi sinyal untuk berhenti dan &lt;code&gt;join()&lt;/code&gt; dipanggil agar thread selesai dengan bersih.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚫 Bukan Production-Ready
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Proyek ini &lt;strong&gt;bukan web server siap produksi&lt;/strong&gt;, tapi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memberikan pemahaman langsung akan dasar HTTP.&lt;/li&gt;
&lt;li&gt;Memberi gambaran bagaimana runtime async atau framework seperti &lt;code&gt;hyper&lt;/code&gt; bekerja di balik layar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💡 Kesimpulan
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Web server ini melibatkan:

&lt;ul&gt;
&lt;li&gt;TCP, HTTP, I/O&lt;/li&gt;
&lt;li&gt;Threads, Channels, Mutex, Arc&lt;/li&gt;
&lt;li&gt;Ownership dan borrowing secara aman&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Proyek ini menunjukkan bahwa &lt;strong&gt;Rust ideal untuk low-level system programming&lt;/strong&gt;, bahkan untuk membangun tool tingkat tinggi seperti server.&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Lampiran (Appendix)
&lt;/h2&gt;

&lt;p&gt;Lampiran dalam buku ini memberikan referensi singkat dan tambahan penting untuk memperdalam pemahaman konsep-konsep Rust.&lt;/p&gt;




&lt;h2&gt;
  
  
  📄 Appendix B – Operator dan Simbol
&lt;/h2&gt;

&lt;p&gt;Berisi daftar lengkap operator dan simbol dalam Rust, termasuk konteks penggunaannya:&lt;/p&gt;

&lt;h3&gt;
  
  
  Beberapa contoh:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;!&lt;/code&gt;: macro expansion atau negasi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;: perbandingan nilai (&lt;code&gt;PartialEq&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;&amp;amp;mut&lt;/code&gt;: reference (borrow)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;::&lt;/code&gt;: akses namespace/module&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt;: parameter generic&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#[attr]&lt;/code&gt;, &lt;code&gt;#![attr]&lt;/code&gt;: atribut metadata&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;...&lt;/code&gt;, &lt;code&gt;..=&lt;/code&gt;, &lt;code&gt;..&lt;/code&gt;: pola range (eksklusif/inklusif)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Appendix C – Trait yang Bisa Di-&lt;em&gt;derive&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Rust menyediakan trait tertentu yang bisa di-&lt;em&gt;derive&lt;/em&gt; otomatis oleh compiler:&lt;/p&gt;

&lt;h3&gt;
  
  
  Beberapa trait penting:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Debug&lt;/code&gt;: untuk debugging via &lt;code&gt;{:?}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;PartialEq&lt;/code&gt;, &lt;code&gt;Eq&lt;/code&gt;: untuk perbandingan nilai&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Clone&lt;/code&gt;, &lt;code&gt;Copy&lt;/code&gt;: untuk duplikasi nilai&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Default&lt;/code&gt;: menyediakan nilai default&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Hash&lt;/code&gt;: memungkinkan objek dimasukkan ke &lt;code&gt;HashMap&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Ord&lt;/code&gt;, &lt;code&gt;PartialOrd&lt;/code&gt;: untuk perbandingan dan pengurutan&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🗂️ Appendix D – Atribut Crate
&lt;/h2&gt;

&lt;p&gt;Atribut khusus crate yang bisa digunakan untuk mengatur perilaku compile:&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#![allow(unused)]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#![deny(warnings)]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔤 Appendix E – Keyword yang Dicadangkan
&lt;/h2&gt;

&lt;p&gt;Daftar kata kunci yang &lt;em&gt;reserved&lt;/em&gt; untuk masa depan, meskipun belum digunakan sekarang:&lt;/p&gt;

&lt;p&gt;Contoh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;abstract&lt;/code&gt;, &lt;code&gt;final&lt;/code&gt;, &lt;code&gt;macro&lt;/code&gt;, &lt;code&gt;virtual&lt;/code&gt;, &lt;code&gt;typeof&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Appendix F – Tooling
&lt;/h2&gt;

&lt;p&gt;Daftar dan penjelasan alat-alat ekosistem Rust:&lt;/p&gt;

&lt;h3&gt;
  
  
  Tool penting:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cargo&lt;/code&gt; – manajer proyek &amp;amp; build&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustc&lt;/code&gt; – compiler&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustdoc&lt;/code&gt; – generator dokumentasi&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clippy&lt;/code&gt; – linting tool&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustfmt&lt;/code&gt; – formatting otomatis&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rustup&lt;/code&gt; – installer &amp;amp; pengelola versi Rust&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Kesimpulan Umum Lampiran
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Lampiran bukan bagian "wajib baca", tetapi &lt;strong&gt;sangat berguna sebagai referensi cepat&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Sangat membantu saat butuh penjelasan singkat tentang sintaks, tooling, atau kebiasaan idiomatik Rust.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>programming</category>
      <category>rust</category>
      <category>basicrust</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Rangkuman Rust: IF dan Loop</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Sun, 06 Apr 2025 17:37:08 +0000</pubDate>
      <link>https://dev.to/driannaird/rangkuman-rust-if-dan-loop-38bp</link>
      <guid>https://dev.to/driannaird/rangkuman-rust-if-dan-loop-38bp</guid>
      <description>&lt;h2&gt;
  
  
  🧠 &lt;code&gt;if&lt;/code&gt; Expression (Percabangan)
&lt;/h2&gt;

&lt;p&gt;Rust menggunakan &lt;code&gt;if&lt;/code&gt; untuk mengevaluasi kondisi, mirip dengan bahasa lain. Tapi, &lt;code&gt;if&lt;/code&gt; di Rust adalah &lt;strong&gt;expression&lt;/strong&gt;, artinya bisa &lt;strong&gt;mengembalikan nilai&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contoh Dasar:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Angka kurang dari 10"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Angka lebih dari 10"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Angka adalah 10"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Menggunakan &lt;code&gt;if&lt;/code&gt; untuk Assignment:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt; &lt;span class="c1"&gt;// number = 5&lt;/span&gt;

&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nilainya adalah: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Semua cabang &lt;code&gt;if&lt;/code&gt; harus &lt;strong&gt;mengembalikan tipe data yang sama&lt;/strong&gt;, kalau tidak akan error.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔁 Looping
&lt;/h2&gt;

&lt;p&gt;Rust memiliki &lt;strong&gt;tiga jenis loop utama&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;loop&lt;/code&gt; → Loop tak terbatas (infinite loop)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Berulang terus!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// keluar dari loop&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Bisa mengembalikan nilai:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hasil: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 42&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. &lt;code&gt;while&lt;/code&gt; → Loop selama kondisi benar
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Selesai!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. &lt;code&gt;for&lt;/code&gt; → Loop untuk data yang bisa diiterasi (array, range, dll)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Contoh dengan range:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1, 2, 3 (tidak termasuk 4)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Contoh dengan array:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Item: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;✅ &lt;code&gt;for&lt;/code&gt; adalah cara &lt;strong&gt;paling aman&lt;/strong&gt; dan umum digunakan karena tidak rawan error seperti &lt;code&gt;while&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Bonus: Loop dengan &lt;code&gt;enumerate&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"apel"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"pisang"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"mangga"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.enumerate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Perbandingan Cepat
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Jenis&lt;/th&gt;
&lt;th&gt;Kapan digunakan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Mengecek kondisi, memilih cabang kode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;loop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Loop tak terbatas, cocok untuk &lt;code&gt;break&lt;/code&gt; manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;while&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Loop dengan kondisi, cocok untuk input atau state tertentu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;for&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Iterasi array, range, atau iterable lainnya&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwcf0aqb0txz09q1frkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkwcf0aqb0txz09q1frkp.png" alt="Image description" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>rust</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Rangkuman Rust: Fungsi</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Sun, 06 Apr 2025 17:05:35 +0000</pubDate>
      <link>https://dev.to/driannaird/rangkuman-rust-fungsi-1mgc</link>
      <guid>https://dev.to/driannaird/rangkuman-rust-fungsi-1mgc</guid>
      <description>&lt;h2&gt;
  
  
  1. 📌 Pengertian Fungsi
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fungsi adalah blok kode yang bisa digunakan kembali untuk menjalankan suatu tugas.&lt;/li&gt;
&lt;li&gt;Didefinisikan dengan kata kunci &lt;code&gt;fn&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. 🧩 Parameter dan Tipe Data
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fungsi bisa menerima parameter: ditulis di dalam tanda kurung, dipisahkan dengan koma.&lt;/li&gt;
&lt;li&gt;Setiap parameter harus menyertakan &lt;strong&gt;nama dan tipe datanya&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;print_labeled_measurement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit_label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The measurement is: {value}{unit_label}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;print_labeled_measurement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sc"&gt;'h'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output: &lt;code&gt;The measurement is: 5h&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  3. 🧱 Statements vs Expressions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧾 Statement:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Perintah yang menjalankan aksi &lt;strong&gt;tanpa mengembalikan nilai&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Contoh: &lt;code&gt;let y = 6;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📤 Expression:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Mengevaluasi dan menghasilkan nilai.&lt;/li&gt;
&lt;li&gt;Bisa dipakai di dalam statement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contoh perbedaan:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;// expression -&amp;gt; nilai 4&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❌ &lt;strong&gt;Salah:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ERROR: `let y = 6` adalah statement, bukan expression&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. 🔁 Fungsi dengan Nilai Kembali (&lt;em&gt;Return Value&lt;/em&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Fungsi yang Mengembalikan Nilai
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;five&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-&amp;gt; i32&lt;/code&gt; menunjukkan tipe return-nya.&lt;/li&gt;
&lt;li&gt;Baris terakhir &lt;strong&gt;tanpa titik koma&lt;/strong&gt; adalah return value.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;five&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The value of x is: {x}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. 🧠 Fungsi dengan Parameter dan Return Value
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;plus_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;plus_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"The value of x is: {x}"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 6&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. ⚠️ Kesalahan Umum: Semicolon di Expression
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;plus_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ❌ Error: statement tidak mengembalikan nilai&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⛔ Error: &lt;code&gt;expected i32, found ()&lt;/code&gt;&lt;br&gt;&lt;br&gt;
💡 Solusi: &lt;strong&gt;hapus titik koma&lt;/strong&gt; di akhir &lt;code&gt;x + 1&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  7. ⏪ Return secara eksplisit
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;return_explicitly&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// bisa juga dengan `return`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧾 Kesimpulan
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Konsep&lt;/th&gt;
&lt;th&gt;Penjelasan&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fungsi dasar&lt;/td&gt;
&lt;td&gt;Didefinisikan dengan &lt;code&gt;fn&lt;/code&gt;, bisa dipanggil dari &lt;code&gt;main()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parameter&lt;/td&gt;
&lt;td&gt;Ditulis dengan format &lt;code&gt;nama: tipe&lt;/code&gt;, pisahkan dengan koma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Statement&lt;/td&gt;
&lt;td&gt;Menjalankan aksi, tidak mengembalikan nilai (&lt;code&gt;let&lt;/code&gt;, &lt;code&gt;fn&lt;/code&gt;, dll)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expression&lt;/td&gt;
&lt;td&gt;Menghasilkan nilai, bisa digunakan dalam &lt;code&gt;let&lt;/code&gt; atau return&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Return value&lt;/td&gt;
&lt;td&gt;Ekspresi terakhir tanpa titik koma atau &lt;code&gt;return&lt;/code&gt; digunakan untuk kembali&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kesalahan umum&lt;/td&gt;
&lt;td&gt;Menambahkan &lt;code&gt;;&lt;/code&gt; pada akhir ekspresi terakhir dalam fungsi return&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>programming</category>
      <category>rust</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What is Node JS?</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Fri, 04 Apr 2025 15:17:39 +0000</pubDate>
      <link>https://dev.to/driannaird/what-is-node-js-27aj</link>
      <guid>https://dev.to/driannaird/what-is-node-js-27aj</guid>
      <description>&lt;p&gt;Node.js is a Javascript runtime built on Chrome's V8 Javascript engine&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An Asynchronous event-driven Javascript runtime, designed to build Scalable network applications&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What is Runetime?&lt;/strong&gt;&lt;br&gt;
Runtime is where we run or execute our code.&lt;/p&gt;

&lt;p&gt;Chrome have a runtime engine javascript named V8 engine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fts4aqu8vdstshf8w629b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fts4aqu8vdstshf8w629b.png" alt="How V8 work by zarr" width="558" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;V8 only in Browser at the time&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Ryan_Dahl" rel="noopener noreferrer"&gt;Ryan Dahl&lt;/a&gt; Create V8 can run in operating system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create NodeJS in 2009&lt;/li&gt;
&lt;li&gt;Software Developer at joyent&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ry" rel="noopener noreferrer"&gt;github.com/ry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;At the time, he want to build web server using event loop, not using thread.&lt;/li&gt;
&lt;li&gt;He has tried using C, Lua, Haskell but has many problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ryan Dahl made it possible to use the v8 engine outside of browser&lt;/strong&gt; &lt;br&gt;
He created the application using C to wrap the v8 engine so that it can be run as an executable, and javascript can be run in the application of course in operating system, called NodeJS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqh2cpocvcb60i589n7wi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqh2cpocvcb60i589n7wi.png" alt="Image description" width="571" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Characteristics of NodeJS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Asynchronous &amp;amp; Event Driven&lt;/li&gt;
&lt;li&gt;Non-Blocking&lt;/li&gt;
&lt;li&gt;Single Threaded but Highly Scalable&lt;/li&gt;
&lt;li&gt;Cross Platform&lt;/li&gt;
&lt;li&gt;MIT License&lt;/li&gt;
&lt;li&gt;NPM for package management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Main Features Which is Often Used&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File System&lt;/li&gt;
&lt;li&gt;Buffer (Manage binary file like a transfer file, streaming video, image)&lt;/li&gt;
&lt;li&gt;Http &amp;amp; Https &lt;/li&gt;
&lt;li&gt;REPL (Read Evaluate Print Loop)&lt;/li&gt;
&lt;li&gt;Console&lt;/li&gt;
&lt;li&gt;Crypto&lt;/li&gt;
&lt;li&gt;Zlib&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the more features at official doc &lt;a href="https://nodejs.org/docs/latest/api/" rel="noopener noreferrer"&gt;API Docs Node js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NodeJS vs PHP&lt;/strong&gt;&lt;br&gt;
It is different because NodeJS is runtime and PHP is language.&lt;br&gt;
But this is a general comparations that we need to know&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;PHP&lt;/th&gt;
&lt;th&gt;NodeJS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Year Made&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1994&lt;/td&gt;
&lt;td&gt;2009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zend Engine&lt;/td&gt;
&lt;td&gt;Google's V8 Engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Code Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multithread, Synchronous&lt;/td&gt;
&lt;td&gt;Single-Thread Asynchronous&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apache / IIS&lt;/td&gt;
&lt;td&gt;Runs on its own runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Package Manager&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Composer&lt;/td&gt;
&lt;td&gt;NPM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Prerequisite to using NodeJS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic Javascript&lt;/li&gt;
&lt;li&gt;Advanced Javascript (Modern JS / ES6)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;System &amp;amp; Software requirement&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows / Linux / MacOS&lt;/li&gt;
&lt;li&gt;Code Editor&lt;/li&gt;
&lt;li&gt;Terminal / Command Prompt&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Rangkuman Rust: Data Types</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Fri, 04 Apr 2025 15:13:33 +0000</pubDate>
      <link>https://dev.to/driannaird/rangkuman-rust-data-types-1kap</link>
      <guid>https://dev.to/driannaird/rangkuman-rust-data-types-1kap</guid>
      <description>&lt;p&gt;Rust adalah &lt;strong&gt;statically typed language&lt;/strong&gt;, artinya tipe data harus diketahui saat compile time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Scalar Types&lt;/strong&gt;&lt;br&gt;
Empat tipe dasar yang menyimpan satu nilai:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbs3vl681kfsg1rqi2e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbs3vl681kfsg1rqi2e4.png" alt="Image description" width="573" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Integer Overflow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Di debug mode, Rust akan panic saat overflow.&lt;/li&gt;
&lt;li&gt;Di release mode, Rust melakukan wrap around (seperti 256u8 menjadi 0).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Floating-Point Types&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;f64&lt;/code&gt; adalah default (lebih presisi dan cepat pada CPU modern).
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// f64&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;f32&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// f32&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;4. Numeric Operations&lt;/strong&gt;&lt;br&gt;
Rust mendukung operasi dasar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="c1"&gt;// Penjumlahan&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="c1"&gt;// Pengurangan&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="c1"&gt;// Perkalian&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="c1"&gt;// Pembagian&lt;/span&gt;
&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="c1"&gt;// Sisa bagi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Compound Types&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tuple: gabungan beberapa nilai dengan berbagai tipe.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;6.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tup&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Array: sekumpulan nilai dengan tipe dan panjang tetap.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Invalid Access&lt;/strong&gt;&lt;br&gt;
Mengakses indeks array di luar batas akan menyebabkan panic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;// Panic: index out of bounds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan &lt;code&gt;.get(index)&lt;/code&gt; untuk akses yang lebih aman.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>programming</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Rangkuman Rust: Variables and Mutability</title>
      <dc:creator>Drian </dc:creator>
      <pubDate>Fri, 04 Apr 2025 14:59:10 +0000</pubDate>
      <link>https://dev.to/driannaird/rangkuman-rust-variables-and-mutability-4nbn</link>
      <guid>https://dev.to/driannaird/rangkuman-rust-variables-and-mutability-4nbn</guid>
      <description>&lt;p&gt;&lt;strong&gt;1. Immutable by Default&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Di Rust, semua variable secara default tidak bisa diubah (immutable).
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Error! x bersifat immutable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Mutable Variables&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gunakan &lt;code&gt;mut&lt;/code&gt; untuk membuat variable bisa diubah.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Boleh karena x mutable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Constants&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dideklarasikan dengan &lt;code&gt;const&lt;/code&gt;, harus punya type annotation, dan tidak bisa diubah.&lt;/li&gt;
&lt;li&gt;Penulisan dengan huruf kapital dan underscore: &lt;code&gt;const MAX_POINTS: u32 = 100_000;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Shadowing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kamu bisa mendeklarasikan ulang variable dengan nama yang sama.&lt;/li&gt;
&lt;li&gt;Berguna untuk mengubah type atau melakukan transformasi.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// x sekarang nilainya 6&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"enam"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// type berubah jadi string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>rust</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
