diff --git a/404.html b/404.html index b731a35a..93fb4fd3 100644 --- a/404.html +++ b/404.html @@ -10,13 +10,13 @@ - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/CONTRIBUTING.html b/CONTRIBUTING.html index 8529517b..5a544e4b 100644 --- a/CONTRIBUTING.html +++ b/CONTRIBUTING.html @@ -8,13 +8,13 @@ - + - +
-
Skip to main content

Contribution & Tech Stack

Ebook Dasar Pemrograman Rust adalah project open source. Siapapun bebas untuk berkontribusi di sini, bisa dalam bentuk perbaikan typo, update kalimat, maupun submit tulisan baru.

Bagi kawan-kawan yang berminat untuk berkontribusi, silakan fork github.com/novalagung/dasarpemrogramanrust, kemudian langsung saja cek/buat issue kemudian submit relevan pull request untuk issue tersebut 😊

Checkout project

git clone https://github.com/novalagung/dasarpemrogramanrust.git
git submodule update --init --recursive --remote

Maintainer

E-book ini di-inisialisasi dan di-maintain oleh Noval Agung Prayogo.

Contributors

Berikut merupakan hall of fame kontributor yang sudah berbaik hati menyisihkan waktunya untuk membantu pengembangan e-book ini.

  1. Acep Saepudin
  2. Afifurrohman
  3. Fal
  4. Fredianto
  5. I Putu Saputrayana
  6. Khisby Al Ghofari
  7. Lori
  8. M. Zakiyuddin Munziri
  9. Opa Kholis Majid
  10. Rian
  11. Shandy Siswandi
  12. Theis Andatu
  13. ... anda :-)

Ebook/webhook techstack & architecture

Jika pembaca tertarik untuk membuat konten ebook berbasis web sekaligus versi PDF file-nya, bisa menggunakan link berikut sebagai referensi:

https://medium.com/geekculture/serverless-e-book-web-book-using-docusaurus-v2-github-pages-actions-and-pdf-tools-4fef54847b85

Tools yang digunakan:

Desain arsitektur:

Dasar pemrograman python

- +
Skip to main content

Contribution & Tech Stack

Ebook Dasar Pemrograman Rust adalah project open source. Siapapun bebas untuk berkontribusi di sini, bisa dalam bentuk perbaikan typo, update kalimat, maupun submit tulisan baru.

Bagi kawan-kawan yang berminat untuk berkontribusi, silakan fork github.com/novalagung/dasarpemrogramanrust, kemudian langsung saja cek/buat issue kemudian submit relevan pull request untuk issue tersebut 😊

Checkout project

git clone https://github.com/novalagung/dasarpemrogramanrust.git
git submodule update --init --recursive --remote

Maintainer

E-book ini di-inisialisasi dan di-maintain oleh Noval Agung Prayogo.

Contributors

Berikut merupakan hall of fame kontributor yang sudah berbaik hati menyisihkan waktunya untuk membantu pengembangan e-book ini.

  1. Acep Saepudin
  2. Afifurrohman
  3. ardiantovn
  4. Fal
  5. Fredianto
  6. I Putu Saputrayana
  7. Khisby Al Ghofari
  8. Lori
  9. M. Zakiyuddin Munziri
  10. Opa Kholis Majid
  11. Rian
  12. Shandy Siswandi
  13. Theis Andatu
  14. ... anda :-)

Ebook/webhook techstack & architecture

Jika pembaca tertarik untuk membuat konten ebook berbasis web sekaligus versi PDF file-nya, bisa menggunakan link berikut sebagai referensi:

https://medium.com/geekculture/serverless-e-book-web-book-using-docusaurus-v2-github-pages-actions-and-pdf-tools-4fef54847b85

Tools yang digunakan:

Desain arsitektur:

Dasar pemrograman python

+ \ No newline at end of file diff --git a/LICENSE.html b/LICENSE.html index e95dc8e8..0dd57244 100644 --- a/LICENSE.html +++ b/LICENSE.html @@ -8,13 +8,13 @@ - + - +
Skip to main content

Lisensi & Distribusi Konten

Ebook Dasar Pemrograman Rust gratis untuk disebarluaskan secara bebas, dengan catatan sesuai dengan aturan lisensi CC BY-SA 4.0 yang kurang lebih sebagai berikut:

  • Diperbolehkan menyebar, mencetak, dan menduplikasi material dalam konten ini ke siapapun.
  • Diperbolehkan memodifikasi, mengubah, atau membuat konten baru menggunakan material yang ada dalam ebook ini untuk keperluan komersil maupun tidak.

Dengan catatan:

  • Harus ada credit sumber aslinya, yaitu Dasar Pemrograman Rust atau novalagung
  • Tidak mengubah lisensi aslinya, yaitu CC BY-SA 4.0
  • Tidak ditambahi restrictions baru
  • Lebih jelasnya silakan cek https://creativecommons.org/licenses/by-sa/4.0/.

FOSSA Status

- + \ No newline at end of file diff --git a/assets/js/016a0787.0ab1d3ab.js b/assets/js/016a0787.0ab1d3ab.js deleted file mode 100644 index a78136a1..00000000 --- a/assets/js/016a0787.0ab1d3ab.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[274],{3905:(a,e,t)=>{t.d(e,{Zo:()=>o,kt:()=>u});var n=t(7294);function r(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function i(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function m(a){for(var e=1;e=0||(r[t]=a[t]);return r}(a,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(r[t]=a[t])}return r}var p=n.createContext({}),k=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):m(m({},e),a)),t},o=function(a){var e=k(a.components);return n.createElement(p.Provider,{value:e},a.children)},d={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(a,e){var t=a.components,r=a.mdxType,i=a.originalType,p=a.parentName,o=l(a,["components","mdxType","originalType","parentName"]),s=k(t),u=r,g=s["".concat(p,".").concat(u)]||s[u]||d[u]||i;return t?n.createElement(g,m(m({ref:e},o),{},{components:t})):n.createElement(g,m({ref:e},o))}));function u(a,e){var t=arguments,r=e&&e.mdxType;if("string"==typeof a||r){var i=t.length,m=new Array(i);m[0]=s;var l={};for(var p in e)hasOwnProperty.call(e,p)&&(l[p]=e[p]);l.originalType=a,l.mdxType="string"==typeof a?a:r,m[1]=l;for(var k=2;k{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>m,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>k});var n=t(7462),r=(t(7294),t(3905));const i={sidebar_position:32,title:"A.32. Basic Memory Management",sidebar_label:"A.32. Basic Memory Management"},m=void 0,l={unversionedId:"basic/basic-memory-management",id:"basic/basic-memory-management",title:"A.32. Basic Memory Management",description:"Pada chapter ini kita akan belajar tentang salah satu hal penting dalam topik pemrograman secara general, yaitu memory management yang mencakup pembahasan tentang alamat memori, pointer, heap, stack, dan juga error-error yang terjadi karena kesalahan dalam manajemen memori.",source:"@site/docs/basic/basic-memory-management.md",sourceDirName:"basic",slug:"/basic/basic-memory-management",permalink:"/basic/basic-memory-management",draft:!1,tags:[],version:"current",sidebarPosition:32,frontMatter:{sidebar_position:32,title:"A.32. Basic Memory Management",sidebar_label:"A.32. Basic Memory Management"},sidebar:"tutorialSidebar",previous:{title:"A.31. Shadowing",permalink:"/basic/shadowing"},next:{title:"A.33. Pointer & References",permalink:"/basic/pointer-references"}},p={},k=[{value:"A.32.1. Memory management",id:"a321-memory-management",level:2},{value:"\u25c9 Garbage collection (GC)",id:"-garbage-collection-gc",level:3},{value:"\u25c9 Automatic reference counting (ARC)",id:"-automatic-reference-counting-arc",level:3},{value:"\u25c9 Manual memory management",id:"-manual-memory-management",level:3},{value:"\u25c9 Ownership rules",id:"-ownership-rules",level:3},{value:"A.32.2. Memory Address",id:"a322-memory-address",level:2},{value:"A.32.3. Stack memory",id:"a323-stack-memory",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"A.32.4. Heap memory",id:"a324-heap-memory",level:2},{value:"A.32.5. Error memory management",id:"a325-error-memory-management",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:k};function d(a){let{components:e,...i}=a;return(0,r.kt)("wrapper",(0,n.Z)({},o,i,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Pada chapter ini kita akan belajar tentang salah satu hal penting dalam topik pemrograman secara general, yaitu ",(0,r.kt)("em",{parentName:"p"},"memory management")," yang mencakup pembahasan tentang alamat memori, pointer, heap, stack, dan juga error-error yang terjadi karena kesalahan dalam manajemen memori."),(0,r.kt)("p",null,"Di bahasa pemrograman high-level biasanya topik tersebut jarang disentuh, tetapi di Rust yang notabene adalah system programming, hal di atas wajib untuk dipelajari."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Penulis tekankan bahwa mungkin pembelajaran pada bagian ini akan terasa seperti ",(0,r.kt)("em",{parentName:"p"},"oversimplified")," karena tujuannya adalah untuk para pembaca yang masih dalam proses belajar atau malah belum mengenal sama sekali tentang manajemen memori.")),(0,r.kt)("h2",{id:"a321-memory-management"},"A.32.1. Memory management"),(0,r.kt)("p",null,"Semua bahasa pemrograman memiliki caranya sendiri dalam melakukan pengelolaan memory atau memory management. Ada beberapa macam metode manajemen memori yang diterapkan pada bahasa pemrograman, di antaranya adalah berikut:"),(0,r.kt)("h3",{id:"-garbage-collection-gc"},"\u25c9 Garbage collection (GC)"),(0,r.kt)("p",null,"GC adalah metode manajemen memori otomatis pada bahasa pemrograman. GC memiliki suatu unit yang disebut dengan ",(0,r.kt)("em",{parentName:"p"},"garbage collector"),". Collector tersebut aktif memonitor program, dan pada periode atau event tertentu ia akan berusaha untuk mengambil kembali (reclaim) memory yang sebelumnya telah dialokasikan dengan catatan memori tersebut sudah tidak lagi digunakan. Proses ini disebut dengan dealokasi memory."),(0,r.kt)("p",null,"Proses dealokasi pada GC terjadi di belakang layar secara asynchronous."),(0,r.kt)("p",null,"Beberapa bahasa pemrograman yang menerapkan GC di antara adalah Java, C#, Go, Lisp, dan banyak bahasa lainnya."),(0,r.kt)("h3",{id:"-automatic-reference-counting-arc"},"\u25c9 Automatic reference counting (ARC)"),(0,r.kt)("p",null,"ARC adalah metode manajemen memori yang diterapkan pada bahasa Objective-C dan Swift. Cara ARC me-manage memory adalah dengan mencatat ",(0,r.kt)("em",{parentName:"p"},"reference")," object dan segala aktifitas yang terjadi pada object tersebut."),(0,r.kt)("p",null,"Di ARC, ada satuan yang disebut dengan ",(0,r.kt)("em",{parentName:"p"},"retain count")," yang merupakan representasi jumlah banyaknya variabel atau object yang memegang suatu ",(0,r.kt)("em",{parentName:"p"},"reference"),". Ketika ",(0,r.kt)("em",{parentName:"p"},"reference")," sudah pindah ke luar scope atau dihapus isinya dan dilihat pada catatan rupanya tidak ada variabel yang memegang ",(0,r.kt)("em",{parentName:"p"},"reference")," tersebut, maka dilakukan proses dealokasi memory."),(0,r.kt)("p",null,"Dalam bahasa yang menerapkan ARC, programmer dianjurkan untuk perhatian dan bijak dalam pengalokasian variabel beserta nilainya. Mana data yang diperlukan untuk di-retain secara ",(0,r.kt)("em",{parentName:"p"},"strong")," dan mana yang tidak, harus pas sesuai dengan kebutuhan. Jika tidak hati-hati maka program mempunyai resiko lebih tinggi untuk menemui error ",(0,r.kt)("em",{parentName:"p"},"deadlocks")," ataupun ",(0,r.kt)("em",{parentName:"p"},"memory leaks")," (yang juga akan dibahas pada chapter ini)."),(0,r.kt)("h3",{id:"-manual-memory-management"},"\u25c9 Manual memory management"),(0,r.kt)("p",null,"Manual memory management berarti programmer dibebani secara penuh dalam hal manajemen memori, mengharuskan programmer untuk super hati-hati dalam pengalokasian memory, kapan waktunya, dimana alokasinya (apakah ",(0,r.kt)("em",{parentName:"p"},"heap")," atau ",(0,r.kt)("em",{parentName:"p"},"stack"),"), dan kapan harus melakukan operasi dealokasi memory."),(0,r.kt)("p",null,"Metode manajemen memori ini dipakai dalam system programming contohnya bahasa C dan C++."),(0,r.kt)("h3",{id:"-ownership-rules"},"\u25c9 Ownership rules"),(0,r.kt)("p",null,"Manajemen memori yang dilakukan dengan menerapkan konsep ",(0,r.kt)("em",{parentName:"p"},"ownership")," beserta aturan-aturannya. Metode manajemen memori ini adalah yang digunakan di Rust."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ownership rules pada Rust dibahas pada chapter selanjutnya, yaitu ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"),". Untuk sekarang silakan selesaikan terlebih dahulu pembahasan chapter ini.")),(0,r.kt)("h2",{id:"a322-memory-address"},"A.32.2. Memory Address"),(0,r.kt)("p",null,"Memory address atau alamat memori adalah sebuah lokasi spesifik di memori yang digunakan oleh software maupun hardware untuk menyimpan suatu data."),(0,r.kt)("p",null,"Pembahasan mengenai memory address ini sangatlah luas. Pada chapter ini kita tidak akan membahasnya secara menyeluruh, melainkan hanya poin penting yang perlu diketahui dan dibutuhkan dalam proses pembelajaran."),(0,r.kt)("p",null,"Ok lanjut ke contoh agar lebih jelas. Dimisalkan ada sebuah variabel bertipe data numerik ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", variabel tersebut akan membutuhkan sejumlah bit alokasi alamat memori untuk bisa menyimpan value-nya yang pada contoh ini adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"32 bits")," (karena tipenya ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),") atau jika dikonversi ke bentuk ",(0,r.kt)("em",{parentName:"p"},"bytes")," adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"4 bytes"),"."),(0,r.kt)("p",null,"Alokasi memory address mengacu ke tipe data (bukan value), sebagai contoh pada data bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"i32")," maka berapapun value data tersebut (entah ",(0,r.kt)("inlineCode",{parentName:"p"},"1"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"2"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"1999999"),", atau lainnya) tetap membutuhkan ",(0,r.kt)("inlineCode",{parentName:"p"},"32 bits")," alokasi alamat memori untuk menyimpan data tersebut."),(0,r.kt)("p",null,"Silakan perhatikan ilustrasi berikut agar lebih jelas. Gambar diambil dari post ",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/@luischaparroc/integer-numbers-storage-in-computer-memory-47af4b59009"},"medium.com/@luischaparroc"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Memory address",src:t(4275).Z,width:"875",height:"477"})),(0,r.kt)("p",null,"Pada contoh di atas, variabel adalah bertipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", maka di memory dialokasikanlah alamat memory dengan lebar 32 bit."),(0,r.kt)("p",null,"Nilai variabel tersebut adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"25"),", yang jika dikonversi ke bentuk binary adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"11001"),". Dengan ini maka pada 32 bit yang sudah dialokasikan, akan terisi dengan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"11001"),". Penulisannya dari kanan dan jika ada slot kosong sebelah kiri maka terisi dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,r.kt)("p",null,"Hasilnya adalah angka biner berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"00000000000000000000000000011001\n")),(0,r.kt)("h2",{id:"a323-stack-memory"},"A.32.3. Stack memory"),(0,r.kt)("p",null,"Masih dalam topik manajemen memori, ada dua hal lagi yang sangat penting untuk diketahui, yaitu ",(0,r.kt)("em",{parentName:"p"},"stack")," dan ",(0,r.kt)("em",{parentName:"p"},"heap"),". Keduanya adalah bagian dari memory, tempat dimana alokasi dilakukan."),(0,r.kt)("p",null,"Data disimpan dalam stack memory dalam bentuk stack. Karakteristik dari stack:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Di Rust programming, stack digunakan sebagai default tempat alokasi memori"),(0,r.kt)("li",{parentName:"ul"},"Data yang terakhir masuk adalah yang pertama akan keluar (LIFO)"),(0,r.kt)("li",{parentName:"ul"},"Data yang disimpan diketahui size/ukurannya, dan memiliki batas"),(0,r.kt)("li",{parentName:"ul"},"Alokasi bersifat lokal terhadap pemanggilan fungsi"),(0,r.kt)("li",{parentName:"ul"},"Kecepatan pengaksesan data sangat tinggi")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Stack memory",src:t(9929).Z,width:"500",height:"345"})),(0,r.kt)("p",null,"Data untuk tipe primitif (seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"bool"),", dll) disimpan di stack."),(0,r.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,r.kt)("p",null,"Selanjutnya kita akan pelajari secara garis besar tentang bagaimana sebuah data dialokasikan di stack. Silakan mulai dengan mempelajari kode sederhana berikut (tanpa perlu dipraktikkan), kemudian ikuti pembahasan setelahnya."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n let x = 24;\n}\n")),(0,r.kt)("p",null,"Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," hanya berisi 1 buah data, yaitu variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," dengan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),". Ketika fungsi tersebut dipanggil, maka data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," disimpan di stack (karena di Rust by default semua data disimpan di stack). Nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," adalah numerik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", maka compiler akan mengalokasikan 32 bits di stack memory untuk menyimpan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),"."),(0,r.kt)("p",null,"Pada catatan karakteristik stack di atas, telah disinggung bahwa alokasi data di stack bersifat lokal terhadap pemanggilan fungsi, artinya apa? \u279c Semua data dalam suatu blok fungsi akan disimpan dalam sebuah group yang disebut dengan ",(0,r.kt)("em",{parentName:"p"},"stack frame"),"."),(0,r.kt)("p",null,"Pada contoh di atas, ketika fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," dipanggil, sebuah stack frame terbuat, dan data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," disimpan dalam stack frame tersebut."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Kolom ",(0,r.kt)("inlineCode",{parentName:"p"},"No.")," di atas merepresentasikan urutan data dalam stack agar lebih mudah dipahami")),(0,r.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,r.kt)("p",null,"Ok, sekarang mari lanjut contoh ke-2 berikut ini agar makin jelas."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something() {\n let y = 13;\n let z = 11;\n}\n\nfn main() {\n let x = 24;\n do_something();\n let a = 4;\n let b = 18;\n}\n")),(0,r.kt)("p",null,"Program sederhana di atas memiliki dua buah fungsi, ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something"),". Saat program dijalankan, lebih tepatnya saat fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," dipanggil maka sebuah stack frame dibuat dan data dalam fungsi tersebut dialokasikan pada stack frame."),(0,r.kt)("p",null,"Perlu diketahui bahwa eksekusi statement dalam fungsi adalah per baris, dimulai dari atas. Dengan ini maka data yang pertama dialokasikan ke memory adalah variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x"),"."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Setelah itu, lanjut ke statement ke-2 yaitu pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,r.kt)("p",null,"Kembali ke teori, bahwa alokasi data stack adalah bersifat lokal terhadap pemanggilan fungsi. Maka dibuatlah stack frame baru untuk pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something")," dengan isi adalah alokasi data ",(0,r.kt)("inlineCode",{parentName:"p"},"y")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"z"),"."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"2"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"z"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"11"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"1"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"y"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"13"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Setelah eksekusi blok kode do_something selesai maka stack frame pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something")," akan di-dealokasi, dikosongkan, dihapus."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Sebenarnya tidak se-sederhana itu proses dealokasi memori, ada pengecekan ownership yang harus dilakukan terlebih dahulu. Namun agar makin tidak bingung, untuk sementara kita gunakan penjelasan di atas."),(0,r.kt)("p",{parentName:"blockquote"},"Silakan selesaikan dulu pembahasan chapter ini, kemudian pada chapter selanjutnya kita akan bahas tentang apa itu ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"),".")),(0,r.kt)("p",null,"Ok, maka dari 2 stack yang sebelumnya ada, sekarang tinggal 1 stack frame saja yaitu milik pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,r.kt)("p",null,"Dari yang sebelumnya ..."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"2"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"z"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"11"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"del"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"1"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"y"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"13"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"del"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"... sekarang menjadi ..."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Ok, lanjut ke block fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," berikutnya, yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"let a = 4"),". Saat dipanggil maka ada penambahan data baru pada stack frame pertama."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"3"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"a"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"4"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"main()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Kemudian sampai di statement terakhir fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),". Ketika ",(0,r.kt)("inlineCode",{parentName:"p"},"let b = 14")," dipanggil maka ada penambahan data baru pada stack frame pertama."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"4"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"b"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"18"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"main()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"3"),(0,r.kt)("td",{parentName:"tr",align:"center"},"a"),(0,r.kt)("td",{parentName:"tr",align:"center"},"4"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Setelah fungsi selesai dieksekusi, stack frame di-dealokasi."),(0,r.kt)("p",null,"Kurang lebih seperti itu sekilas peran dari stack dalam Rust programming. Selanjutnya kita bahas tentang heap memory."),(0,r.kt)("h2",{id:"a324-heap-memory"},"A.32.4. Heap memory"),(0,r.kt)("p",null,"Heap adalah salah satu tempat alokasi memory selain stack. Karakteristik dari heap:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Heap digunakan untuk alokasi data yang sifatnya dinamis, tidak diketahui size-nya, atau bisa berubah size-nya"),(0,r.kt)("li",{parentName:"ul"},"Data di heap tidak memiliki pattern tertentu"),(0,r.kt)("li",{parentName:"ul"},"Alokasi dan dealokasi data di heap bisa dilakukan kapanpun"),(0,r.kt)("li",{parentName:"ul"},"Kecepatan pengaksesan data di heap lebih lambat dibanding stack")),(0,r.kt)("p",null,"Ilustrasi perbandingan stack dan heap:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Heap memory",src:t(6907).Z,width:"414",height:"236"})),(0,r.kt)("p",null,"Tipe data non-primitive di Rust data-nya disimpan di heap, contohnya seperti Vector, ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),", dan beberapa lainnya. Penulis tekankan, bahwa ",(0,r.kt)("strong",{parentName:"p"},"yang disimpan di heap adalah data-nya saja, sedangkan atribut lainnya (seperti ",(0,r.kt)("inlineCode",{parentName:"strong"},"length")," dan ",(0,r.kt)("inlineCode",{parentName:"strong"},"capacity"),") tetap disimpan disimpan di stack"),". Lebih jelasnya silakan lihat ilustrasi berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let numbers = vec![12, 24, 7];\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Heap memory",src:t(6033).Z,width:"420",height:"184"})),(0,r.kt)("p",null,"Heap, selain digunakan sebagai penyimpanan data dinamis, kita juga bisa manfaatkan sebagai penyimpanan data jenis lainnya (secara eksplisit) menggunakan tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Box"),"."),(0,r.kt)("p",null,"Pembahasan Lebih jelasnya mengenai heap allocation ada pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/string-slice-vs-string-literal"},"String Custom Type vs ",(0,r.kt)("inlineCode",{parentName:"a"},"&str"))," dan juga ",(0,r.kt)("a",{parentName:"p",href:"#/wip/box"},"Box"),". Namun untuk sekarang, penulis anjurkan untuk lanjut ke pembahasan berikutnya terlebih dahulu."),(0,r.kt)("h2",{id:"a325-error-memory-management"},"A.32.5. Error memory management"),(0,r.kt)("p",null,"Rust sangat disiplin dalam hal penulisan source code, terutama untuk kode-kode yang berhubungan dengan memory management. Hal ini dilakukan oleh Rust untuk meminimalisir munculnya error seperti memory leak dan sejenisnya."),(0,r.kt)("p",null,"Namun meski demikian, potensi error memory tetap ada, dan kita akan bahas itu nantinya setelah masuk chapter ",(0,r.kt)("a",{parentName:"p",href:"#/wip/safe-unsafe"},"Safe & Unsafe"),"."),(0,r.kt)("p",null,"Nantinya akan dibahas juga tentang beberapa error saat compile time yang error tersebut berhubungan dengan memory management, yaitu pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership")," dan ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),". Untuk sekarang, mari lanjut ke chapter berikutnya terlebih dahulu."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/memory_management"},"github.com/novalagung/dasarpemrogramanrust-example/../memory_management")),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/ownership.html"},"https://doc.rust-lang.org/nomicon/ownership.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html"},"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/1.22.0/book/first-edition/the-stack-and-the-heap.html"},"https://doc.rust-lang.org/1.22.0/book/first-edition/the-stack-and-the-heap.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std/box.html"},"https://doc.rust-lang.org/rust-by-example/std/box.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html"},"https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.elementscompiler.com/Concepts/ARC/"},"https://docs.elementscompiler.com/Concepts/ARC/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Memory_address"},"https://en.wikipedia.org/wiki/Memory_address")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Code_segment"},"https://en.wikipedia.org/wiki/Code_segment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Automatic_Reference_Counting"},"https://en.wikipedia.org/wiki/Automatic_Reference_Counting")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)"},"https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://log2base2.com/C/pointer/computer-memory-address-basics.html"},"https://log2base2.com/C/pointer/computer-memory-address-basics.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://quora.com/How-does-memory-management-work-in-Rust"},"https://quora.com/How-does-memory-management-work-in-Rust")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/the-legend/management-memori-pada-bahasa-pemrograman-a33772635aa5"},"https://medium.com/the-legend/management-memori-pada-bahasa-pemrograman-a33772635aa5")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://imam.digmi.id/post/belajar-rust-memahami-stack-dan-heap/"},"https://imam.digmi.id/post/belajar-rust-memahami-stack-dan-heap/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://javatpoint.com/rust-ownership"},"https://javatpoint.com/rust-ownership")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/24158114"},"https://stackoverflow.com/questions/24158114"))))}d.isMDXComponent=!0},4275:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/basic-memory-management-1-ac98989ab48847e58470100c02455dab.png"},9929:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/basic-memory-management-2-114833fdf1f1ac3114d03494e6603ff1.jpg"},6907:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAADsCAIAAADLg1cmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDVUMTY6MjE6MTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjEyOjAzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjEyOjAzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBmNjg5NmU4LWU1NzEt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"},6033:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAAC4CAYAAACsL5hhAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDVUMTY6MTY6MzcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjExOjMwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjExOjMwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmVkZTM5NWJlLTIzYjUt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"}}]); \ No newline at end of file diff --git a/assets/js/016a0787.ddd4552f.js b/assets/js/016a0787.ddd4552f.js new file mode 100644 index 00000000..ed6c3df1 --- /dev/null +++ b/assets/js/016a0787.ddd4552f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[274],{3905:(a,e,t)=>{t.d(e,{Zo:()=>o,kt:()=>u});var n=t(7294);function r(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function i(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function m(a){for(var e=1;e=0||(r[t]=a[t]);return r}(a,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(r[t]=a[t])}return r}var p=n.createContext({}),k=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):m(m({},e),a)),t},o=function(a){var e=k(a.components);return n.createElement(p.Provider,{value:e},a.children)},d={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(a,e){var t=a.components,r=a.mdxType,i=a.originalType,p=a.parentName,o=l(a,["components","mdxType","originalType","parentName"]),s=k(t),u=r,g=s["".concat(p,".").concat(u)]||s[u]||d[u]||i;return t?n.createElement(g,m(m({ref:e},o),{},{components:t})):n.createElement(g,m({ref:e},o))}));function u(a,e){var t=arguments,r=e&&e.mdxType;if("string"==typeof a||r){var i=t.length,m=new Array(i);m[0]=s;var l={};for(var p in e)hasOwnProperty.call(e,p)&&(l[p]=e[p]);l.originalType=a,l.mdxType="string"==typeof a?a:r,m[1]=l;for(var k=2;k{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>m,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>k});var n=t(7462),r=(t(7294),t(3905));const i={sidebar_position:32,title:"A.32. Basic Memory Management",sidebar_label:"A.32. Basic Memory Management"},m=void 0,l={unversionedId:"basic/basic-memory-management",id:"basic/basic-memory-management",title:"A.32. Basic Memory Management",description:"Pada chapter ini kita akan belajar tentang salah satu hal penting dalam topik pemrograman secara general, yaitu memory management yang mencakup pembahasan tentang alamat memori, pointer, heap, stack, dan juga error-error yang terjadi karena kesalahan dalam manajemen memori.",source:"@site/docs/basic/basic-memory-management.md",sourceDirName:"basic",slug:"/basic/basic-memory-management",permalink:"/basic/basic-memory-management",draft:!1,tags:[],version:"current",sidebarPosition:32,frontMatter:{sidebar_position:32,title:"A.32. Basic Memory Management",sidebar_label:"A.32. Basic Memory Management"},sidebar:"tutorialSidebar",previous:{title:"A.31. Shadowing",permalink:"/basic/shadowing"},next:{title:"A.33. Pointer & References",permalink:"/basic/pointer-references"}},p={},k=[{value:"A.32.1. Memory management",id:"a321-memory-management",level:2},{value:"\u25c9 Garbage collection (GC)",id:"-garbage-collection-gc",level:3},{value:"\u25c9 Automatic reference counting (ARC)",id:"-automatic-reference-counting-arc",level:3},{value:"\u25c9 Manual memory management",id:"-manual-memory-management",level:3},{value:"\u25c9 Ownership rules",id:"-ownership-rules",level:3},{value:"A.32.2. Memory Address",id:"a322-memory-address",level:2},{value:"A.32.3. Stack memory",id:"a323-stack-memory",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"A.32.4. Heap memory",id:"a324-heap-memory",level:2},{value:"A.32.5. Error memory management",id:"a325-error-memory-management",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:k};function d(a){let{components:e,...i}=a;return(0,r.kt)("wrapper",(0,n.Z)({},o,i,{components:e,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Pada chapter ini kita akan belajar tentang salah satu hal penting dalam topik pemrograman secara general, yaitu ",(0,r.kt)("em",{parentName:"p"},"memory management")," yang mencakup pembahasan tentang alamat memori, pointer, heap, stack, dan juga error-error yang terjadi karena kesalahan dalam manajemen memori."),(0,r.kt)("p",null,"Di bahasa pemrograman high-level biasanya topik tersebut jarang disentuh, tetapi di Rust yang notabene adalah system programming, hal di atas wajib untuk dipelajari."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Penulis tekankan bahwa mungkin pembelajaran pada bagian ini akan terasa seperti ",(0,r.kt)("em",{parentName:"p"},"oversimplified")," karena tujuannya adalah untuk para pembaca yang masih dalam proses belajar atau malah belum mengenal sama sekali tentang manajemen memori.")),(0,r.kt)("h2",{id:"a321-memory-management"},"A.32.1. Memory management"),(0,r.kt)("p",null,"Semua bahasa pemrograman memiliki caranya sendiri dalam melakukan pengelolaan memory atau memory management. Ada beberapa macam metode manajemen memori yang diterapkan pada bahasa pemrograman, di antaranya adalah berikut:"),(0,r.kt)("h3",{id:"-garbage-collection-gc"},"\u25c9 Garbage collection (GC)"),(0,r.kt)("p",null,"GC adalah metode manajemen memori otomatis pada bahasa pemrograman. GC memiliki suatu unit yang disebut dengan ",(0,r.kt)("em",{parentName:"p"},"garbage collector"),". Collector tersebut aktif memonitor program, dan pada periode atau event tertentu ia akan berusaha untuk mengambil kembali (reclaim) memory yang sebelumnya telah dialokasikan dengan catatan memori tersebut sudah tidak lagi digunakan. Proses ini disebut dengan dealokasi memory."),(0,r.kt)("p",null,"Proses dealokasi pada GC terjadi di belakang layar secara asynchronous."),(0,r.kt)("p",null,"Beberapa bahasa pemrograman yang menerapkan GC di antara adalah Java, C#, Go, Lisp, dan banyak bahasa lainnya."),(0,r.kt)("h3",{id:"-automatic-reference-counting-arc"},"\u25c9 Automatic reference counting (ARC)"),(0,r.kt)("p",null,"ARC adalah metode manajemen memori yang diterapkan pada bahasa Objective-C dan Swift. Cara ARC me-manage memory adalah dengan mencatat ",(0,r.kt)("em",{parentName:"p"},"reference")," object dan segala aktifitas yang terjadi pada object tersebut."),(0,r.kt)("p",null,"Di ARC, ada satuan yang disebut dengan ",(0,r.kt)("em",{parentName:"p"},"retain count")," yang merupakan representasi jumlah banyaknya variabel atau object yang memegang suatu ",(0,r.kt)("em",{parentName:"p"},"reference"),". Ketika ",(0,r.kt)("em",{parentName:"p"},"reference")," sudah pindah ke luar scope atau dihapus isinya dan dilihat pada catatan rupanya tidak ada variabel yang memegang ",(0,r.kt)("em",{parentName:"p"},"reference")," tersebut, maka dilakukan proses dealokasi memory."),(0,r.kt)("p",null,"Dalam bahasa yang menerapkan ARC, programmer dianjurkan untuk perhatian dan bijak dalam pengalokasian variabel beserta nilainya. Mana data yang diperlukan untuk di-retain secara ",(0,r.kt)("em",{parentName:"p"},"strong")," dan mana yang tidak, harus pas sesuai dengan kebutuhan. Jika tidak hati-hati maka program mempunyai resiko lebih tinggi untuk menemui error ",(0,r.kt)("em",{parentName:"p"},"deadlocks")," ataupun ",(0,r.kt)("em",{parentName:"p"},"memory leaks")," (yang juga akan dibahas pada chapter ini)."),(0,r.kt)("h3",{id:"-manual-memory-management"},"\u25c9 Manual memory management"),(0,r.kt)("p",null,"Manual memory management berarti programmer dibebani secara penuh dalam hal manajemen memori, mengharuskan programmer untuk super hati-hati dalam pengalokasian memory, kapan waktunya, di mana alokasinya (apakah ",(0,r.kt)("em",{parentName:"p"},"heap")," atau ",(0,r.kt)("em",{parentName:"p"},"stack"),"), dan kapan harus melakukan operasi dealokasi memory."),(0,r.kt)("p",null,"Metode manajemen memori ini dipakai dalam system programming contohnya bahasa C dan C++."),(0,r.kt)("h3",{id:"-ownership-rules"},"\u25c9 Ownership rules"),(0,r.kt)("p",null,"Manajemen memori yang dilakukan dengan menerapkan konsep ",(0,r.kt)("em",{parentName:"p"},"ownership")," beserta aturan-aturannya. Metode manajemen memori ini adalah yang digunakan di Rust."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ownership rules pada Rust dibahas pada chapter selanjutnya, yaitu ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"),". Untuk sekarang silakan selesaikan terlebih dahulu pembahasan chapter ini.")),(0,r.kt)("h2",{id:"a322-memory-address"},"A.32.2. Memory Address"),(0,r.kt)("p",null,"Memory address atau alamat memori adalah sebuah lokasi spesifik di memori yang digunakan oleh software maupun hardware untuk menyimpan suatu data."),(0,r.kt)("p",null,"Pembahasan mengenai memory address ini sangatlah luas. Pada chapter ini kita tidak akan membahasnya secara menyeluruh, melainkan hanya poin penting yang perlu diketahui dan dibutuhkan dalam proses pembelajaran."),(0,r.kt)("p",null,"Ok lanjut ke contoh agar lebih jelas. Dimisalkan ada sebuah variabel bertipe data numerik ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", variabel tersebut akan membutuhkan sejumlah bit alokasi alamat memori untuk bisa menyimpan value-nya yang pada contoh ini adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"32 bits")," (karena tipenya ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),") atau jika dikonversi ke bentuk ",(0,r.kt)("em",{parentName:"p"},"bytes")," adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"4 bytes"),"."),(0,r.kt)("p",null,"Alokasi memory address mengacu ke tipe data (bukan value), sebagai contoh pada data bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"i32")," maka berapapun value data tersebut (entah ",(0,r.kt)("inlineCode",{parentName:"p"},"1"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"2"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"1999999"),", atau lainnya) tetap membutuhkan ",(0,r.kt)("inlineCode",{parentName:"p"},"32 bits")," alokasi alamat memori untuk menyimpan data tersebut."),(0,r.kt)("p",null,"Silakan perhatikan ilustrasi berikut agar lebih jelas. Gambar diambil dari post ",(0,r.kt)("a",{parentName:"p",href:"https://medium.com/@luischaparroc/integer-numbers-storage-in-computer-memory-47af4b59009"},"medium.com/@luischaparroc"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Memory address",src:t(4275).Z,width:"875",height:"477"})),(0,r.kt)("p",null,"Pada contoh di atas, variabel adalah bertipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", maka di memory dialokasikanlah alamat memory dengan lebar 32 bit."),(0,r.kt)("p",null,"Nilai variabel tersebut adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"25"),", yang jika dikonversi ke bentuk binary adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"11001"),". Dengan ini maka pada 32 bit yang sudah dialokasikan, akan terisi dengan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"11001"),". Penulisannya dari kanan dan jika ada slot kosong sebelah kiri maka terisi dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,r.kt)("p",null,"Hasilnya adalah angka biner berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"00000000000000000000000000011001\n")),(0,r.kt)("h2",{id:"a323-stack-memory"},"A.32.3. Stack memory"),(0,r.kt)("p",null,"Masih dalam topik manajemen memori, ada dua hal lagi yang sangat penting untuk diketahui, yaitu ",(0,r.kt)("em",{parentName:"p"},"stack")," dan ",(0,r.kt)("em",{parentName:"p"},"heap"),". Keduanya adalah bagian dari memory, tempat di mana alokasi dilakukan."),(0,r.kt)("p",null,"Data disimpan dalam stack memory dalam bentuk stack. Karakteristik dari stack:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Di Rust programming, stack digunakan sebagai default tempat alokasi memori"),(0,r.kt)("li",{parentName:"ul"},"Data yang terakhir masuk adalah yang pertama akan keluar (LIFO)"),(0,r.kt)("li",{parentName:"ul"},"Data yang disimpan diketahui size/ukurannya, dan memiliki batas"),(0,r.kt)("li",{parentName:"ul"},"Alokasi bersifat lokal terhadap pemanggilan fungsi"),(0,r.kt)("li",{parentName:"ul"},"Kecepatan pengaksesan data sangat tinggi")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Stack memory",src:t(9929).Z,width:"500",height:"345"})),(0,r.kt)("p",null,"Data untuk tipe primitif (seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"bool"),", dll) disimpan di stack."),(0,r.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,r.kt)("p",null,"Selanjutnya kita akan pelajari secara garis besar tentang bagaimana sebuah data dialokasikan di stack. Silakan mulai dengan mempelajari kode sederhana berikut (tanpa perlu dipraktikkan), kemudian ikuti pembahasan setelahnya."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n let x = 24;\n}\n")),(0,r.kt)("p",null,"Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," hanya berisi 1 buah data, yaitu variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," dengan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),". Ketika fungsi tersebut dipanggil, maka data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," disimpan di stack (karena di Rust by default semua data disimpan di stack). Nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," adalah numerik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", maka compiler akan mengalokasikan 32 bits di stack memory untuk menyimpan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),"."),(0,r.kt)("p",null,"Pada catatan karakteristik stack di atas, telah disinggung bahwa alokasi data di stack bersifat lokal terhadap pemanggilan fungsi, artinya apa? \u279c Semua data dalam suatu blok fungsi akan disimpan dalam sebuah group yang disebut dengan ",(0,r.kt)("em",{parentName:"p"},"stack frame"),"."),(0,r.kt)("p",null,"Pada contoh di atas, ketika fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," dipanggil, sebuah stack frame terbuat, dan data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," disimpan dalam stack frame tersebut."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Kolom ",(0,r.kt)("inlineCode",{parentName:"p"},"No.")," di atas merepresentasikan urutan data dalam stack agar lebih mudah dipahami")),(0,r.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,r.kt)("p",null,"Ok, sekarang mari lanjut contoh ke-2 berikut ini agar makin jelas."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something() {\n let y = 13;\n let z = 11;\n}\n\nfn main() {\n let x = 24;\n do_something();\n let a = 4;\n let b = 18;\n}\n")),(0,r.kt)("p",null,"Program sederhana di atas memiliki dua buah fungsi, ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something"),". Saat program dijalankan, lebih tepatnya saat fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," dipanggil maka sebuah stack frame dibuat dan data dalam fungsi tersebut dialokasikan pada stack frame."),(0,r.kt)("p",null,"Perlu diketahui bahwa eksekusi statement dalam fungsi adalah per baris, dimulai dari atas. Dengan ini maka data yang pertama dialokasikan ke memory adalah variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"x"),"."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Setelah itu, lanjut ke statement ke-2 yaitu pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,r.kt)("p",null,"Kembali ke teori, bahwa alokasi data stack adalah bersifat lokal terhadap pemanggilan fungsi. Maka dibuatlah stack frame baru untuk pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something")," dengan isi adalah alokasi data ",(0,r.kt)("inlineCode",{parentName:"p"},"y")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"z"),"."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"2"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"z"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"11"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"1"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"y"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"13"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Setelah eksekusi blok kode do_something selesai maka stack frame pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something")," akan di-dealokasi, dikosongkan, dihapus."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Sebenarnya tidak se-sederhana itu proses dealokasi memori, ada pengecekan ownership yang harus dilakukan terlebih dahulu. Namun agar makin tidak bingung, untuk sementara kita gunakan penjelasan di atas."),(0,r.kt)("p",{parentName:"blockquote"},"Silakan selesaikan dulu pembahasan chapter ini, kemudian pada chapter selanjutnya kita akan bahas tentang apa itu ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"),".")),(0,r.kt)("p",null,"Ok, maka dari 2 stack yang sebelumnya ada, sekarang tinggal 1 stack frame saja yaitu milik pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,r.kt)("p",null,"Dari yang sebelumnya ..."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"2"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"z"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"11"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"del"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"1"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"y"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"13"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"red"}},(0,r.kt)("del",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"del"},"do_something()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"... sekarang menjadi ..."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Ok, lanjut ke block fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," berikutnya, yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"let a = 4"),". Saat dipanggil maka ada penambahan data baru pada stack frame pertama."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"3"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"a"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"4"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"main()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Kemudian sampai di statement terakhir fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),". Ketika ",(0,r.kt)("inlineCode",{parentName:"p"},"let b = 14")," dipanggil maka ada penambahan data baru pada stack frame pertama."),(0,r.kt)("table",null,(0,r.kt)("thead",{parentName:"table"},(0,r.kt)("tr",{parentName:"thead"},(0,r.kt)("th",{parentName:"tr",align:"center"},"No."),(0,r.kt)("th",{parentName:"tr",align:"center"},"Variabel"),(0,r.kt)("th",{parentName:"tr",align:"center"},"Nilai"),(0,r.kt)("th",{parentName:"tr",align:"left"},(0,r.kt)("em",{parentName:"th"},"Stack frame")))),(0,r.kt)("tbody",{parentName:"table"},(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"4"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"b"))),(0,r.kt)("td",{parentName:"tr",align:"center"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"18"))),(0,r.kt)("td",{parentName:"tr",align:"left"},(0,r.kt)("span",{style:{color:"#2e8555"}},(0,r.kt)("strong",{parentName:"td"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"strong"},"main()"))))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"3"),(0,r.kt)("td",{parentName:"tr",align:"center"},"a"),(0,r.kt)("td",{parentName:"tr",align:"center"},"4"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))),(0,r.kt)("tr",{parentName:"tbody"},(0,r.kt)("td",{parentName:"tr",align:"center"},"0"),(0,r.kt)("td",{parentName:"tr",align:"center"},"x"),(0,r.kt)("td",{parentName:"tr",align:"center"},"24"),(0,r.kt)("td",{parentName:"tr",align:"left"},"milik fungsi ",(0,r.kt)("inlineCode",{parentName:"td"},"main()"))))),(0,r.kt)("p",null,"Setelah fungsi selesai dieksekusi, stack frame di-dealokasi."),(0,r.kt)("p",null,"Kurang lebih seperti itu sekilas peran dari stack dalam Rust programming. Selanjutnya kita bahas tentang heap memory."),(0,r.kt)("h2",{id:"a324-heap-memory"},"A.32.4. Heap memory"),(0,r.kt)("p",null,"Heap adalah salah satu tempat alokasi memory selain stack. Karakteristik dari heap:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Heap digunakan untuk alokasi data yang sifatnya dinamis, tidak diketahui size-nya, atau bisa berubah size-nya"),(0,r.kt)("li",{parentName:"ul"},"Data di heap tidak memiliki pattern tertentu"),(0,r.kt)("li",{parentName:"ul"},"Alokasi dan dealokasi data di heap bisa dilakukan kapanpun"),(0,r.kt)("li",{parentName:"ul"},"Kecepatan pengaksesan data di heap lebih lambat dibanding stack")),(0,r.kt)("p",null,"Ilustrasi perbandingan stack dan heap:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Heap memory",src:t(6907).Z,width:"414",height:"236"})),(0,r.kt)("p",null,"Tipe data non-primitive di Rust data-nya disimpan di heap, contohnya seperti Vector, ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),", dan beberapa lainnya. Penulis tekankan, bahwa ",(0,r.kt)("strong",{parentName:"p"},"yang disimpan di heap adalah data-nya saja, sedangkan atribut lainnya (seperti ",(0,r.kt)("inlineCode",{parentName:"strong"},"length")," dan ",(0,r.kt)("inlineCode",{parentName:"strong"},"capacity"),") tetap disimpan disimpan di stack"),". Lebih jelasnya silakan lihat ilustrasi berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let numbers = vec![12, 24, 7];\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Heap memory",src:t(6033).Z,width:"420",height:"184"})),(0,r.kt)("p",null,"Heap, selain digunakan sebagai penyimpanan data dinamis, kita juga bisa manfaatkan sebagai penyimpanan data jenis lainnya (secara eksplisit) menggunakan tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Box"),"."),(0,r.kt)("p",null,"Pembahasan Lebih jelasnya mengenai heap allocation ada pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/string-slice-vs-string-literal"},"String Custom Type vs ",(0,r.kt)("inlineCode",{parentName:"a"},"&str"))," dan juga ",(0,r.kt)("a",{parentName:"p",href:"#/wip/box"},"Box"),". Namun untuk sekarang, penulis anjurkan untuk lanjut ke pembahasan berikutnya terlebih dahulu."),(0,r.kt)("h2",{id:"a325-error-memory-management"},"A.32.5. Error memory management"),(0,r.kt)("p",null,"Rust sangat disiplin dalam hal penulisan source code, terutama untuk kode-kode yang berhubungan dengan memory management. Hal ini dilakukan oleh Rust untuk meminimalisir munculnya error seperti memory leak dan sejenisnya."),(0,r.kt)("p",null,"Namun meski demikian, potensi error memory tetap ada, dan kita akan bahas itu nantinya setelah masuk chapter ",(0,r.kt)("a",{parentName:"p",href:"#/wip/safe-unsafe"},"Safe & Unsafe"),"."),(0,r.kt)("p",null,"Nantinya akan dibahas juga tentang beberapa error saat compile time yang error tersebut berhubungan dengan memory management, yaitu pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership")," dan ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),". Untuk sekarang, mari lanjut ke chapter berikutnya terlebih dahulu."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/memory_management"},"github.com/novalagung/dasarpemrogramanrust-example/../memory_management")),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/ownership.html"},"https://doc.rust-lang.org/nomicon/ownership.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html"},"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/1.22.0/book/first-edition/the-stack-and-the-heap.html"},"https://doc.rust-lang.org/1.22.0/book/first-edition/the-stack-and-the-heap.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std/box.html"},"https://doc.rust-lang.org/rust-by-example/std/box.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html"},"https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.elementscompiler.com/Concepts/ARC/"},"https://docs.elementscompiler.com/Concepts/ARC/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Memory_address"},"https://en.wikipedia.org/wiki/Memory_address")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Code_segment"},"https://en.wikipedia.org/wiki/Code_segment")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Automatic_Reference_Counting"},"https://en.wikipedia.org/wiki/Automatic_Reference_Counting")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)"},"https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://log2base2.com/C/pointer/computer-memory-address-basics.html"},"https://log2base2.com/C/pointer/computer-memory-address-basics.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://quora.com/How-does-memory-management-work-in-Rust"},"https://quora.com/How-does-memory-management-work-in-Rust")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://medium.com/the-legend/management-memori-pada-bahasa-pemrograman-a33772635aa5"},"https://medium.com/the-legend/management-memori-pada-bahasa-pemrograman-a33772635aa5")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://imam.digmi.id/post/belajar-rust-memahami-stack-dan-heap/"},"https://imam.digmi.id/post/belajar-rust-memahami-stack-dan-heap/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://javatpoint.com/rust-ownership"},"https://javatpoint.com/rust-ownership")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/24158114"},"https://stackoverflow.com/questions/24158114"))))}d.isMDXComponent=!0},4275:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/basic-memory-management-1-ac98989ab48847e58470100c02455dab.png"},9929:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/basic-memory-management-2-114833fdf1f1ac3114d03494e6603ff1.jpg"},6907:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZ4AAADsCAIAAADLg1cmAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDVUMTY6MjE6MTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjEyOjAzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjEyOjAzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBmNjg5NmU4LWU1NzEt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"},6033:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaQAAAC4CAYAAACsL5hhAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDVUMTY6MTY6MzcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjExOjMwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjExOjMwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmVkZTM5NWJlLTIzYjUt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"}}]); \ No newline at end of file diff --git a/assets/js/04da11da.b3ba07e3.js b/assets/js/04da11da.b3ba07e3.js deleted file mode 100644 index 986d3192..00000000 --- a/assets/js/04da11da.b3ba07e3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[3007],{3905:(e,a,n)=>{n.d(a,{Zo:()=>k,kt:()=>o});var A=n(7294);function l(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function t(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var A=Object.getOwnPropertySymbols(e);a&&(A=A.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,A)}return n}function i(e){for(var a=1;a=0||(l[n]=e[n]);return l}(e,a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);for(A=0;A=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=A.createContext({}),d=function(e){var a=A.useContext(p),n=a;return e&&(n="function"==typeof e?e(a):i(i({},a),e)),n},k=function(e){var a=d(e.components);return A.createElement(p.Provider,{value:a},e.children)},m={inlineCode:"code",wrapper:function(e){var a=e.children;return A.createElement(A.Fragment,{},a)}},u=A.forwardRef((function(e,a){var n=e.components,l=e.mdxType,t=e.originalType,p=e.parentName,k=r(e,["components","mdxType","originalType","parentName"]),u=d(n),o=l,c=u["".concat(p,".").concat(o)]||u[o]||m[o]||t;return n?A.createElement(c,i(i({ref:a},k),{},{components:n})):A.createElement(c,i({ref:a},k))}));function o(e,a){var n=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var t=n.length,i=new Array(t);i[0]=u;var r={};for(var p in a)hasOwnProperty.call(a,p)&&(r[p]=a[p]);r.originalType=e,r.mdxType="string"==typeof e?e:l,i[1]=r;for(var d=2;d{n.r(a),n.d(a,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var A=n(7462),l=(n(7294),n(3905));const t={sidebar_position:11,title:"A.11. Perulangan \u279c loop, break, continue, label",sidebar_label:"A.11. Perulangan \u279c loop, break, continue, label"},i=void 0,r={unversionedId:"basic/perulangan-loop-break-continue-label",id:"basic/perulangan-loop-break-continue-label",title:"A.11. Perulangan \u279c loop, break, continue, label",description:"Selain keyword while, ada juga keyword loop yang fungsi dasarnya adalah sama, yaitu untuk perulangan.",source:"@site/docs/basic/perulangan-loop-break-continue-label.md",sourceDirName:"basic",slug:"/basic/perulangan-loop-break-continue-label",permalink:"/basic/perulangan-loop-break-continue-label",draft:!1,tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11,title:"A.11. Perulangan \u279c loop, break, continue, label",sidebar_label:"A.11. Perulangan \u279c loop, break, continue, label"},sidebar:"tutorialSidebar",previous:{title:"A.10. Perulangan \u279c while",permalink:"/basic/perulangan-while"},next:{title:"A.12. Perulangan \u279c for in",permalink:"/basic/perulangan-for-in"}},p={},d=[{value:"A.11.1. Keyword loop",id:"a111-keyword-loop",level:2},{value:"A.11.2. Keyword break",id:"a112-keyword-break",level:2},{value:"A.11.3. Nested loop",id:"a113-nested-loop",level:2},{value:"A.11.4. Keyword continue",id:"a114-keyword-continue",level:2},{value:"A.11.5. Label perulangan",id:"a115-label-perulangan",level:2},{value:"A.11.6. Returning from loop",id:"a116-returning-from-loop",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],k={toc:d};function m(e){let{components:a,...t}=e;return(0,l.kt)("wrapper",(0,A.Z)({},k,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Selain keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"while"),", ada juga keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," yang fungsi dasarnya adalah sama, yaitu untuk perulangan."),(0,l.kt)("h2",{id:"a111-keyword-loop"},"A.11.1. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"loop")),(0,l.kt)("p",null,"Notasi penulisan dan cara penggunaan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," ada sedikit beda dibanding ",(0,l.kt)("inlineCode",{parentName:"p"},"while"),". Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," tidak membutuhkan argument. Blok kode loop akan terus dieksekusi selama program tidak di-stop."),(0,l.kt)("p",null,"Silakan coba praktikkan kode berikut. Angka ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," akan ditampilkan setiap perulangan kemudian di-increment nilainya. Angka akan muncul terus sampai aplikasi di-stop."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut i = 0;\n\n loop {\n println!("nilai: {i}");\n i += 1;\n }\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"loop tanpa break",src:n(3723).Z,width:"608",height:"213"})),(0,l.kt)("h2",{id:"a112-keyword-break"},"A.11.2. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"break")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"loop")," menghasilkan perulangan tanpa henti, lalu bagaimana cara stop-nya? Di sinilah keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," berperan. ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," digunakan untuk menghentikan paksa eksekusi blok kode perulangan. Biasanya keyword ini digunakan dalam kondisi tertentu (sesuai kebutuhan), misalnya ",(0,l.kt)("inlineCode",{parentName:"p"},"perulangan harus berhenti ketika nilai i di atas max"),"."),(0,l.kt)("p",null,"Mari kita ubah kode di atas dengan menambahkan kondisi untuk menghentikan perulangan jika ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," nilainya lebih dari ",(0,l.kt)("inlineCode",{parentName:"p"},"5"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nloop {\n println!("nilai: {i}");\n i += 1;\n if i > max {\n break;\n }\n}\n\nprintln!("perulangan selesai");\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"keyword break",src:n(4722).Z,width:"451",height:"195"})),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Penulisan ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," boleh tanpa diakhiri semicolon ",(0,l.kt)("inlineCode",{parentName:"p"},";"))),(0,l.kt)("h2",{id:"a113-nested-loop"},"A.11.3. Nested ",(0,l.kt)("inlineCode",{parentName:"h2"},"loop")),(0,l.kt)("p",null,"Cara menerapkan nested loop (atau ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," di dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),"), tulis saja statement ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," di dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," sesuai kebutuhan."),(0,l.kt)("p",null,"Pada kode berikut, teknik nested loop diterapkan untuk membuat bentuk segitiga menggunakan karakter ",(0,l.kt)("inlineCode",{parentName:"p"},"*"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nloop {\n let mut j = max;\n let max_inner = i;\n\n loop {\n print!("* ");\n j -= 1;\n if j < max_inner {\n break;\n }\n }\n \n println!();\n\n i += 1;\n if i > max {\n break;\n }\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"keyword break",src:n(4237).Z,width:"454",height:"175"})),(0,l.kt)("h2",{id:"a114-keyword-continue"},"A.11.4. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"continue")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"continue")," digunakan untuk melanjutkan paksa sebuah perulangan, kebalikan dari ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," yang fungsinya menghentikan paksa sebuah perulangan."),(0,l.kt)("p",null,"Source code berikut murapakan contoh penerapan ",(0,l.kt)("inlineCode",{parentName:"p"},"continue"),". Variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," berperan sebagai counter perulangan. Jika nilai ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," adalah ganjil, maka perulangan dipaksa lanjut ke iterasi berikutnya. Dengan ini maka macro ",(0,l.kt)("inlineCode",{parentName:"p"},"println")," hanya akan menampilkan nilai genap. Dan program akan berhenti jika ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," nilainya lebih dari ",(0,l.kt)("inlineCode",{parentName:"p"},"max"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 15;\n\nloop {\n i += 1;\n\n if i % 2 == 1 {\n continue;\n }\n\n println!("nilai i: {i}");\n\n if i > max {\n break;\n }\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"keyword continue",src:n(5541).Z,width:"456",height:"230"})),(0,l.kt)("h2",{id:"a115-label-perulangan"},"A.11.5. Label perulangan"),(0,l.kt)("p",null,"Statement perulangan menggunakan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," bisa ditandai dengan label. Manfaat dari penggunaan label adalah bisa mengeksekusi ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," atau ",(0,l.kt)("inlineCode",{parentName:"p"},"continue")," ke perulangan di luar blok kode perulangan dimana statement itu berada. Umumnya label perulangan dipergunakan pada nested loop, dimana ada kebutuhan untuk menghentikan/melanjutkan paksa perulangan terluar."),(0,l.kt)("p",null,"Berikut adalah notasi penulisan loop dengan dan tanpa label. Nama label diawali dengan tanda petik ",(0,l.kt)("inlineCode",{parentName:"p"},"'"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// loop biasa\nloop {\n // statements\n break;\n}\n\n// loop dengan label\n'namaLabel: loop {\n // statements\n break 'namaLabel;\n}\n")),(0,l.kt)("p",null,"Mari kita pelajari dan praktikkan kode berikut ini. Dibawah ini adalah sebuah program sederhana menampilkan angka yang hasilnya bisa dilihat digambar dibawahnya. Perulangan di level 2 akan dihentikan secara paksa ketika ",(0,l.kt)("inlineCode",{parentName:"p"},"j > i"),". Sedangkan perulangan level pertama atau terluar (dengan label ",(0,l.kt)("inlineCode",{parentName:"p"},"'mainLoop"),") akan dihentikan paksa dari perulangan level 2 jika kondisi ",(0,l.kt)("inlineCode",{parentName:"p"},"i > max"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"let mut i = 0;\nlet max = 9;\n\n'mainLoop: loop {\n i += 1;\n let mut j = 0;\n\n loop {\n if i > max {\n break 'mainLoop;\n }\n\n j += 1;\n if j > i {\n break;\n }\n\n print!(\"{i} \");\n }\n\n println!();\n}\n")),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"looping label",src:n(5302).Z,width:"514",height:"227"})),(0,l.kt)("h2",{id:"a116-returning-from-loop"},"A.11.6. Returning from ",(0,l.kt)("inlineCode",{parentName:"h2"},"loop")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"Returning from ",(0,l.kt)("inlineCode",{parentName:"em"},"loop"))," merupakan teknik pemanfaatan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," untuk menampung sebuah return value dari blok kode perulangan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),". Agar lebih jelas, silakan coba kode berikut:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut counter = 0;\n\nlet result = loop {\n counter += 1;\n\n if counter == 10 {\n break counter * 2;\n }\n};\n\nprintln!("result: {result}");\n')),(0,l.kt)("p",null,"Pada kode di atas, variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"result")," dideklarasikan dengan predefined value adalah blok kode ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),". Di sini artinya variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"result")," isinya bukan blok kode perulangan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),", melainkan isinya adalah apapun yang dituliskan setelah keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"break"),". Unik ya?"),(0,l.kt)("p",null,"Variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"counter")," yang nilai awalnya ",(0,l.kt)("inlineCode",{parentName:"p"},"0"),", di-increment dalam perulangan. Ketika nilai ",(0,l.kt)("inlineCode",{parentName:"p"},"counter")," adalah ",(0,l.kt)("inlineCode",{parentName:"p"},"10"),", nilai ",(0,l.kt)("inlineCode",{parentName:"p"},"counter * 2")," dijadikan sebagai return value. Dengan ini maka variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"result")," nilainya adalah ",(0,l.kt)("inlineCode",{parentName:"p"},"20"),"."),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"looping label",src:n(5249).Z,width:"553",height:"117"})),(0,l.kt)("hr",null),(0,l.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,l.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,l.kt)("pre",null,(0,l.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/perulangan_loop_break_continue_label"},"github.com/novalagung/dasarpemrogramanrust-example/../perulangan_loop_break_continue_label")),(0,l.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-05-control-flow.html"},"https://doc.rust-lang.org/book/ch03-05-control-flow.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.loop.html"},"https://doc.rust-lang.org/std/keyword.loop.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.break.html"},"https://doc.rust-lang.org/std/keyword.break.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.continue.html"},"https://doc.rust-lang.org/std/keyword.continue.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/loop.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/loop.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/loop/nested.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/loop/nested.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/loop/return.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/loop/return.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/loop-expr.html"},"https://doc.rust-lang.org/reference/expressions/loop-expr.html"))))}m.isMDXComponent=!0},3723:(e,a,n)=>{n.d(a,{Z:()=>A});const A=n.p+"assets/images/perulangan-loop-break-continue-label-1-f02ae31c07ab672a301cbf6db2f23179.png"},4722:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcMAAADDCAIAAABxk+09AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTQ6NDQ6NDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAzOjA5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAzOjA5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY3MGI1M2RkLWY0MGUtMWE0NC04NmNkLTFkMmI3ZDI5NmY4MiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2NzBiNTNkZC1mNDBlLTFhNDQtODZjZC0xZDJiN2QyOTZmODIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2NzBiNTNkZC1mNDBlLTFhNDQtODZjZC0xZDJiN2QyOTZmODIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY3MGI1M2RkLWY0MGUtMWE0NC04NmNkLTFkMmI3ZDI5NmY4MiIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNVQxNDo0NDo0OCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoM3lT8AABwPSURBVHic7d1PaONYngfwn5NNdXo8pN24JmWKQt0ii6cy1LCjJkvhMaxnA4u3D7mIBkOgDr7V3XvNYcnZ975l2ECzgcaXHJpcwvhgQrHFaGB6N4PZGld5h8adLVPebHsm3SbJHCTZkvye9ORnW3LV98NAT1yS3h/Jz3qS/HVCURQCAAAJS1FXAABg4WEkBQCQhZEUAEAWRlIAAFkYSQEAZGEkBQCQhZEUAEAWRlIAAFkYSQEAZIUcSbViSS8oRERKQS8VtanXRyvOYqsSRi2eRIhemqwguerNhLtKWrFUCqyicCskjzqloDMKCiw9hp0MFLMd9zchllUKejbZOTtpz6w2RMZ5R8/phW6t7luKVixlU8O/es2jE2P89dHLvmsPOmc+pRnnHXVLVajtWkIrltQrv9XCYxdEREpBz2VW/Gs5Beyum0FDGZhtd+8lczfNr3SIm/FDMVY7TnwkVQpbGeqczfg9Re16LV0sbRWUdlBJ9rtdKei5UpGOTrrmSH8kVEXn2jm9QNzBot3qbuU2NWozB+Up4hSkqGnqNDtpdZaHjBKm60IxTo4EOo7T9rGPj9mcX8xtF8N0xWnHCY+k2iZrHB2eNwxPYswzKCJyvg8cLzKXdJ89GucdNUT/tOutzVJ2nZS19Mqg2wo5Fpgjd3ZYnFYsZVOu+rTrrc2SWlCMwGGG2XYK6KXRi8yCFDW90m8ZLXJ++jpXp0GHU7pWLK1fdZKZzMqg0+yms/wTW0Ud7zrH5nKlUs6uabeg51ZbjmZYfzCqNHrJ1Z+Oc81RfcQ7mdmfzG0yX/RsxNwCu+eFOtm7pN8bwTyrek5b5j/0mkcnhlLQt+h5azXHP0LM1zh7M83YpkCH2P9wuclcXfxYGm8mu0WctgceS/YxxzgUDd5bJpIdJzqSauupQffMc5Snsmrn7OioTVqxlC1qxomhFDbp+dFR26qQeWqpFLYyfe9MWyvm7BeVgmdC3251t3LrGlGoj5p2q7uVyfieX7J1rwaUXlOIeGsZF71s8Ckhq+1E7F5idAi7IEVNr/RaBrW1fs7+F0fXkVYsqbzSL4lSmdXmUXO9lM2a/+W0gtV17XqtzZhSsc8KmVUyt6AU9Nyqo5NGJ79KQc/lilrb7AexTmb1Z5e1TfaLo/qW3OfgY6WLdjLn8GYuSUQrmVyu1zw6MpSCnlMLZLSIVjI57xHCeHdw9uYla5vMTtaK9imCUtBzmX6zVm+TtuldXTHqJHwskco85octGm6S13YGRn+yD8V47TjBO07KWpL6l95jvNe02mVc9Ci1rhG16yd2S9ut7mBlNW0tmlp33yfQ1lO9ptWGdr3VW0mrjvdo+7JPyTXBqZxWzKYGnXOidr12dNahTK4kcJPDoX3ZH/1hnBwdjY1xxnmHMpsBdzp4bR/vJaLxDmEXpKjpld6FYa5s9pFSUEddF1T6oHNuOP/Lr/tkXWfVkl0lBm0zs9JrWRVt1593BqN+YHTyilmhUqlUGt1o8vQnc5vsFy2qOYy635Pu0kN1MjH2JnfJQefsxBi+ymhRco357jDXZe9NzzbZbdfWU2QeStRudQeO95d79XSYYynomA9uOxv73cEUlx0neE6aXl3x/ffu1YBWzZY4zqyJemblauliKVsqZUczgLUkpcxXhhX1bC+7muafJRLRaH3n1M08DzI/iUvFNOeWk5uyliS68l1E6CyZ1XYXu5cYHcIuyD4jJRp9+LI/yAVKDzJJ101gcNXl/Mt4JwfcZhsedcxtcgpayWRSNOiMXQWaeBez9yZnd4yuodjdPVa/VVLI/93h4d2mVmS1vXs1oIzZPvfFnLEqhTmWwhx1wW23/5H37mAvH48dJziSDo9ZjvTqyuDKIK2Yy5A9aXJO6+z7DlqxlNMLVGuRz611e3u8d5zFb/12/bmq53yn7EOKml5hnHB7Nxh0HY/b9hFHq7wd4phUjwpS1PQKrTjfUgOVM5IKlC4oTNdNYsXxCen5gA51sZSs/iRaZW+TU9Cgc/acthyXFcRLFz686+nJd8fA/EwfO7q1ovAmGG3XqH3Zz2Xs8Xngd+tY9Fiqt7ViaUpHnRv33cEUjx0nOLv3n24rBTU16FpvcWtMUgpbmfHz2O7VwNxeqztIZblPBrIvJoQhNDwSmZ284pgPaEXnTNJhOL324dt2q5fcVbI7hFlQenVl0Dk7sp11Bitpal/27TmJUtCddxB8Sxfn6rru1WC81daRoBWtD29+lRhto5RqXT1QCmrKM1EV6eRhPa2jjrVN9ou2dr3W7KWyY1cxRqVP2MmuvRl+d2jFbGrQbQW9O4IwO9mc9tqHUuCJnnjlJY8677Hk4upP5qFoisOOE73jZFz0slnv/fSx+XX7vKPmrBd7nc4gs0re0+Ve0xzv6zUq6Lnh6ZbrNN45qRXnuTPpd8rqqbvYwz+eRwpWMvZ9RKv2rLZ7S6rZNwHGO2S8oLTnLl+71d3K6IVurdmz5iS95llH3RquwypdCL/rzDNUq6W95tGJMXph0Gl2BtlVIjJOmutjVXI2M1sqZc3VT46oWHLcgeW03ezksT5m9mebtU3mi6O3oXFytqbnciVddU4fR6UzW8TsZObeZL4RuMavUzHeHZd+W3BjdnK7tVlyTW+4E2fRY6mgyB11zoNrdCxx3x3jh6KnytHuuITw7zgpBT2X7s78IW2a19Pgk5hbzeLbBbMXbdvnXbrrSaD5lTO/d/O8RL3jxJ/MNz8SRB6ZlzKPL1JNTOwx80UqKIaibfvb2vPuS9LCF78WR9Q7Lsy3RcW/fjQ5bTPTH5vyAYAcx6yXiAIvfkFY4rN7AABgE7x3DwAAXBhJAQBkYSQFAJC1/MEHH0RdB4+7id2fL/905fa/etNY8m5i9+fLD76//e8/z6YOpBVLv3zw/+ev/i/M9rmbKmw9evTo0aOf3p3OFicoX6ho8SUDtjKtrhPbplLQ//nh6n++8PvupUgJwm0X2qOjhR7ckazbXATvNq1Y+rs10aZM51iKXJh791OV+Ozx0p3Rn7ff/P7mN47B7s77ohsSX3IRzDzQmYiifmTznTFKX/JlPr8j9NXE6B9oFnpKUTCvXR43mVN4Sa1Yyqam8a6LbCQlIqLL6y/Ox158ffvF62uh1cWXBBHij+RF/fBelITbrqwlKfxX9WJNNO49zAOTkx9LjgA9rVjK+gzd7CW1YilLnc6A0syVwol2JPVynKgOB9m7id2NxDff3t6/t0RE9P1N43e3r5hLWgvbl36tJYmI6MeJzzaW7rheHG3hh2+vv3w5trq/oDTZYTpvlkafgJ4/xUoZi8LtcrKBx8N9GZm7vNBcRiozJ9yXGPnNnvwcVmAwZ2HfkCMS/i6O2O6weIKieXnDjFzklspsO3N3MAPU/MOnBVvoSTsWTCYmZovqbW8v8Qtixr0zw5KJxPLaWVng/P4cW1lNDTpnxqi0NCfelrUkUbqoXp0d1amgZziVCvXUbbxG0tsvn12PTfyJKHH/3u0fnl3/9m5id2PpZ3evX71mLpn4bGNpNCw6fHiP3KsnPnu8dMccgu8mdjeWP/3u+itK7A5XDxhSmWmyrOzqi142O8rIm9o5yniSLnGCjb0pwkcn7NBcViozO9y3zlhyGMdmjr8X9lDMCPNmdp0k4d1BxAqK5myTkYtMbVYvje2Orj2EkZU4MPwU46RcC+AEb4smEytGPc1Memb0EjdWeTzunZtZTkJpd+yjjhMU7ZVeHUUDWgEonCBO1pIa1U9qRGPpeH4t8hXtvfu15d3H5v8Sn/gu+ObF7W/t/5/8sd+Sd+4xNuVZ/aOPE3fo9hvzfPU1vSH68Cf0yU+WiG7++DK41uw0WWZ2tXE+yjJW1DQFBC4L8ybp8oONPSnC4b6GIRoUPaQVs2R3AiuuWDwTWpzw7jD/wRsUzWkINxeZxbM72vXa0dHRUbNHZMcvnRi+KdeTE0wmbrNb5B+47sFJaOO2IlReuws7KJpdqYJeKpWy1DxqBhzf4ktOtF9ieJ10crf/8e1t/t7Sw8f0kNyze7f0+wkiuv/z5V3Hi2vvSZXNya4efTArapq6z2d3BT4wz5XcsZUzoBWz1LQvegWFeftzTdetRKgw82GR0v1Cd7m5yFJE9lFYwsnEjBYpaph9xLha4Z/KLJLXLmV44k1ESkGn/gWvKOElw+ZMD8Vrdi/r1cubVy+JiH71i+X77y397O41cyTt/uWW1sjztMCvfiFdPOuqij2UKmuzHUj9EpSHZvFOHnKNo6axDlEKghuzrxfIZBaN7w73eYgVFM0uXzgXOQyRfRSOeMI3q0UKhbkUyP7k8UllFslrn1z3akCD7pnjqjSvMPEliShszrTtLX0yv9W79fnXVy9vf6DE/Y/GV1m6d5eIEp/63ndipsly03nbre4guaap6X5rorejbxSuzTfYmMz1s6OcaZ/Q3AkpBX00ryciToeIZ0KLC7c7HDV2xJN7OzlkLrKQoJRrEcwdJ5RMzGwRv5dYBfnP1sczy+Xz2n21W93BSmbL7FB3jLo5kR8mefss6YeRwu4jVuekzvs8a8u7j+mHb6+//E58Sddtoh++vf7qNdFdZkm3X7642d1Y3n1s/f3mxfVXL2/U1PL9jeXdDXrz4ubNxlKSV09mmmybl11t/op0ptesi/eEhRmFy6kSJ9iY82tXntBcxy39YSrzBaMY163eUX5z13wTj+aJZiY0o0OYXSdJfHcQs0MYnWzuM28uMjHbHqKe/inXAsbTjkWTidkt8jloGbHKY3HvvpnlwXnt7GMpRGfUqGBX0ncmzlzSWXomVyrlBp2jWisghZ0PWVAxMu3nrueVIvz2iSAXecY7azotCrHau/btj7d0dg8g4+3LRZ5Oi9r15x2y58k+zG9CPX9nhlGK2ewe7F8ums+XRoFnrrnIowfme7MqYnotEvr20ruY147ZPQCALMzuAQBkYSQFAJCFkRQAQNY7csfpriOdZArMewSx+nnGwIdOfBeQfQTnXXvkJRAr5cjX6LYTL3Rq7lWKSAzfXCLiNJJ+9PFS/l5i+Of0Bj7L9DKhjRMzY6dUJNf+jjCI1zjvqFucVLHZm1np40G84uG+Uyh74r3JSTniF+XJhGaHTkkJWaXI8N5cMRenkdT05sX1V6/pk83lh/eWP/3u+qvX09joDDKhHUlysdBudbeC8iAXq3RWEK94uO8ieQszoeXE7c0lIH4jqem3/3vzcG2JyJqYm8PraJL+HSv+WTwTmr3keCzpzR+ejeL4fMUgiLddb22WvGmOc4pArreDSueHTxvsFzVGEK94uK+nQa6+nzwPO3jHTfYgsGiaibegtPeseYKrNMzKC/USv5CxA0wp6LkM2ZvXiiVXVOpcZhizFteR9JOfLBHd/uXPRD/iLTIW/8x8kZ0JzVxyFBT90cdL+Xv0ze8Fh1GKRxAvGRe9rOocWuYXgcwqndV2Gg+fNliJ1MaJwQjiFQ/3NRs8DFYe1iggD3u4N7id7NlxZLRk8pvHvnnuM6AwKn8mG1vH7hDB1HCD00zWAWZm1W0VlLbjQGdngU/alojF7979hxvLu4+XH75303jmSr0bx4x/Fs+E9i55l+7Q7esLIqJX3/lFSYUxxyBeIjLOO5TZtKN95h2B7C6d33ZP+DTzRb9mCkX2mqev7u8rBudhC0QLu3ecZH4zOxOaiVVQ+7Jv/WPRTD4KmWPH7BDZ1HDOQWucnHUos1lwHJRhD+9Yi9856ZsX1g+B/P3H12bY6Jy8ph82Eu//iOjPVn7+ZagfduaYXxAvkcgvPswyAtlbOqftLiusgnwSqUUje9OrzC+WS+dlenecVpxt6qur7LGCulcDdU0hbZ16fesDIOS36ZmVl0kN5x9gZr5Upm+H2MplgcdN/EZSIqLXt988oPv3Ep+8FJ9fT8eHG8u7G0TuM9bJzTOI19wM63Kl18wikF2li7WdWdAUIns5nwbTz1qezTYFC2pf9nPraW01eXXeWt3UlKtk2GGdWXnZ1HD2QasVc+lus5N23idc8IujDvGb3ZscuctE1jw9IIBZ0kcfJ+7QzR+eXX/x7PqLZ5M9MxBpEK/FuLBnSVFEII9KD267FT7NfJH9ORAispfVzuA8bBehPOxp5DcL4Vd+bY26rXb3Krm+uboS6pSUuc2QqeGsWGXWAaYVs6leq26M0qSCD8VFEqcEE/N5Uus2vXmP6Pubxu9u05vLD9eIiN68uKGNpaQd6sy6oc9+0VkKd8mXiU8fL33oWNKuSRg+t9p7nU4ys9oa3gL2/nAj64742M334Vo+Nz1Zt9l7zbMrdYuec7ZJ7FKGC5q/02xXnlVPRumstndZBTHb6P3lZ8dNZOv1wPvkzk0w7t07Hq5gPaLA6GTOE6bsbboq73/u5f35bt7qnIJo9JQHcftEfJvBLWI84Mt75tdc+HKz5Hhg1vGQMH+ziyZOI2m0Ptlcfrg2euzpV79Yvk/c39SbuulGC8/uGwIi9fQrnfmYDhKp4w/7KEA8r5NGwf3boon33yP6fn6lTzda2P5Nr+kTqefsSgeIK4yktt/87ubTx/YvPJPfjzzPwlyjhSXErp6eiw22yOvlNbd6LkqHvG0wuwcAkBXXe/cAAIsDIykAgCyMpAAAsjCSAgDIwkgKACALIykAgCyMpAAAsjCSAgDIwkgKACALIykAgCzJkbRcrdVqh3t5++/83mHNVC1PsDoAwCKacoJJY/9Jgyi/d1hJTXfD4/J7hxUtSURErWO9cjDr8gAAeGaSYJLfO6ykTmc6upWrtR0yB9BytbazblSf7DdmVxwAgA+Rc9L83uFT+vw0VdlRiYZngKNzwuBTQsf5Y98a8/irl6u1HdV/m/m9bbVvVM0FDmrGdiW7nacGhlIAiITgddKkVtnuVXVdrxp9dXsvT0SN/Sfm34Er5/d0+lzXdV3XqwZpT0OuzpBNJfvNU3PgLFcrWpKSqWzAOgAAsyJ6x6l1bM6eG6fNfthRq7FfsWfeIqsfVHRd6MqAeXtrh4714xatP8B9KwCIyFwy8x2TeyKils+iwpJapdI61vUDc/t08TXm9gAQkTmMpOVqRSOjqu83aFq39Zu9PvWbVfvENZtK9ntN6a0CAExmTk/mX/ypQUSU33vqODflKFcDH0dtnDb7SeuCq3n7yb5qCgAwfxOfkzpn7Du12g61jvVKk/XiQc3YruzUajtE1DKMvpbirS7+1FRj/wntHVYqtVpl9DgAAEA08It4AACy8L17AABZGEkBAGRhJAUAkIWRFABAFkZSAABZGEkBAGQh6RkAQNaUz0mlEp5Cw0AMALEg+b37g4ouE+cssXq5Wtshw+gT0vQAIGqLmfRM5ep2r6rv096hJtAAAICZWsykZzqo4Jv2ABAborN7R9LzUy2VJQoxjjX2K/bSIqtLXjEAAJi3hU16BgCIjTk8T2onPVvT+/nc1gcAmJ/FTHoGAIiTBU16dq6uVWq1CtKeASA6SHoGAJCF790DAMjCSAoAIAsjKQCALIykAACyMJICAMjCSAoAIAtJzwAAsqb8vfvG/hMrMS813Q2PcTybH+6hfgCAaVvQpOf83tNss6rvN8w408O9Jr7hBACRWdCkZ/Pcl4iIDr5u7eyEzPkDAJimBU16BgCIEdE7To6k534yFe63kxr7FXvqLbL6QUXXxS98lqs7at+o4TopAERnsZOe83uHO2rrWMc1UgCI0gInPef3DisaGVXctweAiC1q0rM9jOKWPQBEb0GTnsu6liQr5JmIRo8EAADMH5KeAQBk4Xv3AACyMJICAMjCSAoAIAsjKQCALIykAACyMJICAMhC0jMAgKxFTXouV2tmxh8h6RkAojaTJ/Pze4eV1Omchrf83mEl28Q3nAAgOgua9OzQ+NNFJVzKHwDAdC1+0nP5kdpvnuKEFACiI3qd1JH0/FQL+Vsfjf2KvbTI6oI/7uQ6qcVACgARWtyk5+FPOeX3DmuHD3ChFAAis8BJz7ZJfhAFAGCKFjXp2bm8riVbX+MxKACIzIImPbuuF+B5UgCIFpKeAQBk4Xv3AACyMJICAMjCSAoAIAsjKQCALIykAACyMJICAMhC0jMAgKwpn5NOLeFJkDlyYywGgEhJJpgI5jbNaPX83lPtotVS1yW2AQAgbYGTnvN7TzUyql+nKtsCjQAAmJmFTXo2x9HPEaUHANETvU7qSHoOHWHX2K/YA57I6gcVXQ88IS3rGEcBIC4WM+m5XN1ZN6oVjKMAEAtzGEntpOf9Bk3pB5zLj1RKUqVWq9ivVGo1Hdl6ABCRuZyTepKeA85Jg+84uW75l6u17R5+ewQAIrSgSc8AADGCpGcAAFn43j0AgCyMpAAAsjCSAgDIwkgKACALIykAgCyMpAAAspD0DAAga8rfcWrsP2lM6Suh/rxf5cdz/QAQnQVOeraTTgEAIrbASc8AADGxsEnPAACxITq7dyQ9P9VSWaIQ0+rG/jBJVGR10Sl/UrNz9XACCwCRWsykZ/vW1nDrtSphMAWAqMzheVI76dma3k99Ot84beISAQBEaU5P5ruSngOUq6KPo9Jwm62vcUIKAJFZ0KRn5+p9+5dNAACigaRnAABZ+N49AIAsjKQAALIwkgIAyMJICgAgCyMpAIAsjKQAALLm8m1RljBRUrEzs8qXq7UdFXGBAIsmsnPShc6CWujKA8DURXZOCiySydkAEI3Jk55dX9m0XytXa9u96uf01PyH1rFeOcjvHVZSp451hn+wy/JkQvNKL1dr5ivkWFp89aDSfZsZvPpoyaBtBkdfA0DchU161o9b6k61TGbE08WxFfC0vjP8XbukVqmkToeh0KFqw8yEZuZMl6s7aut4mC5lxqeKr84p/andIl23BzNeM8cxl2RuE9HXAG8Z0eukdtIzHXzdovUHROVHauvYGhka+6etZHbbGmP6RrVyQGbaXTIVqjaN/Yp9q8VcO+suffhi+ZFKVv5T47TZp/UH+TCr86mP3CFU/GZ68Zf0bpNbTwBYUBNdJ02mKE/rpFoBT6a+Yf23eWqPEmYac5jfYBbNhG72+qQ9KhMdUH47m7TLlIuUbuw/yVZrZqPsawMPeM0cqzl7ScY2pesJAHEz0Uja7xER83qe3MmVnQm936CAn3pu/OmiotkDV9+o7jdCrc5l3/EpV2uVwz16ckphLluyl/Rucz8rX08AiJWwT0GVqztqv3lKjdNm37pgKsKcfVO5WglKehbKhM7vbVtXSXVd150PX4aJlPbR7JmXK8WbGbykvc1p1hMAYkH0nHQ4cR1OUfef0N5hZTid5T9O3tj/fPuwUqnVKtQ3jo3+Top4Sc+sTGj2Jk/1mnMq3TeqT/aFV2dzT7lbxzq3mcSsfNCSw202ZhB9DQBREkl6Dnpyaf48NcrvHVayTXwxCAAispjfu89+8KPb21v7r1/+49++f9P5HwyjABARodn97c3Nzc2saxLGwb/UNv7tn37963+4ubm5uUkk/vjlZ//671FXCgDeWfgdJwAAWYs5uwcAiBOMpAAAsjCSAgDIittImkgkElHXAQAgnLjlkzoebgIAWBBxOycFAFg8GEkBAGRhJAUAkIWRFABAFkZSAABZGEkBAGT9FQWZAW1qe1RkAAAAAElFTkSuQmCC"},4237:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcYAAACvCAIAAADojOlYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTY6MjM6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAyOjI3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAyOjI3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFiZjg3ZTE5LTEzNjAt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"},5541:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcgAAADmCAIAAADeEoJPAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTc6MDQ6MDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAxOjUwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAxOjUwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ1N2QyMmIxLWVkY2Et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"},5302:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgIAAADjCAIAAAB4oOuVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFEmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTg6MDg6NDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJmM2NkMzdmLTlhNDYtYmQ0Ni04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"},5249:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAikAAAB1CAIAAAAEIubsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMjM6MDU6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAwOjA3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAwOjA3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmM3ZjYwYWZlLWJhMGIt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"}}]); \ No newline at end of file diff --git a/assets/js/04da11da.d61e5604.js b/assets/js/04da11da.d61e5604.js new file mode 100644 index 00000000..e5bc661a --- /dev/null +++ b/assets/js/04da11da.d61e5604.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[3007],{3905:(e,a,n)=>{n.d(a,{Zo:()=>k,kt:()=>o});var A=n(7294);function l(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function t(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var A=Object.getOwnPropertySymbols(e);a&&(A=A.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,A)}return n}function i(e){for(var a=1;a=0||(l[n]=e[n]);return l}(e,a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);for(A=0;A=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var p=A.createContext({}),d=function(e){var a=A.useContext(p),n=a;return e&&(n="function"==typeof e?e(a):i(i({},a),e)),n},k=function(e){var a=d(e.components);return A.createElement(p.Provider,{value:a},e.children)},m={inlineCode:"code",wrapper:function(e){var a=e.children;return A.createElement(A.Fragment,{},a)}},u=A.forwardRef((function(e,a){var n=e.components,l=e.mdxType,t=e.originalType,p=e.parentName,k=r(e,["components","mdxType","originalType","parentName"]),u=d(n),o=l,c=u["".concat(p,".").concat(o)]||u[o]||m[o]||t;return n?A.createElement(c,i(i({ref:a},k),{},{components:n})):A.createElement(c,i({ref:a},k))}));function o(e,a){var n=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var t=n.length,i=new Array(t);i[0]=u;var r={};for(var p in a)hasOwnProperty.call(a,p)&&(r[p]=a[p]);r.originalType=e,r.mdxType="string"==typeof e?e:l,i[1]=r;for(var d=2;d{n.r(a),n.d(a,{assets:()=>p,contentTitle:()=>i,default:()=>m,frontMatter:()=>t,metadata:()=>r,toc:()=>d});var A=n(7462),l=(n(7294),n(3905));const t={sidebar_position:11,title:"A.11. Perulangan \u279c loop, break, continue, label",sidebar_label:"A.11. Perulangan \u279c loop, break, continue, label"},i=void 0,r={unversionedId:"basic/perulangan-loop-break-continue-label",id:"basic/perulangan-loop-break-continue-label",title:"A.11. Perulangan \u279c loop, break, continue, label",description:"Selain keyword while, ada juga keyword loop yang fungsi dasarnya adalah sama, yaitu untuk perulangan.",source:"@site/docs/basic/perulangan-loop-break-continue-label.md",sourceDirName:"basic",slug:"/basic/perulangan-loop-break-continue-label",permalink:"/basic/perulangan-loop-break-continue-label",draft:!1,tags:[],version:"current",sidebarPosition:11,frontMatter:{sidebar_position:11,title:"A.11. Perulangan \u279c loop, break, continue, label",sidebar_label:"A.11. Perulangan \u279c loop, break, continue, label"},sidebar:"tutorialSidebar",previous:{title:"A.10. Perulangan \u279c while",permalink:"/basic/perulangan-while"},next:{title:"A.12. Perulangan \u279c for in",permalink:"/basic/perulangan-for-in"}},p={},d=[{value:"A.11.1. Keyword loop",id:"a111-keyword-loop",level:2},{value:"A.11.2. Keyword break",id:"a112-keyword-break",level:2},{value:"A.11.3. Nested loop",id:"a113-nested-loop",level:2},{value:"A.11.4. Keyword continue",id:"a114-keyword-continue",level:2},{value:"A.11.5. Label perulangan",id:"a115-label-perulangan",level:2},{value:"A.11.6. Returning from loop",id:"a116-returning-from-loop",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],k={toc:d};function m(e){let{components:a,...t}=e;return(0,l.kt)("wrapper",(0,A.Z)({},k,t,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Selain keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"while"),", ada juga keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," yang fungsi dasarnya adalah sama, yaitu untuk perulangan."),(0,l.kt)("h2",{id:"a111-keyword-loop"},"A.11.1. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"loop")),(0,l.kt)("p",null,"Notasi penulisan dan cara penggunaan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," ada sedikit beda dibanding ",(0,l.kt)("inlineCode",{parentName:"p"},"while"),". Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," tidak membutuhkan argument. Blok kode loop akan terus dieksekusi selama program tidak di-stop."),(0,l.kt)("p",null,"Silakan coba praktikkan kode berikut. Angka ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," akan ditampilkan setiap perulangan kemudian di-increment nilainya. Angka akan muncul terus sampai aplikasi di-stop."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut i = 0;\n\n loop {\n println!("nilai: {i}");\n i += 1;\n }\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"loop tanpa break",src:n(3723).Z,width:"608",height:"213"})),(0,l.kt)("h2",{id:"a112-keyword-break"},"A.11.2. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"break")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"loop")," menghasilkan perulangan tanpa henti, lalu bagaimana cara stop-nya? Di sinilah keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," berperan. ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," digunakan untuk menghentikan paksa eksekusi blok kode perulangan. Biasanya keyword ini digunakan dalam kondisi tertentu (sesuai kebutuhan), misalnya ",(0,l.kt)("inlineCode",{parentName:"p"},"perulangan harus berhenti ketika nilai i di atas max"),"."),(0,l.kt)("p",null,"Mari kita ubah kode di atas dengan menambahkan kondisi untuk menghentikan perulangan jika ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," nilainya lebih dari ",(0,l.kt)("inlineCode",{parentName:"p"},"5"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nloop {\n println!("nilai: {i}");\n i += 1;\n if i > max {\n break;\n }\n}\n\nprintln!("perulangan selesai");\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"keyword break",src:n(4722).Z,width:"451",height:"195"})),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Penulisan ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," boleh tanpa diakhiri semicolon ",(0,l.kt)("inlineCode",{parentName:"p"},";"))),(0,l.kt)("h2",{id:"a113-nested-loop"},"A.11.3. Nested ",(0,l.kt)("inlineCode",{parentName:"h2"},"loop")),(0,l.kt)("p",null,"Cara menerapkan nested loop (atau ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," di dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),"), tulis saja statement ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," di dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," sesuai kebutuhan."),(0,l.kt)("p",null,"Pada kode berikut, teknik nested loop diterapkan untuk membuat bentuk segitiga menggunakan karakter ",(0,l.kt)("inlineCode",{parentName:"p"},"*"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nloop {\n let mut j = max;\n let max_inner = i;\n\n loop {\n print!("* ");\n j -= 1;\n if j < max_inner {\n break;\n }\n }\n \n println!();\n\n i += 1;\n if i > max {\n break;\n }\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"keyword break",src:n(4237).Z,width:"454",height:"175"})),(0,l.kt)("h2",{id:"a114-keyword-continue"},"A.11.4. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"continue")),(0,l.kt)("p",null,(0,l.kt)("inlineCode",{parentName:"p"},"continue")," digunakan untuk melanjutkan paksa sebuah perulangan, kebalikan dari ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," yang fungsinya menghentikan paksa sebuah perulangan."),(0,l.kt)("p",null,"Source code berikut merupakan contoh penerapan ",(0,l.kt)("inlineCode",{parentName:"p"},"continue"),". Variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," berperan sebagai counter perulangan. Jika nilai ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," adalah ganjil, maka perulangan dipaksa lanjut ke iterasi berikutnya. Dengan ini maka macro ",(0,l.kt)("inlineCode",{parentName:"p"},"println")," hanya akan menampilkan nilai genap. Dan program akan berhenti jika ",(0,l.kt)("inlineCode",{parentName:"p"},"i")," nilainya lebih dari ",(0,l.kt)("inlineCode",{parentName:"p"},"max"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 15;\n\nloop {\n i += 1;\n\n if i % 2 == 1 {\n continue;\n }\n\n println!("nilai i: {i}");\n\n if i > max {\n break;\n }\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"keyword continue",src:n(5541).Z,width:"456",height:"230"})),(0,l.kt)("h2",{id:"a115-label-perulangan"},"A.11.5. Label perulangan"),(0,l.kt)("p",null,"Statement perulangan menggunakan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," bisa ditandai dengan label. Manfaat dari penggunaan label adalah bisa mengeksekusi ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," atau ",(0,l.kt)("inlineCode",{parentName:"p"},"continue")," ke perulangan di luar blok kode perulangan di mana statement itu berada. Umumnya label perulangan dipergunakan pada nested loop untuk keperluan menghentikan/melanjutkan paksa perulangan terluar."),(0,l.kt)("p",null,"Berikut adalah notasi penulisan loop dengan dan tanpa label. Nama label diawali dengan tanda petik ",(0,l.kt)("inlineCode",{parentName:"p"},"'"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"// loop biasa\nloop {\n // statements\n break;\n}\n\n// loop dengan label\n'namaLabel: loop {\n // statements\n break 'namaLabel;\n}\n")),(0,l.kt)("p",null,"Mari kita pelajari dan praktikkan kode berikut ini. Di bawah ini adalah sebuah program sederhana menampilkan angka yang hasilnya bisa dilihat pada gambar di bawahnya. Perulangan di level 2 akan dihentikan secara paksa ketika ",(0,l.kt)("inlineCode",{parentName:"p"},"j > i"),". Sedangkan perulangan level pertama atau terluar (dengan label ",(0,l.kt)("inlineCode",{parentName:"p"},"'mainLoop"),") akan dihentikan paksa dari perulangan level 2 jika kondisi ",(0,l.kt)("inlineCode",{parentName:"p"},"i > max"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"let mut i = 0;\nlet max = 9;\n\n'mainLoop: loop {\n i += 1;\n let mut j = 0;\n\n loop {\n if i > max {\n break 'mainLoop;\n }\n\n j += 1;\n if j > i {\n break;\n }\n\n print!(\"{i} \");\n }\n\n println!();\n}\n")),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"looping label",src:n(5302).Z,width:"514",height:"227"})),(0,l.kt)("h2",{id:"a116-returning-from-loop"},"A.11.6. Returning from ",(0,l.kt)("inlineCode",{parentName:"h2"},"loop")),(0,l.kt)("p",null,(0,l.kt)("em",{parentName:"p"},"Returning from ",(0,l.kt)("inlineCode",{parentName:"em"},"loop"))," merupakan teknik pemanfaatan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"break")," untuk menampung sebuah return value dari blok kode perulangan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),". Agar lebih jelas, silakan coba kode berikut:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'let mut counter = 0;\n\nlet result = loop {\n counter += 1;\n\n if counter == 10 {\n break counter * 2;\n }\n};\n\nprintln!("result: {result}");\n')),(0,l.kt)("p",null,"Pada kode di atas, variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"result")," dideklarasikan dengan predefined value adalah blok kode ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),". Di sini artinya variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"result")," isinya bukan blok kode perulangan ",(0,l.kt)("inlineCode",{parentName:"p"},"loop"),", melainkan isinya adalah apapun yang dituliskan setelah keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"break"),". Unik ya?"),(0,l.kt)("p",null,"Variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"counter")," yang nilai awalnya ",(0,l.kt)("inlineCode",{parentName:"p"},"0"),", di-increment dalam perulangan. Ketika nilai ",(0,l.kt)("inlineCode",{parentName:"p"},"counter")," adalah ",(0,l.kt)("inlineCode",{parentName:"p"},"10"),", nilai ",(0,l.kt)("inlineCode",{parentName:"p"},"counter * 2")," dijadikan sebagai return value. Dengan ini maka variabel ",(0,l.kt)("inlineCode",{parentName:"p"},"result")," nilainya adalah ",(0,l.kt)("inlineCode",{parentName:"p"},"20"),"."),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"looping label",src:n(5249).Z,width:"553",height:"117"})),(0,l.kt)("hr",null),(0,l.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,l.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,l.kt)("pre",null,(0,l.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/perulangan_loop_break_continue_label"},"github.com/novalagung/dasarpemrogramanrust-example/../perulangan_loop_break_continue_label")),(0,l.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-05-control-flow.html"},"https://doc.rust-lang.org/book/ch03-05-control-flow.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.loop.html"},"https://doc.rust-lang.org/std/keyword.loop.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.break.html"},"https://doc.rust-lang.org/std/keyword.break.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.continue.html"},"https://doc.rust-lang.org/std/keyword.continue.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/loop.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/loop.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/loop/nested.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/loop/nested.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/loop/return.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/loop/return.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/loop-expr.html"},"https://doc.rust-lang.org/reference/expressions/loop-expr.html"))))}m.isMDXComponent=!0},3723:(e,a,n)=>{n.d(a,{Z:()=>A});const A=n.p+"assets/images/perulangan-loop-break-continue-label-1-f02ae31c07ab672a301cbf6db2f23179.png"},4722:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcMAAADDCAIAAABxk+09AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTQ6NDQ6NDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAzOjA5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAzOjA5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY3MGI1M2RkLWY0MGUt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"},4237:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcYAAACvCAIAAADojOlYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTY6MjM6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAyOjI3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAyOjI3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFiZjg3ZTE5LTEzNjAt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"},5541:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcgAAADmCAIAAADeEoJPAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTc6MDQ6MDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAxOjUwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAxOjUwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ1N2QyMmIxLWVkY2Et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"},5302:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgIAAADjCAIAAAB4oOuVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFEmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTg6MDg6NDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJmM2NkMzdmLTlhNDYtYmQ0Ni04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"},5249:(e,a,n)=>{n.d(a,{Z:()=>A});const A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAikAAAB1CAIAAAAEIubsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMjM6MDU6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjAwOjA3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjAwOjA3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmM3ZjYwYWZlLWJhMGIt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"}}]); \ No newline at end of file diff --git a/assets/js/05cc1716.272262df.js b/assets/js/05cc1716.272262df.js deleted file mode 100644 index 9166a28a..00000000 --- a/assets/js/05cc1716.272262df.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6477],{3905:(e,a,n)=>{n.d(a,{Zo:()=>p,kt:()=>u});var i=n(7294);function t(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);a&&(i=i.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var a=1;a=0||(t[n]=e[n]);return t}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}var k=i.createContext({}),A=function(e){var a=i.useContext(k),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},p=function(e){var a=A(e.components);return i.createElement(k.Provider,{value:a},e.children)},s={inlineCode:"code",wrapper:function(e){var a=e.children;return i.createElement(i.Fragment,{},a)}},o=i.forwardRef((function(e,a){var n=e.components,t=e.mdxType,l=e.originalType,k=e.parentName,p=d(e,["components","mdxType","originalType","parentName"]),o=A(n),u=t,m=o["".concat(k,".").concat(u)]||o[u]||s[u]||l;return n?i.createElement(m,r(r({ref:a},p),{},{components:n})):i.createElement(m,r({ref:a},p))}));function u(e,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var l=n.length,r=new Array(l);r[0]=o;var d={};for(var k in a)hasOwnProperty.call(a,k)&&(d[k]=a[k]);d.originalType=e,d.mdxType="string"==typeof e?e:t,r[1]=d;for(var A=2;A{n.r(a),n.d(a,{assets:()=>k,contentTitle:()=>r,default:()=>s,frontMatter:()=>l,metadata:()=>d,toc:()=>A});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:9,title:"A.9. Seleksi Kondisi \u279c if, else if, else",sidebar_label:"A.9. Seleksi Kondisi \u279c if, else if, else"},r=void 0,d={unversionedId:"basic/seleksi-kondisi-if",id:"basic/seleksi-kondisi-if",title:"A.9. Seleksi Kondisi \u279c if, else if, else",description:"Pada chapter ini kita akan bahas tentang penerapan if untuk kontrol alur program.",source:"@site/docs/basic/seleksi-kondisi-if.md",sourceDirName:"basic",slug:"/basic/seleksi-kondisi-if",permalink:"/basic/seleksi-kondisi-if",draft:!1,tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,title:"A.9. Seleksi Kondisi \u279c if, else if, else",sidebar_label:"A.9. Seleksi Kondisi \u279c if, else if, else"},sidebar:"tutorialSidebar",previous:{title:"A.8. Operator",permalink:"/basic/operator"},next:{title:"A.10. Perulangan \u279c while",permalink:"/basic/perulangan-while"}},k={},A=[{value:"A.9.1. Keyword if",id:"a91-keyword-if",level:2},{value:"A.9.2. Keyword if, else if, dan else",id:"a92-keyword-if-else-if-dan-else",level:2},{value:"A.9.3. Nested if",id:"a93-nested-if",level:2},{value:"A.9.4. Returning From if",id:"a94-returning-from-if",level:2},{value:"A.9.5. Kombinasi Keyword let dan if, Dengan Tipe Data Eksplisit",id:"a95-kombinasi-keyword-let-dan-if-dengan-tipe-data-eksplisit",level:2},{value:"A.9.6. Keyword if let",id:"a96-keyword-if-let",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:A};function s(e){let{components:a,...l}=e;return(0,t.kt)("wrapper",(0,i.Z)({},p,l,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Pada chapter ini kita akan bahas tentang penerapan ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," untuk kontrol alur program."),(0,t.kt)("p",null,"Seleksi kondisi sendiri merupakan teknik untuk grouping blok kode yang eksekusinya tergantung hasil ekspresi seleksi kondisi. Analoginya mirip seperti fungsi rambu lalu lintas di jalan raya. Kapan kendaraan diperbolehkan melaju dan kapan harus berhenti diatur oleh rambu tersebut. Seleksi kondisi pada program juga kurang lebih sama, kapan sebuah blok kode akan dieksekusi dikontrol."),(0,t.kt)("h2",{id:"a91-keyword-if"},"A.9.1. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"if")),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"if")," adalah salah satu keyword untuk seleksi kondisi di Rust, penggunaannya sangat mudah, yaitu dengan cukup tulis keyword tersebut diikuti dengan data boolean (atau ekspresi logika yang hasilnya boolean), lalu diikuti blok kode. Notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," seperti berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"if operasiLogika {\n // blok kode\n}\n")),(0,t.kt)("p",null,"Pada notasi di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"operasiLogika")," bisa diisi dengan variabel yang bertipe ",(0,t.kt)("inlineCode",{parentName:"p"},"bool"),", atau statement ekspresi perbandingan seperti ",(0,t.kt)("inlineCode",{parentName:"p"},"a == b"),". Lebih jelasnya sekarang silakan perhatikan dan coba kode berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_a = 3;\nif number_a < 5 {\n println!("number_a adalah dibawah 5");\n}\n\nlet result_a = number_a >= 5;\nif result_a {\n println!("result_a adalah di atas atau sama dengan 5");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(5632).Z,width:"446",height:"110"})),(0,t.kt)("p",null,"Pada kode di atas ada dua buah blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Yang pertama mengecek hasil ekspresi logika ",(0,t.kt)("inlineCode",{parentName:"p"},"apakah variabel number_a dibawah 5?"),". Jika hasilnya benar atau ",(0,t.kt)("inlineCode",{parentName:"p"},"true")," maka blok kode setelahnya yang diapit tanda kurung kurawal akan dieksekusi, hasilnya menampilkan tulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"angka adalah dibawah 5"),"."),(0,t.kt)("p",null,"Blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," kedua adalah mengecek nilai ",(0,t.kt)("inlineCode",{parentName:"p"},"bool")," variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_a"),". Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_a")," sendiri isinya berasal dari ekspresi logika ",(0,t.kt)("inlineCode",{parentName:"p"},"apakah variabel number_a lebih besar atau sama dengan 5?"),". Jika hasilnya ",(0,t.kt)("inlineCode",{parentName:"p"},"true")," maka blok kode setelahnya (yang diapit tanda kurung kurawal) dieksekusi. Namun, pada contoh di atas, hasilnya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"false"),", karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"number_a")," nilainya adalah tidak lebih besar atau sama dengan 5, dengan demikian blok kode tidak dieksekusi."),(0,t.kt)("h2",{id:"a92-keyword-if-else-if-dan-else"},"A.9.2. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"if"),", ",(0,t.kt)("inlineCode",{parentName:"h2"},"else if"),", dan ",(0,t.kt)("inlineCode",{parentName:"h2"},"else")),(0,t.kt)("p",null,"Jika seleksi kondisi lebih dari satu, gunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"else if")," dan/atau ",(0,t.kt)("inlineCode",{parentName:"p"},"else"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_b = 3;\nif number_b == 2 {\n println!("number_b adalah 2");\n} else if number_b < 2 {\n println!("number_b adalah dibawah 2");\n} else {\n println!("number_b adalah di atas 2");\n}\n')),(0,t.kt)("p",null,"Pada contoh di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"number_b")," yang nilainya ",(0,t.kt)("inlineCode",{parentName:"p"},"3"),", match dengan statement seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"else"),", dengan ini maka statement dalam blok kode tersebut dieksekusi, text ",(0,t.kt)("inlineCode",{parentName:"p"},"number_b adalah di atas 2")," muncul."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(3732).Z,width:"447",height:"96"})),(0,t.kt)("p",null,"Silakan bermain dengan nilai variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"number_b")," untuk coba-coba."),(0,t.kt)("h2",{id:"a93-nested-if"},"A.9.3. Nested ",(0,t.kt)("inlineCode",{parentName:"h2"},"if")),(0,t.kt)("p",null,"Sebuah blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," bisa saja berada di dalam sebuah ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),", dan seperti ini umum terjadi di bahasa pemrograman. Di Rust penerapan nested ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," sama seperti pada bahasa lainnya, yaitu dengan langsung tuliskan saja blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," ke dalam blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_c = 10;\nif number_c > 6 {\n println!("selamat, anda lulus");\n\n if number_c == 10 {\n println!("dengan nilai sempurna");\n } else if number_c > 7 {\n println!("dengan nilai baik");\n } else {\n println!("dengan nilai cukup");\n }\n} else {\n println!("anda tidak lulus");\n\n if number_c < 4 {\n println!("belajar lagi ya");\n } else {\n println!("jangan malas belajar!");\n }\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"nested if",src:n(1669).Z,width:"448",height:"128"})),(0,t.kt)("h2",{id:"a94-returning-from-if"},"A.9.4. Returning From ",(0,t.kt)("inlineCode",{parentName:"h2"},"if")),(0,t.kt)("p",null,(0,t.kt)("em",{parentName:"p"},"Returning from ",(0,t.kt)("inlineCode",{parentName:"em"},"if"))," adalah salah satu cara unik penerapan ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Yang biasanya ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," digunakan untuk eksekusi statements dengan kondisi tertentu, pada case ini statement yang ada pada blok kode if ditampung sebagai ",(0,t.kt)("em",{parentName:"p"},"return value")," atau nilai balik. Teknik ini mirip seperti operasi ",(0,t.kt)("em",{parentName:"p"},"ternary")," hanya saja jumlah kondisinya bisa sebanyak yang kita inginkan."),(0,t.kt)("p",null,"Agar lebih jelas, silakan pelajari dulu kode berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_d = 3;\nlet result_d: bool;\n\nif number_d == 2 {\n result_d = true\n} else {\n result_d = false\n}\n\nprintln!("result_d adalah {result_d}");\n')),(0,t.kt)("p",null,"Blok seleksi kondisi pada contoh di atas menjadi penentu nilai variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d"),". Dengan kebutuhan tersebut, kita bisa juga memanfaatkan ",(0,t.kt)("inlineCode",{parentName:"p"},"let if")," untuk mendapatkan hasil yang ekuivalen."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pada kode di atas, deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d")," dan pengisian nilainya adalah ditulis dalam statement terpisah. Cara ini diperbolehkan pada variable immutable (tanpa perlu membuatnya mutable) selama operasi assignment hanya dilakukan sekali saja setelah deklarasi."),(0,t.kt)("p",{parentName:"blockquote"},"Lebih detailnya dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/variabel#a45-deklarasi-variabel-tanpa-predefined-value"},"Variabel section A.4.5"),".")),(0,t.kt)("p",null,"Kode di atas jika diubah ke bentuk ",(0,t.kt)("inlineCode",{parentName:"p"},"let if")," hasilnya menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_d = 3;\nlet result_d = if number_d == 2 {\n true\n} else {\n false\n};\nprintln!("result_d adalah {result_d}");\n')),(0,t.kt)("p",null,"Penulisannya cukup unik. Blok kode seleksi kondisi dituliskan sebagai value dari statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let result_d"),". Dan isi blok kode nantinya akan menjadi value untuk variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d"),", tergantung kondisi mana yang match."),(0,t.kt)("p",null,"Pada contoh di atas, karena ",(0,t.kt)("inlineCode",{parentName:"p"},"number_d")," nilainya 3, maka ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d")," bernilai false. Blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"else")," adalah yang dieksekusi."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(5146).Z,width:"447",height:"112"})),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Dalam penggunakan kombinasi keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"let")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),", pastikan di akhir blok kode seleksi kondisi dituliskan tanda ",(0,t.kt)("inlineCode",{parentName:"p"},";"),".")),(0,t.kt)("p",null,"O iya, beberapa orang lebih memilih memanfaatkan indentasi untuk mempermudah memahami statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let if"),". Contohnya seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_d = 3;\nlet result_d = \n if number_d == 2 {\n true\n } else {\n false\n };\nprintln!("result_d adalah {result_d}");\n')),(0,t.kt)("h2",{id:"a95-kombinasi-keyword-let-dan-if-dengan-tipe-data-eksplisit"},"A.9.5. Kombinasi Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"let")," dan ",(0,t.kt)("inlineCode",{parentName:"h2"},"if"),", Dengan Tipe Data Eksplisit"),(0,t.kt)("p",null,"Ada situasi dimana dalam pemanfaatan ",(0,t.kt)("inlineCode",{parentName:"p"},"let if")," kita perlu men-specify secara eksplisit tipe data variabel penampung. Caranya sama seperti statement deklarasi variabel beserta tipe data, langsung tulis saja tipe data yang diinginkan setelah nama variabel dan sebelum operator ",(0,t.kt)("inlineCode",{parentName:"p"},"="),"."),(0,t.kt)("p",null,"Pada contoh berikut, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_e")," saya definisikan tipenya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"string literal &str"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_e = 3;\nlet result_e: &str = if number_e == 2 {\n "angka adalah 2"\n} else if number_e < 2 {\n "angka adalah dibawah 2"\n} else {\n "angka adalah di atas 2"\n};\nprintln!("angka adalah {result_e}");\n')),(0,t.kt)("p",null,"Contoh lain:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let max = 100.0;\nlet string_f = "nilai minimum kelulusan";\nlet result_f: f64 = if string_f == "nilai maksimum kelulusan" {\n max\n} else {\n max * 3.0 / 4.0\n};\nprintln!("angka adalah {result_f}");\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(3853).Z,width:"450",height:"94"})),(0,t.kt)("h2",{id:"a96-keyword-if-let"},"A.9.6. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"if let")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"if let")," berbeda dengan kombinasi ",(0,t.kt)("inlineCode",{parentName:"p"},"let")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Kita akan bahas topik ini secara terpisah pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"),"."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/seleksi_kondisi_if"},"github.com/novalagung/dasarpemrogramanrust-example/../seleksi_kondisi_if")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-05-control-flow.html"},"https://doc.rust-lang.org/book/ch03-05-control-flow.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.if.html"},"https://doc.rust-lang.org/std/keyword.if.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.else.html"},"https://doc.rust-lang.org/std/keyword.else.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/if_else.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/if_else.html"))))}s.isMDXComponent=!0},5632:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAABuCAIAAADXpuElAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMzFUMjI6Mzk6NTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjEyOjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjEyOjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJkNTQ3NmE2LTc1NDUt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"},3732:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABgCAIAAAACbutrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjRUMTE6MzA6MTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjExOjMwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjExOjMwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNDk2ODIyLTcxMzkt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"},1669:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAACACAIAAAATaC78AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMjM6Mzc6NTIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjEwOjM2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjEwOjM2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE3MWM0Zjk1LTM4MDMt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"},5146:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABwCAIAAAABuOnwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjRUMTE6NDA6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjA5OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjA5OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5OTIwOTUwLWViMDQtMjU0Ni1hYjc2LTg5M2I4ZTJkZWY2ZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2OTkyMDk1MC1lYjA0LTI1NDYtYWI3Ni04OTNiOGUyZGVmNmUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2OTkyMDk1MC1lYjA0LTI1NDYtYWI3Ni04OTNiOGUyZGVmNmUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY5OTIwOTUwLWViMDQtMjU0Ni1hYjc2LTg5M2I4ZTJkZWY2ZSIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNFQxMTo0MDoxNCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkOEFocAABuXSURBVHic7Z1PbNvGl8efpJWj1D/oJ4OuLBgBY64B/eIixZaBi0Drg4pctDnkIhQgYKCH3Hr3Oaecff/deggQQEChSw6BL0F1MIxggx8LdHddCJuVTRSB6lqI1lu1TgRbeyAp/ntDDilRopP3QYHG1HDezJvh4wxn+GVKFEUgCIIgQpKedwEIgiCuJBQ9CYIgokDRkyAIIgoUPQmCIKJA0ZMgCCIKFD0JgiCiQNGTIAgiChQ9CYIgokDRkyAIIgoUPQmCIKLAHT3lmlKvigAAYrWu1OSpl0SuxZHrBFg1jkIIL0UzNFnxYsFZJLmmKIFF5K7FhL1OrNYRQ4HWE+hkAhLTcP/ElUqs1suL3YM9LcaSqIfdeqVe7TVbvlbkmlIujP/qtxt7qve4ddj37GH3wMeaetiVNiURNEcKuaZI536nhQc3BABitV4pZf1LOQVw18VQUQS07s5W0ptpdtaJpOHtiglpOJ7oKVY3S9A9iPk6Aq3VFGrKZlXUgiyZV7hYrVeUGjT2enp0b3AV0X52pV4FZoDQOr3NyoYMGhqIpwjDkCgJ0G13BSnObiKGcV0o1L0Gh+MYdffcMuIZR8ysiYnpkoyG44ie8gYWO8fjg/FgRR8pAYC979sOoimdo0T1sCuF8InW6mwo5SKIeSE77HVCXv96tC6Pzck1pVxwlEdrdTYUqSqqgaEFrTsEeMk6iBoSJSE76KgdsN9l7afDsMuwLteU4nl3sVTKDrvtnlBmD2BFyes6W3YVRamYJe1V65Vcx1YN4w+kSNYhhz9tY0qrPPxORv2J5okedGWi54B7nsvJ7pR+F4I+enoFm/oP/XZjTxWr9U141clV2D1EP8ZoTQHJk8Mh5g9nG+jp/H3JW028Roy6B/Yls88hXVFlXTIzbrjg6CkXC8PegatnF8pS96DR0ECuKeWarO6pYnUDXjUamlEIfQgpVjdLA/csWq5VzINi1TVZ1zq9zUpRBgh1S9E6vc1SyXccidM7H4KQFwFYZ6kn/XLw0A+rOwDuJcQhuCFRErL9jgqaPKiYv9hcB3JNkVjWzwAKpVy70S4q5bL+f0YtMNdpraaGTJfw0R9aJD0HsVqv5GxOsga5YrVeqdRkTfcDn5Mxf/awPPGDVnkV51jbY53XyYzujaYEgGypUum3Gw1VrNYrUhXUDkC2VHH3EOTqYLTmGZYn6mS5Zg4LxGq9Uhq0my0N5A336aLaAu6+BBLa58c1GmfJqjsC4k+8Kyal4QJXjcT8IgzO3P263zbqop70oVCUAbTWnlk7rdMbZnOCkbRQdD7rl4uFftsot9bq9LOCZLsutbMBLOY5p2lyrVwYdg8BtFazcdCFUkXhWKiwoZ0NrD/UvUbDE9fUwy6UNgJWK1h193oJwOsQ3JAoCdn+iaqfrPtIrEqW64KsD7uHqv3/7LJHc51RSrxICPJGKdvvGAXVWq+6Q8sPiJOzeoEURVGsxSKXP9E88YMGkh46ndeh03ooJwPSmsyUw+7Bnjo+itRoMY9eHfq5eGu68sTrLhcLoHcl0Dq9oe36cp4uhOlLQX0+uO44+NWBMv+GCxx7Crms7++98yHk9NLbRs0Afb1ATaGmlBWlbI3u84tQ0I+MC+fKr5wT2KNBALDOt0/L9PGOfsdVagJj2ciJmF8EOPdNwjUaxuruwPQS4hDckDnyBLBusvgNm8N6EFFcF4HheY/xi9fJAUtl416H5skwlC2VCjDsep7wRG5ivDUZzWE9HzHd7SlfDkTwvzpcuPOUa1jde+dDKOn1cz6o8RQpTF8K0+uC627+yLo68PTzbrjA6DnupwyEXHZ4roJcq5TAnBDZp2zm2oFcUyr1KjQ74LMkbubHusoM/M7XWq+kesV3Oj5GlIQsMrB2Zxj0XI5ZdwtbrdwOsU2YLUOiJGQha7+MhhIjenJY5ySM66KQtd0VXTflUA8/wfAnQA7Pk2Fo2D14BZu2Rwb81rm7d0uI3hxD/T7u6d1yjTsLpO4yaGeDSsmMyUO/5V/evtTS5JoypV7nhHl1oMy74QJn7v5TabEqFYY947I24pBY3Sx5x6u986GeX6c3LJSZO/fwBwVh4AqJALpjs7axvlyzzxJtjKfOPvjW3fCSs0imQ1BDQi477B40TA66w6wA2tnAnG+I1bp9FcDXOj8O1/XOh95aGz1Brhk3aXaRkLpBQTKeDIhVqeCahPI4eVxOo9dheeIHTbRWs90vlD1PKCzrEZ3saM3wzSHXyoVhrxN0dQSBOlmf0ppdKXBAx1/4CXuduy85cPgT7Yo682244FUj9aRfLrvXwT1zZ+2wK1WMg/1ud1jKgXso3G/rcb3VhGq9Mh5WOYbo9gkrP64VRb+hqavsfBt1XFsBsiVz/c8oPVZ3t6Wm+SDf6xCvIcG1Uqd1epulerXXbPeN+Ua/fdCVNsfnYNa5YLtOH4kaNe23G3uqdWDYbXeH5RwAqHvtoqdI9mqWFaWsn77XgJpiWzll1F13ssfHqD81LE/0oHXpqXsH+XqlotQl+9TQso7WCHUy2prohcDE+wwKuTrO/HJwgjpZ62wojmkMc1LM25eq4mS9zt65rL7EvDq8XdFV5Hk1XIrjq3BitV4RerFvnIZZ7dCOwsxKllwXxM986z5r645dO7OzM7ureVbMr+F4dsvroZ9nG/ukhYr9habI8G39vkqGEsh86/6het75iJn7wdbVYX4Nx/emJv9rQNGRN0oDz3SOIIjJsM1oASDwwRbBD8/MnSAIgnATuOZOEARBIFD0JAiCiAJFT4IgiCjwrRoljuXU9nr6/a8X3x/pf6e+vpte0P95dvH00CclwQNDJImNtW902D1odqSQp/Mi15Rywbtf0Wn96q08RtpzM9lGnRD7paIZSuDWO2eRGH3J7xQ38UfPr77IrF7T/3n588vRP6aX88L18T9H37+8cMRQZsp5Y9+eHu/q5yTdFxNJ8jXl1vYLdfqEeKyHgCmWiBviuN5C5uncqUfq3QjJVe+OOXp+9UVm9do4aKa+WgM4mka+p6OnpxdTTjkDxGq9DO3G+A1bXZRs3qWaGDG/COHfEIsCtrVvAus2TTO5ppT9vmwg15QydLtDEPDfo+QJAIj0OKl3O4wkWb07zuh5cy29eg3evh6PN0c/HAGAMZs2jp1dPD1M3b+bhrPLpXwa3l2+eZdezQOcXTz9LbW9nnrz62h1JQ0A8O5y/8fRsc8k3Q2WchnN01kkAL9hMqcoLHrQIYESpL+CCt16DyGGWJqymNQrbiYcQTpcrPoIHglRn+kk82ECj3W5ppTBOk2uKWVoHJxLhWH3wBCyOuxKFYEVB+SadH7QaEG1XvI3pL9czpWnnjEqPQ4ApN49NpJc9e44o6dwPQUw+vMP51H7g8jl1PZ65uu1ywHA0jXY/+nyy8/Ty/2L/T/TWysAvwFAanVl9PPLi39A6uu76S/XLo6PAibpNlgpzTyXU9vr6c+WL45PU1+bRbq5lt5agTc/sZ4wMISQvTK3PVT79qRfLusaP2J1s5Ttt9l3P4+ML0NguIdJ0jI1ZTn1dAM8ayuQ84V2n7kqUvgDDjXCMd6HCSGsqyf9ctmS/8svQr8DQtG6MA2tClZp1L0mAEtYzY6Q484TgCE9bkHq3clW745zzT1/DTl459M0wOX/HAEAwOnozTtYKAAAvO+Pjv8AgNHpiSP9eOg6AFgopG5Oo2C24TAs/gVgGRZMu8e/j3xP5RJCXsyjB0VdgbkNZUVRKkLvwOeZmD6GeeUIfWzdX1ySFoVDT5df4UdrNRuNRqPdBzBVfFhVwgyNxanNLyDyyBNGsg7qoVUzURLAEngSq3VFUcrQbrT7/MLc/vDmGaQoRurdyVbvjnPsefYOVj0BFA2pHIz+fAdLk5aIwSm8X09d/wTgDyO4n/3BTMsjCouqZ2dzAoBgDCgbmlxT3Do/doQc+jZyiNiCw6enGw9eQ73zoZQXQS5Cf2Bc0nG9gm0p6YqSAL1XGoBgG4oDgFitw+Bkcush8gx66EDq3brppKp3xzn27P05Akhd/8QnSeo6bzBNXb8G8G50PI2CoSytZ7bvZm7lHSNTN6bYqqm6iacaYh1+eK7aB5TqXqPdzzKHDYj6J4ARgg14nzYGEUeenIa0s0E2J8jFxfPDEyjKYn4xvlCudXrDQlEGURJAv4X0zofjoTiEHfgyCJcno5VNeNW7+2NNTxSOTutU7240Go1Ge1CqOMZ6dkOiJGShUDY+nVIugPEFkWjWOdFar7rDaU0PEHwuBIaT44yex0ejtwBL66k7xoHU/TX44ZdLgPQ/rwEAwDIsAbz9JTirm2upJYC3v8VSzptrqQW4/PnlxdOXF09fXjw/9U/uK6FqytwyD1pNJBcL7NsdJpPrq/vrxUdT1j/PWO7s7MLn89DraL3zxeJGLhuj+o/W6Q0X87IkDIwJmtbpDbOlTSMeOBSs9ak3z0TRldInT6xIftLjpN7tKWfS1Lvj3bE0ev7y8v7d9K27cAv0BW4AGO3/ZbS1ktleAQB4+/ri+Wnq/jozi6X1zPb6OKVzcTyf2b4L73+9+P5390Fzyd6bEjFxfDT6bMUsJNhseWGKwnqFkLGDmjUvgoAFbs0pkzvsHjRbqPYt86rx05S11QjNE5U3ZhnyEEId+XxYLgndgxZo0NuslNj3gwmLBGCsnpZL/XZrfKAJVdNFvq1ht16qKEqFmZo/TwBcepzUu20kW707yRpLy6nt9TQzkE2POxuZW3lri9JXX2RWwdzJxAO6z2ZW2rfE1WZKYsWk3j0DPHW/om9qThXnQpb+gHVeZSE+MqYkPU7q3TPAU3eKngA//Gh7vAC2LfQzwDUzMUmcgu3MynlVHDI9ZiE9TsRCkmfuBEEQySXONXeCIIgPF4qeBEEQUaDoSRAEEYXMX//613mXYcxyavvzzN+yo//qTyPlcmr788yNd6P/Zr92OVEZQK4p/3rj/w6P/zdM/sysqpu3b9++fftvy9PJMYJ9LtP8KQNymZbr+PIUq/V/u5X7z9fdCS1w152rRa1ENxYmLNtMCG42uab8S563KtPpS3NkDmvuLtGj0ZufLn+wBTh+JeMEaR5Pgdmoon/M2/VmCKdgs74FhktFev4bOu0qzkzUw269EqRpOiU4xarRlNMRKZ/XjiVUmvOKah5/APDv4qP9fhzMTi56ZnhVnHHC7L+aoC9xi1VjKacmUp6U/Z78SsYMdWT7G5z2DZt/SX29nl5wHLRysL535FZHZhOk/6rfyTA53jC3OMerSuYfPUxxGSaUTEaUYhnitYBoyrr0cxzC6J6vU6Cu8/MAx0s4fM1h4BIDRp2sevacsr7UhApgAwAqthJdgpohBuzU/bWpZwcIYFup3V5iG0JVnFEdZQDPi6MBleLxpxtusWo8JUuknFkjFkmJnvxKxmhKS97YxdIKuIWQ76YX9LC7nNpez9z//eI5uASbfcIoKrZqOyhWjYkLIsc7jbGIVwgZgiSTjbtrYw+XTMY/YYSJ17aQlIZ4mO4FpXhihl+vQzTUdRPC3RwAiBgwrtBizbrFar1SGrQNiQLES57m6JlhCxyCzb1JJKgZYsCo5rEGHgFsUW0JWI0wLzFFtb0qzkwdZeBSzWN8OMvbvdG7DLdYNZ4SFyn3qxGDea255zPbd/X/xgpMOG4lYzYLK0hWrtNvrqUWYPRGH5eewluApU+dgs2+4GKrctE6qLU6uhYLW453MtxCyMGSyZY2cwh4xWvHyLUymE5AHBJCp5Yf7ubQf3CJAbMqUiyALvsLWqcXpIjmag5csHkyCWoWLM1jlwC2htcI7bQsGCrOzFr4akf5EkLnewKYIuUh2yVRzz2jM/r3X0dbK3YxJ/xVS+F6CgBWP89s2w5GFWw2EPOLlloNABgTSESONyZ4VCmz3F/AiIRcK0PbfIjFcAgnjql4iVOryH4+h3W/T0r1zodQ0gdO2Ed1IhKHbilDddgtgA0iUiNRCtNGyJMIHx1lAOiF+ebK7DG/euMQKfevEUpSZu6Tcnx0eXwEYHzFM/3Z8gUaPXt/jiAPrlX+r76Y2Dz2lMQMn2I+3uDpiIwseeNYBeQdsVPH4xCxypmZ+SxgEvEhb3M4x0FCLosqWAMAaGeDSskMLEOOdRIueNooHKbqcMucujOX7bEaiRBmrRm/25iLPnJNcX/7cypK03FhfLnPFCkH69N7PjVC+eB2y3f6fh8mOj4avYfUqvPrSJ3+CCC9sgwAqfu+a0eo2ComZDz+wSHHGxK31CtKsGSyoc3soyk7EfoCpv0yRB3Cr1PLT7jmsJVYshSs3U7WnwaYsr/T2XgzDQlqtOG4VIfRGrG9hBnyn4l7dZSDvtcUH7yy1v4i5QGa/2MSMvbENY/5UzqWet7/qusoo5ZG37++3F7PbN81/n77+uL50aVUyKyuZ7bX4e3ry7fr6UVWOVGxVZeQsTXs98jx8qNhUq+MIjEkkz3at658PUvxY6XYE8SMY4nW0pTt6ReuNQfUdWoRh6CumxD+5gDUIYiT9TazTWld2w3sdQ9RTn/lXQ68YsC8qsN4jXw6LSKq7VFx9tVRtn/0CAfvS9zO4BerxlNiIuVBytAYpLGUCKa9F5q0maPi8tyUxIvDmIw5+4g1CnHax/NGxgc3cyeISXA+lOT6LlvCmU6NtNarLpgfbPJBfyPp1UcQOiExM3fC/BrNbF7YJFjYHgYAQMyyzNYm9n5cJqZXI663iOSN0iDKg4mrCc3cCYIgokAzd4IgiChQ9CQIgogCRU+CIIgofPCrRss2BZApoD/nT9QXHgM3iPgmmHS7zMezPcULJhTki7VKxNJtmgoM4Uun9ThaLIFXR6wkI3reXEtvraTGf04v2BlMT0dZ3dO1a5QaOLrIHMVr1cOutCmJoM0lgMVjfTritZyWIjccQyiIbcolmYzrNsUEp2DzRLCujg+VZERPnbevL56fwp2NzK2VzP3fL56fTiPTGHSUbapsiUDr9DaD9BSvkvWpidcmi9lJJmOqwzOznrSrI06SFD11/vHb5a18GsCYdOsh1ZqA/45JJvPrKOMpvbKelz+/tKTtfEmAeK3W6mwobjXEGckGt7Qg62zBZhU/yBKvZYDoDk8kFx3cRtEmvrziIG5Dgnt07Pewhfkwgde6p4eI1XqlBGaN5Zri0ApF+tJHRPKi551P0wCjP/8A+ISVxCOZjB7EdZTRlJa48s219NYKvPmJM3RCMsRrQT3plyX7/Hl2ssGYdazu4BVsVjEVZ3UPF6/FMbXGHI4PkIseO57pT1cbgdqZRN7Y81K3T7hBCn8QRu3N+zAhjHW0h+hvhW9WRc3WU3EBbE6HfDAkac19aT2zfTdz69rl/kuHgpwXVDKZX0fZnXIZFmB0egIAcPy7n0RTGGYoXgsA6mEXShumZM6sZYOd1tl1dwk2owdFH/FaN7pekfO1wGC5aA7lXWcbTShvjEsmo2CGtLOB8WNNFw8KJ/8Wwjqr16l7B10obVRtvSps//wwSdLY8+1r4yMZX65d6GKdM+IU3q+nrn8C8IehM38W6iPGDGYnXgvA8zWEOGWD3dYZdXeQxQxlcwKAgInXYlkIOfSd7YmlJd1tJNfiFUh12PYY6p0PpbwIchH6AyPox/PqPbuH6MJLpYGp4jqZAPYHQ5KiJwDA6ejNDVhdSd054p87T4el9cz2OoBzZBqdWYrX6tlgjx/dxCYb7LDOV3fU0PBcFat1hnitB0awn74UcTx5chrSzgaVoiDnFs8PO7kNWTxfjDGU471OrlWEXrsrlG0z9I/1YaeNJM3cdWxaxQDGHDxAtHhCbq6lFuDy55cXT19ePH0Zba1/ruK1BuqJOYGah2ywZT247oZgM/ugv3jtGKxKwXLRDrjkoqchb8wFu/D5PPQ6Wu98sbiRy05r6OnSEmb1ELlWLvQ7LdWSWQruSx8FSRt7Ahwfjb5cSS3dSN38cfTzp3BrJbO9EiRajMKtuHx8NPps/E0kADD3ToVhvuK1BtanYGcmG6yh1ll19xhCVZw1TLyW5TxHlQwZZoZcNCMHtj9tdUPzxCR++YMqfjqqo3w+LJeE7kELNOhtVkrs+8GERcJ6yNmGvsqugtkH9I9WMPrnRwVpLAHc2cjcyltblL76IrMKzO/KTZ3pyvHGt2ufp5x+1tF9NqTiTFxhkjf2nD3Ob2qmrl8DeDc769OV48U2Sk8HnnLGZ50gkgdFT4Affry8f9c2c2d/0DgOZirHOwHzLKdrl75J4lw1s3JeFYd84NDMnSAIIgrJW3MnCIK4ClD0JAiCiAJFT4IgiChQ9CQIgogCRU+CIIgoUPQkCIKIAkVPgiCIKFD0JAiCiAJFT4IgiChQ9CQIgojCHN5z33r0ZEdeBADoPKvvfDdJVg93m/f6u9883o/jdO5ybj16slN4EaYqD3ebD/SvYgxUhv0peokgiDiYQ/Tcf/zNvhFyHMcnDIVTh1XOiXm4+0AKDImxWScIYjrQzH3mbN0oQuc/aDRJEFecgLGnPh78O3yrzyLNEZM1rbTNK20HjaOOKa3P/NZ25k6zuePM1jc5wMBPkcuW0poio6ejKfnzBNtsPGhYWS54NPIjWbcMoc1BEES8BI89F+WdncKLer2+qw6ke4+2AB7u7sgnz+r1er2+qxYfPHm0BQBbj741D9brIa/g/cff1Ov1Zx0YqLuBGdis1591WKkAALYe1eHvdaOcIH/7aIt1OpqSP08AkB7c6+/anYSe+6TZbDYfSADSg2az2Ww2dx+GtI44GW0OgiDihmPmPlB3d74DgP0X7cFiYR8e3pY6z4wrd//xi85i+Z4ZQm4/jK+kOluP7lnWA9h/vGOO4vSyl1mnIyn58wQAgM4zfcTod7p+k6g/6wB0ntkCIL91AK+T2c1BEEScBK8aDdovzEvbWMgogvSg2XxgpVD1H8u7Tf14wOxzZjjm6AA+A9U4UvLDnSfi5K0baHMQBBE30dbc8adr3+3UvwMAeLjb3HnyCL55PFnRJuXh7o4M6m798T4ELF7HkTKOcgJ4nfwC6GEnQcyF8Gvu+y/aA+nBrs8cvd0fWH8Ub2wB6CEi4IPC7f4geNa5/8uJOXfdevTE2DTJ5uQXY6HoW906+3R3Sv48p0H4PE0nBzcHQRCxEGHsuf/4G3j0ZGc8WRyou988Bsfks/NMH0k9/vu9Jzs7zeYODNRn6uBBAZzT1AfN5oPxyGnfSu0znPpu59ltY+7aebar3vuWWc7vmuq9HWNO21HVgVxgnY6mxMuJpZwQfutt3MlIcyTgsQlBfOjQV+EIgiCiQLvlCYIgopDY77lbr4I7oAUSgiCSAc3cCYIgokAzd4IgiChQ9CQIgogCRU+CIIgoUPQkCIKIAkVPgiCIKFD0JAiCiAJFT4IgiChQ9CQIgogCRU+CIIgoUPQkCIKIAkVPgiCIKFD0JAiCiML/A7RwS69eEQTBAAAAAElFTkSuQmCC"},3853:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABeCAIAAAA/qYOeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjRUMTI6MDc6MzArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjA4OjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjA4OjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgxMWQ1NTI2LTQ5N2Et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"}}]); \ No newline at end of file diff --git a/assets/js/05cc1716.bb8cde02.js b/assets/js/05cc1716.bb8cde02.js new file mode 100644 index 00000000..4357bd00 --- /dev/null +++ b/assets/js/05cc1716.bb8cde02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6477],{3905:(e,a,n)=>{n.d(a,{Zo:()=>p,kt:()=>u});var i=n(7294);function t(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);a&&(i=i.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var a=1;a=0||(t[n]=e[n]);return t}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}var k=i.createContext({}),A=function(e){var a=i.useContext(k),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},p=function(e){var a=A(e.components);return i.createElement(k.Provider,{value:a},e.children)},s={inlineCode:"code",wrapper:function(e){var a=e.children;return i.createElement(i.Fragment,{},a)}},o=i.forwardRef((function(e,a){var n=e.components,t=e.mdxType,l=e.originalType,k=e.parentName,p=d(e,["components","mdxType","originalType","parentName"]),o=A(n),u=t,m=o["".concat(k,".").concat(u)]||o[u]||s[u]||l;return n?i.createElement(m,r(r({ref:a},p),{},{components:n})):i.createElement(m,r({ref:a},p))}));function u(e,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var l=n.length,r=new Array(l);r[0]=o;var d={};for(var k in a)hasOwnProperty.call(a,k)&&(d[k]=a[k]);d.originalType=e,d.mdxType="string"==typeof e?e:t,r[1]=d;for(var A=2;A{n.r(a),n.d(a,{assets:()=>k,contentTitle:()=>r,default:()=>s,frontMatter:()=>l,metadata:()=>d,toc:()=>A});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:9,title:"A.9. Seleksi Kondisi \u279c if, else if, else",sidebar_label:"A.9. Seleksi Kondisi \u279c if, else if, else"},r=void 0,d={unversionedId:"basic/seleksi-kondisi-if",id:"basic/seleksi-kondisi-if",title:"A.9. Seleksi Kondisi \u279c if, else if, else",description:"Pada chapter ini kita akan bahas tentang penerapan if untuk kontrol alur program.",source:"@site/docs/basic/seleksi-kondisi-if.md",sourceDirName:"basic",slug:"/basic/seleksi-kondisi-if",permalink:"/basic/seleksi-kondisi-if",draft:!1,tags:[],version:"current",sidebarPosition:9,frontMatter:{sidebar_position:9,title:"A.9. Seleksi Kondisi \u279c if, else if, else",sidebar_label:"A.9. Seleksi Kondisi \u279c if, else if, else"},sidebar:"tutorialSidebar",previous:{title:"A.8. Operator",permalink:"/basic/operator"},next:{title:"A.10. Perulangan \u279c while",permalink:"/basic/perulangan-while"}},k={},A=[{value:"A.9.1. Keyword if",id:"a91-keyword-if",level:2},{value:"A.9.2. Keyword if, else if, dan else",id:"a92-keyword-if-else-if-dan-else",level:2},{value:"A.9.3. Nested if",id:"a93-nested-if",level:2},{value:"A.9.4. Returning From if",id:"a94-returning-from-if",level:2},{value:"A.9.5. Kombinasi Keyword let dan if, Dengan Tipe Data Eksplisit",id:"a95-kombinasi-keyword-let-dan-if-dengan-tipe-data-eksplisit",level:2},{value:"A.9.6. Keyword if let",id:"a96-keyword-if-let",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:A};function s(e){let{components:a,...l}=e;return(0,t.kt)("wrapper",(0,i.Z)({},p,l,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Pada chapter ini kita akan bahas tentang penerapan ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," untuk kontrol alur program."),(0,t.kt)("p",null,"Seleksi kondisi sendiri merupakan teknik untuk grouping blok kode yang eksekusinya tergantung hasil ekspresi seleksi kondisi. Analoginya mirip seperti fungsi rambu lalu lintas di jalan raya. Kapan kendaraan diperbolehkan melaju dan kapan harus berhenti diatur oleh rambu tersebut. Seleksi kondisi pada program juga kurang lebih sama, kapan sebuah blok kode akan dieksekusi dikontrol."),(0,t.kt)("h2",{id:"a91-keyword-if"},"A.9.1. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"if")),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"if")," adalah salah satu keyword untuk seleksi kondisi di Rust, penggunaannya sangat mudah, yaitu dengan cukup tulis keyword tersebut diikuti dengan data boolean (atau ekspresi logika yang hasilnya boolean), lalu diikuti blok kode. Notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," seperti berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"if operasiLogika {\n // blok kode\n}\n")),(0,t.kt)("p",null,"Pada notasi di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"operasiLogika")," bisa diisi dengan variabel yang bertipe ",(0,t.kt)("inlineCode",{parentName:"p"},"bool"),", atau statement ekspresi perbandingan seperti ",(0,t.kt)("inlineCode",{parentName:"p"},"a == b"),". Lebih jelasnya sekarang silakan perhatikan dan coba kode berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_a = 3;\nif number_a < 5 {\n println!("number_a adalah di bawah 5");\n}\n\nlet result_a = number_a >= 5;\nif result_a {\n println!("result_a adalah di atas atau sama dengan 5");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(5632).Z,width:"446",height:"110"})),(0,t.kt)("p",null,"Pada kode di atas ada dua buah blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Yang pertama mengecek hasil ekspresi logika ",(0,t.kt)("inlineCode",{parentName:"p"},"apakah variabel number_a di bawah 5?"),". Jika hasilnya benar atau ",(0,t.kt)("inlineCode",{parentName:"p"},"true")," maka blok kode setelahnya yang diapit tanda kurung kurawal akan dieksekusi, hasilnya menampilkan tulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"angka adalah di bawah 5"),"."),(0,t.kt)("p",null,"Blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," kedua adalah mengecek nilai ",(0,t.kt)("inlineCode",{parentName:"p"},"bool")," variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_a"),". Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_a")," sendiri isinya berasal dari ekspresi logika ",(0,t.kt)("inlineCode",{parentName:"p"},"apakah variabel number_a lebih besar atau sama dengan 5?"),". Jika hasilnya ",(0,t.kt)("inlineCode",{parentName:"p"},"true")," maka blok kode setelahnya (yang diapit tanda kurung kurawal) dieksekusi. Namun, pada contoh di atas, hasilnya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"false"),", karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"number_a")," nilainya adalah tidak lebih besar atau sama dengan 5, dengan demikian blok kode tidak dieksekusi."),(0,t.kt)("h2",{id:"a92-keyword-if-else-if-dan-else"},"A.9.2. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"if"),", ",(0,t.kt)("inlineCode",{parentName:"h2"},"else if"),", dan ",(0,t.kt)("inlineCode",{parentName:"h2"},"else")),(0,t.kt)("p",null,"Jika seleksi kondisi lebih dari satu, gunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"else if")," dan/atau ",(0,t.kt)("inlineCode",{parentName:"p"},"else"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_b = 3;\nif number_b == 2 {\n println!("number_b adalah 2");\n} else if number_b < 2 {\n println!("number_b adalah di bawah 2");\n} else {\n println!("number_b adalah di atas 2");\n}\n')),(0,t.kt)("p",null,"Pada contoh di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"number_b")," yang nilainya ",(0,t.kt)("inlineCode",{parentName:"p"},"3"),", match dengan statement seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"else"),", dengan ini maka statement dalam blok kode tersebut dieksekusi, text ",(0,t.kt)("inlineCode",{parentName:"p"},"number_b adalah di atas 2")," muncul."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(3732).Z,width:"447",height:"96"})),(0,t.kt)("p",null,"Silakan bermain dengan nilai variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"number_b")," untuk coba-coba."),(0,t.kt)("h2",{id:"a93-nested-if"},"A.9.3. Nested ",(0,t.kt)("inlineCode",{parentName:"h2"},"if")),(0,t.kt)("p",null,"Sebuah blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," bisa saja berada di dalam sebuah ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),", dan seperti ini umum terjadi di bahasa pemrograman. Di Rust penerapan nested ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," sama seperti pada bahasa lainnya, yaitu dengan langsung tuliskan saja blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," ke dalam blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_c = 10;\nif number_c > 6 {\n println!("selamat, anda lulus");\n\n if number_c == 10 {\n println!("dengan nilai sempurna");\n } else if number_c > 7 {\n println!("dengan nilai baik");\n } else {\n println!("dengan nilai cukup");\n }\n} else {\n println!("anda tidak lulus");\n\n if number_c < 4 {\n println!("belajar lagi ya");\n } else {\n println!("jangan malas belajar!");\n }\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"nested if",src:n(1669).Z,width:"448",height:"128"})),(0,t.kt)("h2",{id:"a94-returning-from-if"},"A.9.4. Returning From ",(0,t.kt)("inlineCode",{parentName:"h2"},"if")),(0,t.kt)("p",null,(0,t.kt)("em",{parentName:"p"},"Returning from ",(0,t.kt)("inlineCode",{parentName:"em"},"if"))," adalah salah satu cara unik penerapan ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Yang biasanya ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," digunakan untuk eksekusi statements dengan kondisi tertentu, pada case ini statement yang ada pada blok kode if ditampung sebagai ",(0,t.kt)("em",{parentName:"p"},"return value")," atau nilai balik. Teknik ini mirip seperti operasi ",(0,t.kt)("em",{parentName:"p"},"ternary")," hanya saja jumlah kondisinya bisa sebanyak yang kita inginkan."),(0,t.kt)("p",null,"Agar lebih jelas, silakan pelajari dulu kode berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_d = 3;\nlet result_d: bool;\n\nif number_d == 2 {\n result_d = true\n} else {\n result_d = false\n}\n\nprintln!("result_d adalah {result_d}");\n')),(0,t.kt)("p",null,"Blok seleksi kondisi pada contoh di atas menjadi penentu nilai variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d"),". Dengan kebutuhan tersebut, kita bisa juga memanfaatkan ",(0,t.kt)("inlineCode",{parentName:"p"},"let if")," untuk mendapatkan hasil yang ekuivalen."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pada kode di atas, deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d")," dan pengisian nilainya adalah ditulis dalam statement terpisah. Cara ini diperbolehkan pada variable immutable (tanpa perlu membuatnya mutable) selama operasi assignment hanya dilakukan sekali saja setelah deklarasi."),(0,t.kt)("p",{parentName:"blockquote"},"Lebih detailnya dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/variabel#a45-deklarasi-variabel-tanpa-predefined-value"},"Variabel section A.4.5"),".")),(0,t.kt)("p",null,"Kode di atas jika diubah ke bentuk ",(0,t.kt)("inlineCode",{parentName:"p"},"let if")," hasilnya menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_d = 3;\nlet result_d = if number_d == 2 {\n true\n} else {\n false\n};\nprintln!("result_d adalah {result_d}");\n')),(0,t.kt)("p",null,"Penulisannya cukup unik. Blok kode seleksi kondisi dituliskan sebagai value dari statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let result_d"),". Dan isi blok kode nantinya akan menjadi value untuk variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d"),", tergantung kondisi mana yang match."),(0,t.kt)("p",null,"Pada contoh di atas, karena ",(0,t.kt)("inlineCode",{parentName:"p"},"number_d")," nilainya 3, maka ",(0,t.kt)("inlineCode",{parentName:"p"},"result_d")," bernilai false. Blok kode ",(0,t.kt)("inlineCode",{parentName:"p"},"else")," adalah yang dieksekusi."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(5146).Z,width:"447",height:"112"})),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Dalam penggunakan kombinasi keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"let")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),", pastikan di akhir blok kode seleksi kondisi dituliskan tanda ",(0,t.kt)("inlineCode",{parentName:"p"},";"),".")),(0,t.kt)("p",null,"O iya, beberapa orang lebih memilih memanfaatkan indentasi untuk mempermudah memahami statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let if"),". Contohnya seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_d = 3;\nlet result_d = \n if number_d == 2 {\n true\n } else {\n false\n };\nprintln!("result_d adalah {result_d}");\n')),(0,t.kt)("h2",{id:"a95-kombinasi-keyword-let-dan-if-dengan-tipe-data-eksplisit"},"A.9.5. Kombinasi Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"let")," dan ",(0,t.kt)("inlineCode",{parentName:"h2"},"if"),", Dengan Tipe Data Eksplisit"),(0,t.kt)("p",null,"Ada situasi di mana dalam pemanfaatan ",(0,t.kt)("inlineCode",{parentName:"p"},"let if")," kita perlu men-specify secara eksplisit tipe data variabel penampung. Caranya sama seperti statement deklarasi variabel beserta tipe data, langsung tulis saja tipe data yang diinginkan setelah nama variabel dan sebelum operator ",(0,t.kt)("inlineCode",{parentName:"p"},"="),"."),(0,t.kt)("p",null,"Pada contoh berikut, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"result_e")," saya definisikan tipenya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"string literal &str"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let number_e = 3;\nlet result_e: &str = if number_e == 2 {\n "angka adalah 2"\n} else if number_e < 2 {\n "angka adalah di bawah 2"\n} else {\n "angka adalah di atas 2"\n};\nprintln!("angka adalah {result_e}");\n')),(0,t.kt)("p",null,"Contoh lain:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let max = 100.0;\nlet string_f = "nilai minimum kelulusan";\nlet result_f: f64 = if string_f == "nilai maksimum kelulusan" {\n max\n} else {\n max * 3.0 / 4.0\n};\nprintln!("angka adalah {result_f}");\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"seleksi kondisi",src:n(3853).Z,width:"450",height:"94"})),(0,t.kt)("h2",{id:"a96-keyword-if-let"},"A.9.6. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"if let")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"if let")," berbeda dengan kombinasi ",(0,t.kt)("inlineCode",{parentName:"p"},"let")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Kita akan bahas topik ini secara terpisah pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"),"."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/seleksi_kondisi_if"},"github.com/novalagung/dasarpemrogramanrust-example/../seleksi_kondisi_if")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-05-control-flow.html"},"https://doc.rust-lang.org/book/ch03-05-control-flow.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.if.html"},"https://doc.rust-lang.org/std/keyword.if.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.else.html"},"https://doc.rust-lang.org/std/keyword.else.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/if_else.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/if_else.html"))))}s.isMDXComponent=!0},5632:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAABuCAIAAADXpuElAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMzFUMjI6Mzk6NTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjEyOjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjEyOjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJkNTQ3NmE2LTc1NDUt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"},3732:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABgCAIAAAACbutrAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjRUMTE6MzA6MTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjExOjMwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjExOjMwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEyNDk2ODIyLTcxMzkt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"},1669:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAACACAIAAAATaC78AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMjM6Mzc6NTIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjEwOjM2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjEwOjM2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE3MWM0Zjk1LTM4MDMt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"},5146:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABwCAIAAAABuOnwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjRUMTE6NDA6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjA5OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjA5OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY5OTIwOTUwLWViMDQt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"},3853:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABeCAIAAAA/qYOeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjRUMTI6MDc6MzArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjA4OjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjA4OjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgxMWQ1NTI2LTQ5N2EtZjI0NS1iMGZlLWJlNzc1MzM4YmE1MiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4MTFkNTUyNi00OTdhLWYyNDUtYjBmZS1iZTc3NTMzOGJhNTIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4MTFkNTUyNi00OTdhLWYyNDUtYjBmZS1iZTc3NTMzOGJhNTIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjgxMWQ1NTI2LTQ5N2EtZjI0NS1iMGZlLWJlNzc1MzM4YmE1MiIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNFQxMjowNzozMCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtM1ngIAABiqSURBVHic7Z1PcBtVnsd/LY+ME4FRkHFElmnSa+jEVFho1kUQXtBUZkHL1rpm0kVoylMcfOPuqr35lLMPe+PGwTVUaaEEVTmwZmtTo0x5PNkJNFPMrEFsUNL8ieKNxsITgbEi9R66W/3vvdZrtSQr9u9TU0Pcev1+7/d7r396r1/3VxzP84AgCIJ0S2yvG4AgCHJ3g2kUQRAkEphGEQRBIoFpFEEQJBKYRhEEQSKBaRRBECQSmEYRBEEigWkUQRAkEphGEQRBIoFpFEEQJBKYRhEEQSKBaRRBECQSmEYRBEEiETKN/t3Pz/3yeR4AgM/KSk7qeXukXD9qjYCUU+Rs1yJYIaLUnaFozesL7iZJOUXp2ERmLyKOOj4rEwx1tD6EQUZgmDruJyHKHntm7tHDlT/8l9a31gCoGxU5I2erhWKgFSmniMn2X7VSflX1H7cPB57dqKwHWFM3KsKMwIPmKiHlFGEn6LTwkA0BAJ+VM+l4cCt7ADl0fXCUANF3dy8Z3TQ468iw4R+Kw9Nx7Gl08plTD+oV9bdf9bE1AKAVC6mcMpPltU6XrnWp81k5o+Qgv1rNymKisp5nuuadZ2fkLFAzhVauzmSmJdCIGbmHUAzxQgoqpUpK6Od44cOELhTqap4hcBTffd8d/ZlZDKyLkd4yNB3HnEYf5Sdg85Pffe0+2p4xtKcvxtwJAJwXgeMgsaR73qhuVIQQwdGK5WlFnAR+PBVvVMshE4GRtsW2OSmniElXe7RieVoRsrzaMccQfYcOUbIPEg3xQipeL6tlcH7vOk+HRoViXcopkzuVRDodb1RK1ZRIn9Lygj90juoyipKxWlrNypmxssMN8w9Ck+xDrng6Zpl2e9iDTIwnsU7iQU8lRg3kyDMF2Vsy6EIw5lNXYMb4oFbKr6p8Vp6BK+WxDH2EGMcovZki1MkQEOuD7Wni6exjye8m2SOK7x3HkjXmCENRpV0yg+841jT6aPLeO1ufe5JoUhQq6/m8BlJOEXOSuqry2Wm4ks9rZmuMSSWfnUnXvQtsKZexDvJZzzpeK1dnMpMSQKgvGa1cnUmnA2eWZKo7DUiN8wC0s9TNmth5MkjyHYAcJUJAyIZ4IRWvlVXQpHrG+sQROpByikCzvg2QTI+V8qVJRRSN/1K8IIVOKxY0wkqKPB8kNsmogc/KmTFHkOxpL5+VM5mcpBlxYAsyKZ5VUp3kg3Z7Fffs22edNciU4U0sCQDxdCZTK+XzKp+VM0IW1DJAPJ3xjhDC1UHpzW1SncQgSzlrfsBn5Uy6XioUNZCmvafzahGYxxIIxDHf9qhdJc13AoR4kofiEHUc4xbTkcP36N/Xb3iO1kqmU+pmDZKTEoBWXLXc1MrVRnwsZRZNTro3BqTJZK1kOqAVy7V4SnBcoNp2HRLjjCs4KScmG5UNAK1YyK9XIJ1RGHY1HGjbdfsPdTWf9yU4daMC6ekOWxs03/1RAvAHhGyIF1Lx2qZqnGzEiM8Kdug6WW9UNlTnf+lt7y50ZivJTSIgTafjtbLZUK14pdKw40AIctxokKIoir2z5IknsU7yQRPByKHuC9JtPVSQgdCb1JKNyvqq2j5K8CgxTrw6jHPJvempk+y7NJkEYyiBVq42HNeX+/RUmLHUacx39p0M+eogMhQdxzgbPTwa50Cnf17dacCY4YZjQg1QM1pWSOUUUVFEe+I/noCkcaTdSk994liKPj8EAPt854rNmAEZ38FKLkXZY3LDjycAdgKLMM2PSb67sKJECAjZkDUXBbC/dslf4QzWO9FN6LqgsVOlfOIPcod9tfaoI9ZJMRRPp5PQqPhu/nTdxeTepHSHfevECrevfWPAQ/DV4cFbp5Qj+V7daUDa8M99D8fXpDBjKcyo6+y79SHt6iCXH4KOY0yj9R93W0FfH6mxeGNHBSmXSYO1VnKu5qyNBimnZOQsFMoQsJFu1Ue73EyCzteKVwQ5E7hSb8MLqTjUt4PLdb53R/XdxuGVNyCOtbRtiBdScYg7r6eGQEmjDNYZCRO6bog7vh5TY3HnR6FukIIZT4Axcp0UQ43K+hWYcdxNYLfOPLyLqe67o2F8oftGt5RjroLguwTadj2TtpJzo7JOjzHrWCpqUk7p0ahzQ706iAxBxzEu6mvf78ChxEOUT/mskGxUzevbTEh8diYd95Ws7jQAwJgZJ0XqE4D8eKJjYguGKTcCGBGOO5YBUs65gHTQXlUHEOi7GSV3k6yAEA2lxuKNynreYr3SiKdA265bSxE+Kzu3DAKts+MKXXWn4ffaXA9KOfNrm94kgm+QFMybBnxWSHrWpyxBbrfTHHWkOskHLbRioVRLir6bF7b1LoPs6s3w3SHlxGSjWu50dXSCGGRjtWsNpY5TPPbGRxx13rHkwhVP4lA02POOY91iuvpd/cSJqSfgxqftQxx35MRrr50AANi98btCUQPQNirCc+bBrRs3Gg+NGe48l45bdwRqJSPTFwuQlTPtiZZr9u5cy7Lj2YcMmqyC+5YA23M+ngcI4mlr19Bs/UZFyJiV1iqVRtr6HvPdfHAvG6yA+A2lJpON6rp7wZ+Ws9VCqWYuRWql9Yow0z6HZJ0JeuiMuanpaa2UX1XtA41KqdIQxwBAXS1N+prkdFNUFNE4fTUPOcWx30rx3QiyL8bEeGqkOokH7WtQXV0flzMZRRacq0bbOtEjYpCJvamF6g7/7SnC1bEdVIMbYpC18rTiWthQ18usYynLRxt1zsFljyXq1eEfip4m72HHccy/U38088/Ppm9//N6lPj84OqhHvrthYC0b3hD0n731fdDWXQ/9DM4On5Uzqep+GmF72nHsj9/fXP/Td7/6xxde/ubXH1ztW9vaT8SsDmX3sj1LfjcZGkL21vf9Gnn3bWjme153D3vacWFeBtV+8+urv/rXfzl37d/e2ehcujuk6XTdt9JDECQajsUuAHS854WEgn1RjyAIghBg3KlHEARByGAaRRAEiQSmUQRBkEiM3H///XvdBg8T3PwTIyfi+v/UelFygpt/YuThH/X//b4/bQAppzz38F83rn8Xpn5qVdmZU6dOnTp1YqI3NXZhn8k0e8kOtfQqdGx18ln5n06O/flq0KuVLBaYfWfqUbvQw6MR2zYQOneblFOeHGd1pTdjaW8Js1PfU7hXTsdG7T/1bz9t/caR6UYPsVbEXvJuoO/qzACw149mHhhsTaVAjEd1mN483PsHl5keSGQUX48OVWyTuaSUU8Rk5Ktuz9IoAABsN9/2Pzp1S3/7VpPpdPaSCAvsj97t16crWWD2nR9PQPiX8YYaPjuThqD38U3YxdejjCWHJp6UU8SAvE0uKeUUESqVBqSIJ4Vgb9OoF8cUtZ1hJ7j5Ke7bm/qxozEAgB9ba5/o14klzcLW7V6zJAAA3Mu9MhUbdR20a9i92Xz3mu/0YDpJw7aldkWwv/s8f7JZ8enaVilCv36lXoKALk0BlyCxTFHqBYIYs0cVh6T+SykcKF0EzG/bsHWHiUf1mSYeTBA5LgtE34nd4RNecZkOve6gqGi7RY6DZIaB6FFR80aJbghAmvYlUaLyMQCb+DpJ2JseT9/JQrJRWVdtaymKXC2pJEAqJ+ys54uQldOURrE/XTtcaVR/93LTt94HAO7YUf2zy82PJ7j5qdjjE83rt4gluVemYnZOdHDkKLhP5145HRs18u8ENz818vLt5gfAzbdP75BPidKwJCHqzZoo2rJ3PZud+GVxgaJS7JUEzq+SFXBJEstkpd4ioWRbYc1IvptWHiYocxNDFxHm7gAgqT5T6iSIHINGipKvO6pW/gJTTaD9FUaRrGaAoqLNKjPMq8UUUbaZECWqRrLkEXkgSizbLe4sYEcedRTVZy+pMVvtz1Q2oWhrkkpKUFwtAPjU+oI8orO3O/XjI/Onjf9xTwcW3Lqqf2z9O3FvUMnRo4SqPKc/cpwbBf1bY6Z6C7YAjjwITz8YA2h9ea1zq8nSsEQhanXDFibmhRR0UE9mxiuLS1cp9kgCh3vXglX1uY2UE8EKAkl7mF3gmR3m7jA+8Ko+UxyhihyT8HSHVizk8/l8qQZgiSqtqoGS1d3DKDOskT0KVk/3QNFdo3oRSnzdBVn1mdyorKwoigilfKnD+GYvGb5fhvDeaPfof7ipzx6NnTwNJ8G9qHeTOsQBwLEnRuYdB8fviWSbIkRtfyXzQgqqV/p3y72jPiu4ZSj7gJQToWTd6OqkzB2Ma5Vu6jyFWQazWG+rPhOgihxHgqWPwsIsM0zwiBfC9BHhJkWwxDKL+Hok2lNuAOCzMtQ3aaaYS4YVjTYYrkV9VK5fa12/BgDws6dGjt0Te3yiSUyj1R90GAfPswE/eyqyedKdFCuP8uP9zaJBcsht+nEZt3ElUQNfQPgsY2XWbYIoSkT+7nDPQEzVZ7J9ZpHjMLD0UTjY5bpJHvEQ5uV68tdOgMQyi/h691R3GtCorjvuRNOMsZcEgLCi0QCw14v6vlGuBfziCVy/pu8Cd+wR/ymxoxMAwL0cuNFElIalSu1q5WojMS4JqXq5q2sxUNfWIlClGIzzRVs0OkABt0v4rGwv5wGAEhB2gWd2wnWHo8UOrXFvkEOKHDPRSbKaBWLHMckMEz2iR4lkKHiR7hcgjy6+HohWrjbi6RkjoG5NdGP93pblDigZBEFSncZQzUadGzvjI/OnYfdm893b7CVd+0K7N5sf3AKYIFrS373amp8amT9t/r11tfnBtZaQHDk2NTI/BVtXW1tTsQStnURpWI0mRG38AHS6ViqyR8KEqGtLaRJFpZjyi1UeBVzHBn5bYnmTYMa1sWuLMVeNK9heHhoCz4SAEEMXEfbuAGJACEE2+swrcgxE30O0M1iymgG/dDGrzDDZo4BBS9BIVjdroujcfA8UIO8svk4eSyGCUYCs1cjABTixpNN6OqMomUYlXyh3kFSngApPQ0SvH64elCTw/mMPRI773Fm98SjEaQfqFY99uqhHkCjsP5Hj3nikFa9UwFoeB2C863TlYORQGLJFPWL9+tBg3glFaAxU5Nh+Kr7WLxO984jp/aQDJ76Oi3oEQZBI4KIeQRAkEphGEQRBIoFpFEEQJBIHZItpwiE70gOMTYGh+nHFjs+XBBaI+rTNgXq6xQNJpigQe0uJphrVEyhKmm7r/eixIbw6+s0wpdFHjsdmj3LtP3uX9Ux6J/CsrhrKOUoOXGNlD1V11Y2KMEMRCus//bHuFHbr71UZpeMoMkV0Ux4tZ7JqVJ9gVJKOBO3q2McMUxo12Lra/OAWPD09cvLoyMu3mx/c6kWlfRB4dojDDQVauTrTSd/xbrJuvF6ab7/eLOYkdR9clIPTcibJIQ/M+rBdHX1m+NKowcf/1zo5HgMw1+NGbrXX5rdJWs7sAs/kkn6Z0dZnl22FvUCGQFVXK5anFa8644D0jItaJ+t0JWmVfNAlIBEkxuRpuyvM3etYd+6j7tbErIokXkMp73w56D4M9T4Dq3XfCOGzciYNlsfSS4p4xPEB08947GeGNY0+/WAMQP/he4DDtCI+LWfiQbLAM7Gkrfr8yPHY7FH49lPGHArDoaoL6mZNFJxL68HpGZOsk3wHv5K0SpKXVlfVzZooGsrGfHYmHa+V6JeolFPagsht4x10rNuBp8bT00eglqPoLvteIA/IO4TGr4cRnfPfZwhjnThCDP24mSyvFVM58chWKf+h6it5Nlt970DeHx++nfojUyPzp0dO3tNau2wK2ekAbb2m9r91ipYzu8Czt+QEjIJ+axMA4PrtIIGoMAxQVRcA1I0KpKctwZ5B6xm7rdN99yhJEw/yAOpqPl8CUVGUTKq6HjDRMdSS3G8edtaxZpAEdvdRRN1lspYzEZIhbbtufpgzpIvCqdCFsE4bderqekVPn8xmjye3Sh+qAABPPZjc+twuuTX6wPGD+TLPkM1GdR22vmz+B3Cv/W3s7483DfFQveVIo7qVRnVCbo3ELdid4g4dBvjeVMLfDvWbzBQGp6oLwPLDDf3UM/Zap/juIk4yFB9LAaTMKWZek3JKRpEF2ho6NUZ8Pzyy1KW3j6RcfwVbXbZ9hqo7DWGcB2kSanUz+3fxUrwOwHUowo8f9oyQXXOEaMWPjp/NPFS3VGX58QQcEV999QTHAYCu63oYZe79xDClUV2HZguaOkBV/+YYHJ3gnrym/1GHOzq0rCloswUtHUAHXYeW48T2PyLm0yNTI/NTAO65aggXPH8PUlXXqIZ0i9JL3/SMXdbZfCcaauyofFZOWtUbCnMibQeLkvV7r5HcnzoZDWnb9cxkShpL7GyUx6YlfifRx5y+9Xn+w098R6WXMqnq5zceEM++cOu9S18BAOhbpX8nlDxoDNOivtWC3aZ+RwcA+PIv+u4dLvkAgA6NO3r8EABwP/sp12jqjRaADo0m3HHk1qYO4JmiulOqf8bqmcw+cpwbhdZnl5tvX26+fbm7JwRu7fz4kyOudY0+OFVdE3XTWoXthZ6xbR0AOvhuKknTD9prbmkySZ8JklzqrGPtgknHuhe6y0zQGz8+DtWyVt1JTE6PxbvUnNK93/V89qyiKGcdIse7R0689JT3vKdefCy5Vb70yaWPKpCeeeGnRsmk+KKv5MFjmGajzab+wy73YwsA4Juv9Ufv40ZT3NEv9I37OH489uLj8Ndr+s2/4Q7dAWjBD7t6w5iO6rB7R79j5damZ946wb0mxIwj+n0jrz0Du5vNwm33WNIBAK5f06cnY+IzIFojbavc/DBcMv3q0pXjv3j29LlzpwGg9sU7/6lu3Dj+3KBUdU3sX7YdmJ6xRrROUxT2GSLKS2v2b+IQzHiC53LJ1Iem6FhTaqDH0+EbsU6S9jB7diWfThR43mmI6VRlvQgaVGcyafoXA589m0mPOuo0N4Qo6Lqu67p9SWiX3tNfOJt59VV7hLy3ffLcY8mtz9/5BAC+ulQ+ee6xZ3/5PLx/6X14/hfPnjv3mFXy9+//9itm3/cPqPBk8aQ48th9rS8+0v8IAACzp0Ym9dZ//1n/ZiDWe6sT3L/XAFjaGWSd+JgOyksjdzfDNBvdWw6N6D/eAevXVzgA/fYu9PiRfTq91QkmPXndG1ja2T/rCDKUYBq1+P2GPnOCmxC5fzButm7rH2n6XwZlfaA6wRHYy3Z6Hvu3GLpQDaydT730qnjE2iV3GsJdnwGDi3oEQZBIDNNOPYIgyF0IplEEQZBIYBpFEASJxD7ZYuLor4NyHGf9v95qBb7kxHGc7ns4GUEQJJB9kkYDcp+RGJnSY09zaEBmRxBkP4GL+n6BORRBDgiYRhEEQSKBaRRBECQSmEYRBEEigWkUQRAkEgNIo7NLK4WVpdn+GVhYDqp/dmmlYLC8EFjN7NJKpyIIgiA+9skDTwGsnX99DWB2aWUx2aMaZ5dWFqWE80hdXX79PLgPly/Ii2/1yCKCIEPM/k+jvcdIzBYLy4U5+HoNYNZMp2v0MxEE2YcwplHHBMxMFbNLK2/AmxeTi3MCgGPutbBcmBPsE+uy/KajHuNTo7C/Tnbr4JkT1tWAkux1OtvPOJtcOCXU1WWcdiLIwYXp3ujskgxvyrIsy/KyCtIb5o3IhLR4prYsy/KyWhfOLM0CwMLynFC+YBSsA5QvvO6oZmG5MDepLsvy4lvUOlmtLywvSpsXjKMXykElw3gEwpzXo06ROSOUL+IEFEEOMkxpdO38opUp1i6W6omkKdpbvmDM4toHF04JUP7TW1ZBmHy4nYnOGDm0Pe2j1clkfXbpjFC+4JssRqqT7FEwC7IEasFuRkJaZNvOQhBk/8C2qPdsqpRp5Uq1OkinFgDegtkzYqJeumjcM4SEJAlQVy86pm2sde51yaA6zgj10rLlk+OW6ezSymJhGXCPCUEOAiyz0YXlRQnUZWsNXKeXXPt6E0CYKxQKhUUJ1Dfbq926urysgrTYnqSx17m3JQNYkKUEZUG/drHUXZ0Igtx9sD43uvm1ua/zhvtRHxfGWls28WzwrJ1//UJZmHM84clUJ7Hk2tebIJxaMI6tOLe0uq8zJLNLZ4S6c0Hv+uwNKWHe3EAQZL/Dsqh/q6CeWZwrFOYAoKyqdSlJKbh2/qJcMAsCgPU8pV3R4vLDK4uLhZUzy6+z1km2/tbihVOmpfKFZfXMG9SSztX7XKEwZ+zAM1unYCTKC+cpNynq6rKM+04IckDo6U/azS6tLCYvtu8Izi6tLIolfJISQZB9TU9fBhWTzuXx7BkxYS2dEQRB9is9/oFl98P3+D4kgiD7H/ydegRBkEigUB6CIEgkMI0iCIJEAtMogiBIJEKm0VhsZCTGAQBw7X/1FC4W60OtEeA4LoKfHBeLcUPlD4IgvSak3mir1TT/pbeazcCi3aG3WsP1y8S6rje7b5GuD5k7CIL0HFzUIwiCRALTKIIgSCQwjSIIgkTi/wH4l5+XTFlmAAAAAABJRU5ErkJggg=="}}]); \ No newline at end of file diff --git a/assets/js/0ae704f7.12a11a9d.js b/assets/js/0ae704f7.12a11a9d.js new file mode 100644 index 00000000..998d058c --- /dev/null +++ b/assets/js/0ae704f7.12a11a9d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[2089],{3905:(e,a,n)=>{n.d(a,{Zo:()=>o,kt:()=>k});var t=n(7294);function r(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function i(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a=0||(r[n]=e[n]);return r}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var m=t.createContext({}),u=function(e){var a=t.useContext(m),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},o=function(e){var a=u(e.components);return t.createElement(m.Provider,{value:a},e.children)},d={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},b=t.forwardRef((function(e,a){var n=e.components,r=e.mdxType,i=e.originalType,m=e.parentName,o=p(e,["components","mdxType","originalType","parentName"]),b=u(n),k=r,s=b["".concat(m,".").concat(k)]||b[k]||d[k]||i;return n?t.createElement(s,l(l({ref:a},o),{},{components:n})):t.createElement(s,l({ref:a},o))}));function k(e,a){var n=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var i=n.length,l=new Array(i);l[0]=b;var p={};for(var m in a)hasOwnProperty.call(a,m)&&(p[m]=a[m]);p.originalType=e,p.mdxType="string"==typeof e?e:r,l[1]=p;for(var u=2;u{n.r(a),n.d(a,{assets:()=>m,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var t=n(7462),r=(n(7294),n(3905));const i={sidebar_position:33,title:"A.33. Pointer & References",sidebar_label:"A.33. Pointer & References"},l=void 0,p={unversionedId:"basic/pointer-references",id:"basic/pointer-references",title:"A.33. Pointer & References",description:"Chapter ini membahas tentang apa itu pointer, references, dan dereferences. Pembelajaran dimulai tentang konsep dan praktik dasar tentang ketiga topik tersebut, kemudian diikuti dengan pembahasan tentang karakteristik pointer & reference.",source:"@site/docs/basic/pointer-references.md",sourceDirName:"basic",slug:"/basic/pointer-references",permalink:"/basic/pointer-references",draft:!1,tags:[],version:"current",sidebarPosition:33,frontMatter:{sidebar_position:33,title:"A.33. Pointer & References",sidebar_label:"A.33. Pointer & References"},sidebar:"tutorialSidebar",previous:{title:"A.32. Basic Memory Management",permalink:"/basic/basic-memory-management"},next:{title:"A.34. Ownership",permalink:"/basic/ownership"}},m={},u=[{value:"A.33.1. Pointer",id:"a331-pointer",level:2},{value:"A.33.2. Reference (operator &)",id:"a332-reference-operator-",level:2},{value:"A.33.3. Dereference (operator *)",id:"a333-dereference-operator-",level:2},{value:"A.33.4. Mutable References (operator &mut)",id:"a334-mutable-references-operator-mut",level:2},{value:"A.33.5. Aturan Reference",id:"a335-aturan-reference",level:2},{value:"A.33.6. Karakteristik pointer & reference",id:"a336-karakteristik-pointer--reference",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"A.33.7. Reference & borrowing",id:"a337-reference--borrowing",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:u};function d(e){let{components:a,...i}=e;return(0,r.kt)("wrapper",(0,t.Z)({},o,i,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Chapter ini membahas tentang apa itu pointer, references, dan dereferences. Pembelajaran dimulai tentang konsep dan praktik dasar tentang ketiga topik tersebut, kemudian diikuti dengan pembahasan tentang karakteristik pointer & reference."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Penulis tekankan bahwa ",(0,r.kt)("strong",{parentName:"p"},"pada chapter ini, konsep reference yang dibahas adalah dalam konteks programming secara general.")," Tidak dari sudut pandang ownership.")),(0,r.kt)("p",null,"Reference pada Rust memiliki keunikan, tapi kita akan bahas itu secara terpisah pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),". Untuk sekarang silakan ikuti terlebih dahulu pembahasan chapter-per-chapter secara berurutan."),(0,r.kt)("h2",{id:"a331-pointer"},"A.33.1. Pointer"),(0,r.kt)("p",null,"Pointer artinya adalah alamat memori. Variabel pointer artinya adalah variabel yang berisi alamat memory (hanya alamat memory-nya saja, bukan value yang sebenarnya)."),(0,r.kt)("p",null,"Di Rust, variabel pointer ditandai dengan adanya karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"&")," pada tipe data. Sebagai contoh ",(0,r.kt)("inlineCode",{parentName:"p"},"&i32")," artinya adalah tipe data pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),". Contoh lain adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"&bool")," yang merupakan tipe data pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"bool"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Ada dua jenis tipe pointer di Rust programming, yaitu smart pointer dan raw pointer. Pada chapter ini kita tidak membahasnya karena termasuk topik yang cukup advance. Pembahasan akan ada pada chapter terpisah ",(0,r.kt)("a",{parentName:"p",href:"#/wip/smart-pointer-raw-pointer"},"Smart Pointer vs Raw Pointer"),".")),(0,r.kt)("h2",{id:"a332-reference-operator-"},"A.33.2. Reference (operator ",(0,r.kt)("inlineCode",{parentName:"h2"},"&"),")"),(0,r.kt)("p",null,"Ok, selanjutnya apa itu ",(0,r.kt)("em",{parentName:"p"},"reference"),"? Istilah ini sudah beberapa kali disinggung pada chapter sebelum-sebelumnya."),(0,r.kt)("p",null,"Reference artinya adalah pointer dari sebuah variabel atau data. Operasi pengambilan pointer dari variabel disebut dengan ",(0,r.kt)("em",{parentName:"p"},"referencing"),", caranya dilakukan dengan menggunakan karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"&"),"."),(0,r.kt)("p",null,"O iya, semua jenis variabel bisa diambil nilai pointernya. Contohnya bisa dilihat berikut ini:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let number: i32 = 24;\nprintln!("value: {:?}", number);\n\nlet pointer_number: &i32 = &number;\nprintln!("pointer: {:p}", pointer_number);\n')),(0,r.kt)("p",null,"Pada contoh di atas, sebuah variabel dideklarasikan bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," dengan tipe data adalah numerik dan value ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),". Variabel tersebut jika di-print akan muncul nilainya, yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),"."),(0,r.kt)("p",null,"Ada satu lagi variabel yang dideklarasikan yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number"),", yang nilainya adalah ",(0,r.kt)("em",{parentName:"p"},"reference")," dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Cara pengambilan reference yang dilihat pada contoh, yaitu dengan menambahkan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"&")," pada variabel yang ingin diambil pointernya."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// variabel pointer_number nilainya adalah reference variabel number.\n// contoh statement:\nlet pointer_number_1 = &number;\nlet pointer_number_2: &i32 = &number;\n")),(0,r.kt)("p",null,"By default, ketika variabel pointer di print, yang muncul adalah ",(0,r.kt)("em",{parentName:"p"},"underlying value")," atau nilai sebenarnya, yang pada contoh di atas adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),". Untuk menampilkan alamat memory gunakan formatted print ",(0,r.kt)("inlineCode",{parentName:"p"},"{:p}"),"."),(0,r.kt)("p",null,"Coba jalankan program kemudian lihat hasilnya. Value muncul sesuai dengan yang ditulis, sedangkan pointer memunculkan data alamat memory yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"0xa3bbeff6dc"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"pointer & reference",src:n(1007).Z,width:"494",height:"320"})),(0,r.kt)("p",null,"Seperti yang sudah dijelaskan di awal bahwa variabel pointer isinya adalah alamat memory. Penulisannya dalam notasi heksadesimal diawali dengan karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"0x"),". Contohnya adalah nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"0xa3bbeff6dc")," yang merupakan alamat memory, yang alamat tersebut adalah reference ke pemilik data sebenarnya (yaitu variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),")."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Di environment lokal masing-masing, alamat memory yang muncul sangat mungkin berbeda karena alokasi adalah random")),(0,r.kt)("h2",{id:"a333-dereference-operator-"},"A.33.3. Dereference (operator ",(0,r.kt)("inlineCode",{parentName:"h2"},"*"),")"),(0,r.kt)("p",null,"Kita sudah belajar cara mengambil data pointer dari sebuah variabel. Pada bagian ini kita belajar cara mengambil nilai sebenarnya atau underlying value dari sebuah pointer (istilahnya adalah ",(0,r.kt)("em",{parentName:"p"},"dereference"),")."),(0,r.kt)("p",null,"Cara melakukan operasi ",(0,r.kt)("em",{parentName:"p"},"dereferencing")," adalah dengan menambahkan karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"*")," pada variabel pointer. Contohnya seperti berikut, silakan tambahkan kode ini ke program yang sudah ditulis."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// variabel underlying_value nilainya adalah nilai sebenarnya dari pointer pointer_number\nlet underlying_value = *pointer_number;\nprintln!("value: {:}", underlying_value);\n')),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Dereference",src:n(6356).Z,width:"467",height:"412"})),(0,r.kt)("p",null,"Bisa dilihat, nilai dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"underlying_value")," adalah nilai sebenarnya dari pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number"),", yang pastinya adalah sama dengan nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),"."),(0,r.kt)("h2",{id:"a334-mutable-references-operator-mut"},"A.33.4. Mutable References (operator ",(0,r.kt)("inlineCode",{parentName:"h2"},"&mut"),")"),(0,r.kt)("p",null,"By default, reference sifatnya ",(0,r.kt)("em",{parentName:"p"},"read-only")," atau ",(0,r.kt)("em",{parentName:"p"},"immutable"),", artinya tidak bisa diubah ",(0,r.kt)("em",{parentName:"p"},"underlying-value"),"-nya."),(0,r.kt)("p",null,"Jika ada variabel (sebut saja X) yang merupakan underlying value dari reference variabel lain, maka perubahan value pada variabel X tersebut ",(0,r.kt)("em",{parentName:"p"},"default"),"-nya menghasilkan error."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let mut number = 24;\nprintln!("number: {}", number);\n\nlet pointer_number = &number;\nprintln!("pointer_number: {:p}", pointer_number);\n\n*pointer_number = 12;\n\nprintln!("*pointer_number: {}", *pointer_number);\nprintln!("number: {}", number);\n')),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(8992).Z,width:"715",height:"343"})),(0,r.kt)("p",null,"Pada gambar di atas bisa dilihat, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," merupakan reference dari variabel mutable ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Setelahnya ada statement ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number = 12"),", yang artinya adalah underlying value dari variabel pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," diakses kemudian di-isi nilainya dengan angka ",(0,r.kt)("inlineCode",{parentName:"p"},"12"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number = 12")," tidak menghasilkan error, dan statement ini berbeda dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number = 12"),"."),(0,r.kt)("p",{parentName:"blockquote"},"Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number = 12")," menghasilkan error karena ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," adalah variabel bertipe ",(0,r.kt)("strong",{parentName:"p"},"pointer ",(0,r.kt)("inlineCode",{parentName:"strong"},"i32")," atau ",(0,r.kt)("inlineCode",{parentName:"strong"},"&i32")," (bukan ",(0,r.kt)("inlineCode",{parentName:"strong"},"i32"),")"),". Jika ingin mengubah nilainya perlu mengakses dulu underlying value-nya menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number"),".")),(0,r.kt)("p",null,"Ok, lalu kenapa muncul error? Di gambar terlihat ada garis merah dan popup pesan error muncul, padahal tidak ada yang salah dengan statement-nya."),(0,r.kt)("p",null,"Penyebab erronya bukan dari statement tersebut, tetapi pada baris statement pengambilan reference variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"&number")," artinya adalah mengambil reference dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Di atas sempat kita bahas bahwa ",(0,r.kt)("em",{parentName:"p"},"by default")," sebuah reference tidak bisa diubah nilainya (",(0,r.kt)("em",{parentName:"p"},"immutable"),"), dan ini adalah penyebab error yang dialami."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Silakan perhatikan pesan di popup error message agar mudah untuk tau di mana sumber masalahnya.")),(0,r.kt)("p",null,"Perubahan isi nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," tidak menghasilkan error, hal ini karena number adalah variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," adalah mutable. Sedangkan operasi perubahan nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number")," pada contoh di atas, dianggap sebagai error karena variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," reference-nya adalah bukan mutable (meskipun reference diperoleh dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," yang notabene mutable)."),(0,r.kt)("p",null,"Solusi dari error di atas adalah menerapkan ",(0,r.kt)("strong",{parentName:"p"},"mutable reference"),". Mutable reference sama seperti reference biasa tetapi nilainya diperbolehkan untuk diubah (mutable). Caranya pengaksesan mutable reference dilakukan menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"&mut"),"."),(0,r.kt)("p",null,"Ok, sekarang ubah statement berikut ini, lalu jalankan program:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// before\nlet pointer_number = &number;\n\n// after\nlet pointer_number = &mut number;\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(5127).Z,width:"488",height:"417"})),(0,r.kt)("p",null,"Deklarasi variable pointer yang menampung mutable reference bisa via metode penulisan ",(0,r.kt)("em",{parentName:"p"},"manifest typing")," atau ",(0,r.kt)("em",{parentName:"p"},"type inference"),". Pada contoh berikut, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," tipe data-nya adalah mutable reference ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", maka penulisan tipe data adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"&mut i32"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// type inference\nlet pointer_number = &mut number;\n\n// manifest typing\nlet pointer_number: &mut i32 = &mut number;\n")),(0,r.kt)("p",null,"Pada contoh ini kita menggunakan tipe data primitif, lalu bagaimana dengan tipe data non-primitive seperti custom type struct atau ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),", apakah penerapan mutable reference juga sama? Jawabannya tidak. Ada beberapa perbedaan dan nantinya kita akan bahas secara detail pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),". Untuk sekarang, dianjurkan mengikuti pembahasan chapter per chapter secara urut."),(0,r.kt)("h2",{id:"a335-aturan-reference"},"A.33.5. Aturan Reference"),(0,r.kt)("p",null,"Ada dua aturan penting yang harus dipatuhi dalam penerapan reference baik mutable atau immutable reference."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Dalam waktu yang sama, hanya boleh ada satu mutable reference atau banyak immutable reference (keduanya tidak bisa bersamaan, harus salah satu)."),(0,r.kt)("li",{parentName:"ul"},"Reference harus selalu valid.")),(0,r.kt)("p",null,"Mengenai penjelasan tentang dua aturan penting di atas akan bahas pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,r.kt)("h2",{id:"a336-karakteristik-pointer--reference"},"A.33.6. Karakteristik pointer & reference"),(0,r.kt)("p",null,"Kita sudah belajar tentang definisi beserta cara penerapan pointer, reference, dereference, dan mutable reference. Sekarang lanjut ke pembahasan tentang karakteristik dari pointer & reference."),(0,r.kt)("p",null,"Pointer merupakan variabel yang isinya adalah alamat memory (bukan nilai sebenarnya). Dan reference adalah alamat memory suatu data/variabel. Dengan menerapkan keduanya kita bisa menerapkan efisiensi penggunaan memory yang dampaknya sangat positif terhadap performa program."),(0,r.kt)("p",null,"Sekarang perhatikan statement berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let number_one = 24;\nlet number_two = number_one;\n")),(0,r.kt)("p",null,"Variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," adalah data numerik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", eksekusi statement tersebut menghasilkan alokasi memori selebar 32-bit."),(0,r.kt)("p",null,"Kemudian ada lagi statement ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),". Meskipun nilainya didapat dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one"),", yang terjadi di balik layar adalah Rust akan mengalokasikan lagi alamat memory selebar 32-bit untuk menampung data ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two")," yang didapat dari hasil operasi ",(0,r.kt)("strong",{parentName:"p"},"copy")," dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Semua variabel primitif di Rust mengadopsi ",(0,r.kt)("em",{parentName:"p"},"copy semantics"),", yang artinya jika variabel tersebut digunakan dalam statement assignment, maka nilai akan di-duplikasi untuk kemudian ditampung pada variabel baru."),(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ",(0,r.kt)("em",{parentName:"p"},"copy semantics")," dibahas pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership#a334-copy-semantics-vs-move-semantics"},"Ownership"),".")),(0,r.kt)("p",null,"Selanjutnya, bandingkan dengan statement berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let number_one = 24;\nlet number_two = &number_one;\n")),(0,r.kt)("p",null,"Pada contoh di atas, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," datanya disimpan di memory dengan lebar 32-bit (masih sama seperti contoh sebelumnya). Namun ada yang berbeda dengan dengan variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),", variabel ini adalah variabel pointer yang nilainya reference ke alamat memory data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one"),". Yang terjadi di belakang layar, Rust tidak mengalokasikan lagi memory selebar 32-bit untuk menampung data ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),", melainkan menggunakan alamat memory data ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," sebagai reference, menjadikannya sebagai alamat tujuan variabel pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),"."),(0,r.kt)("p",null,"Ok, lanjut. Per sekarang, reference variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two")," adalah sama. Dengan ini, jika dicontohkan isi data satu variabel diubah, maka variabel lainnya juga akan berubah, hal karena reference-nya adalah sama."),(0,r.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,r.kt)("p",null,"Contoh penerapannya bisa kita lihat pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/pointer-references#a315-karakteristik-pointer--reference"},"Pointer & References")," ini, di situ bisa dilihat ada variabel mutable ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," yang reference-nya adalah sama dengan variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Ketika underlying value ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," diubah (dari ",(0,r.kt)("inlineCode",{parentName:"p"},"24")," ke ",(0,r.kt)("inlineCode",{parentName:"p"},"12"),"), isi data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," juga berubah."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(5127).Z,width:"488",height:"417"})),(0,r.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,r.kt)("p",null,"Agar makin familiar dengan cara penerapan pointer & reference, silakan lanjut dengan praktik program berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'# ...\n\n[dependencies]\nrand = "0.8.5"\n')),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'},'use rand::Rng;\n\nfn main() {\n let mut number = 24;\n println!("number: {}", number);\n\n for _ in 0..=5 {\n change_value(&mut number);\n println!("number: {}", number);\n }\n}\n\nfn change_value(n: &mut i32) {\n *n = generate_random_number()\n}\n\nfn generate_random_number() -> i32 {\n rand::thread_rng().gen_range(0..100)\n}\n')),(0,r.kt)("p",null,"Pada sederhana di atas, ada sebuah variable mutable bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," yang dideklarasikan. Variabel tersebut kemudian diakses ",(0,r.kt)("em",{parentName:"p"},"mutable reference"),"-nya untuk dijadikan argumen statement pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"change_value"),"."),(0,r.kt)("p",null,"Di dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"change_value"),", disiapkan 1 buah angka random hasil pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"generate_random_number"),", yang angka tersebut kemudian dijadikan sebagai nilai baru variable mutable reference yang mengarah ke ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Perubahan dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"change_value")," akan mempengaruhi data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),", karena reference-nya adalah sama."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(3319).Z,width:"457",height:"204"})),(0,r.kt)("h2",{id:"a337-reference--borrowing"},"A.33.7. Reference & borrowing"),(0,r.kt)("p",null,"Di Rust, reference (atau pengaksesan alamat memory suatu data) memiliki hubungan yang sangat erat dengan konsep ",(0,r.kt)("strong",{parentName:"p"},"borrowing"),"."),(0,r.kt)("p",null,"Ketika kita mengambil reference suatu data, yang terjadi sebenarnya adalah kita meminjam data tersebut dari owner/pemilik sebenarnya."),(0,r.kt)("p",null,"Pada chapter ini kita tidak akan membahasnya lebih jauh lagi, karena akan ada chapter lain yang fokus mengulas topik tersebut secara detail, yaitu chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,r.kt)("p",null,"Untuk sekarang penulis anjurkan untuk lanjut ke chapter berikutnya secara urut."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/pointer_references"},"github.com/novalagung/dasarpemrogramanrust-example/../pointer_references")),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html"},"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/marker/trait.Copy.html"},"https://doc.rust-lang.org/std/marker/trait.Copy.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Reference_(computer_science)"},"https://en.wikipedia.org/wiki/Reference_(computer_science)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://progressivecoder.com/understanding-rust-ownership-and-borrowing-with-examples/"},"https://progressivecoder.com/understanding-rust-ownership-and-borrowing-with-examples/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://os.phil-opp.com/heap-allocation/"},"https://os.phil-opp.com/heap-allocation/"))))}d.isMDXComponent=!0},1007:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-1-f103aebf5517db2d9de53c1fe39be319.png"},6356:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-2-8fdb7f20f15717b7d97311d81ffe005d.png"},8992:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-3-7b60c4bdc0392eb962187ee76ac2ab54.png"},5127:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-4-ba178a14defb70eb04b45ce050af0e6e.png"},3319:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAADMCAIAAACX588hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDVUMTc6MDg6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI1OjI0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI1OjI0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdlZmZmODBiLTc4N2UtZDM0Ni1hZTBiLTNkYTE0MmY1ZDgxYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4YmRlNzdmZS04ZmVjLWEwNDgtYmQ2OC1jNGFhMjUzZWRkYTMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4YmRlNzdmZS04ZmVjLWEwNDgtYmQ2OC1jNGFhMjUzZWRkYTMiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjhiZGU3N2ZlLThmZWMtYTA0OC1iZDY4LWM0YWEyNTNlZGRhMzwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjhiZGU3N2ZlLThmZWMtYTA0OC1iZDY4LWM0YWEyNTNlZGRhMyIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0wNVQxNzowODoxNCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ZWZmZjgwYi03ODdlLWQzNDYtYWUwYi0zZGExNDJmNWQ4MWEiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MjU6MjQrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5CQC5bAAAVqUlEQVR42u2dO5LUSBeF/5VUgzf22IDbHuBgjNF4HbgEER2Bx0JYAqvAZ1E/LVVJ+Tg38+pZqervi4lgWpVSKh86ukqlTv7vBAAAa/M/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"}}]); \ No newline at end of file diff --git a/assets/js/0ae704f7.5940e697.js b/assets/js/0ae704f7.5940e697.js deleted file mode 100644 index 850fceca..00000000 --- a/assets/js/0ae704f7.5940e697.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[2089],{3905:(e,a,n)=>{n.d(a,{Zo:()=>o,kt:()=>k});var t=n(7294);function r(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function i(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a=0||(r[n]=e[n]);return r}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var m=t.createContext({}),u=function(e){var a=t.useContext(m),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},o=function(e){var a=u(e.components);return t.createElement(m.Provider,{value:a},e.children)},d={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},b=t.forwardRef((function(e,a){var n=e.components,r=e.mdxType,i=e.originalType,m=e.parentName,o=p(e,["components","mdxType","originalType","parentName"]),b=u(n),k=r,s=b["".concat(m,".").concat(k)]||b[k]||d[k]||i;return n?t.createElement(s,l(l({ref:a},o),{},{components:n})):t.createElement(s,l({ref:a},o))}));function k(e,a){var n=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var i=n.length,l=new Array(i);l[0]=b;var p={};for(var m in a)hasOwnProperty.call(a,m)&&(p[m]=a[m]);p.originalType=e,p.mdxType="string"==typeof e?e:r,l[1]=p;for(var u=2;u{n.r(a),n.d(a,{assets:()=>m,contentTitle:()=>l,default:()=>d,frontMatter:()=>i,metadata:()=>p,toc:()=>u});var t=n(7462),r=(n(7294),n(3905));const i={sidebar_position:33,title:"A.33. Pointer & References",sidebar_label:"A.33. Pointer & References"},l=void 0,p={unversionedId:"basic/pointer-references",id:"basic/pointer-references",title:"A.33. Pointer & References",description:"Chapter ini membahas tentang apa itu pointer, references, dan dereferences. Pembelajaran dimulai tentang konsep dan praktik dasar tentang ketiga topik tersebut, kemudian diikuti dengan pembahasan tentang karakteristik pointer & reference.",source:"@site/docs/basic/pointer-references.md",sourceDirName:"basic",slug:"/basic/pointer-references",permalink:"/basic/pointer-references",draft:!1,tags:[],version:"current",sidebarPosition:33,frontMatter:{sidebar_position:33,title:"A.33. Pointer & References",sidebar_label:"A.33. Pointer & References"},sidebar:"tutorialSidebar",previous:{title:"A.32. Basic Memory Management",permalink:"/basic/basic-memory-management"},next:{title:"A.34. Ownership",permalink:"/basic/ownership"}},m={},u=[{value:"A.33.1. Pointer",id:"a331-pointer",level:2},{value:"A.33.2. Reference (operator &)",id:"a332-reference-operator-",level:2},{value:"A.33.3. Dereference (operator *)",id:"a333-dereference-operator-",level:2},{value:"A.33.4. Mutable References (operator &mut)",id:"a334-mutable-references-operator-mut",level:2},{value:"A.33.5. Aturan Reference",id:"a335-aturan-reference",level:2},{value:"A.33.6. Karakteristik pointer & reference",id:"a336-karakteristik-pointer--reference",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"A.33.7. Reference & borrowing",id:"a337-reference--borrowing",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:u};function d(e){let{components:a,...i}=e;return(0,r.kt)("wrapper",(0,t.Z)({},o,i,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Chapter ini membahas tentang apa itu pointer, references, dan dereferences. Pembelajaran dimulai tentang konsep dan praktik dasar tentang ketiga topik tersebut, kemudian diikuti dengan pembahasan tentang karakteristik pointer & reference."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Penulis tekankan bahwa ",(0,r.kt)("strong",{parentName:"p"},"pada chapter ini, konsep reference yang dibahas adalah dalam konteks programming secara general.")," Tidak dari sudut pandang ownership.")),(0,r.kt)("p",null,"Reference pada Rust memiliki keunikan, tapi kita akan bahas itu secara terpisah pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),". Untuk sekarang silakan ikuti terlebih dahulu pembahasan chapter-per-chapter secara berurutan."),(0,r.kt)("h2",{id:"a331-pointer"},"A.33.1. Pointer"),(0,r.kt)("p",null,"Pointer artinya adalah alamat memori. Variabel pointer artinya adalah variabel yang berisi alamat memory (hanya alamat memory-nya saja, bukan value yang sebenarnya)."),(0,r.kt)("p",null,"Di Rust, variabel pointer ditandai dengan adanya karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"&")," pada tipe data. Sebagai contoh ",(0,r.kt)("inlineCode",{parentName:"p"},"&i32")," artinya adalah tipe data pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),". Contoh lain adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"&bool")," yang merupakan tipe data pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"bool"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Ada dua jenis tipe pointer di Rust programming, yaitu smart pointer dan raw pointer. Pada chapter ini kita tidak membahasnya karena termasuk topik yang cukup advance. Pembahasan akan ada pada chapter terpisah ",(0,r.kt)("a",{parentName:"p",href:"#/wip/smart-pointer-raw-pointer"},"Smart Pointer vs Raw Pointer"),".")),(0,r.kt)("h2",{id:"a332-reference-operator-"},"A.33.2. Reference (operator ",(0,r.kt)("inlineCode",{parentName:"h2"},"&"),")"),(0,r.kt)("p",null,"Ok, selanjutnya apa itu ",(0,r.kt)("em",{parentName:"p"},"reference"),"? Istilah ini sudah beberapa kali disinggung pada chapter sebelum-sebelumnya."),(0,r.kt)("p",null,"Reference artinya adalah pointer dari sebuah variabel atau data. Operasi pengambilan pointer dari variabel disebut dengan ",(0,r.kt)("em",{parentName:"p"},"referencing"),", caranya dilakukan dengan menggunakan karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"&"),"."),(0,r.kt)("p",null,"O iya, semua jenis variabel bisa diambil nilai pointernya. Contohnya bisa dilihat berikut ini:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let number: i32 = 24;\nprintln!("value: {:?}", number);\n\nlet pointer_number: &i32 = &number;\nprintln!("pointer: {:p}", pointer_number);\n')),(0,r.kt)("p",null,"Pada contoh di atas, sebuah variabel dideklarasikan bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," dengan tipe data adalah numerik dan value ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),". Variabel tersebut jika di-print akan muncul nilainya, yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),"."),(0,r.kt)("p",null,"Ada satu lagi variabel yang dideklarasikan yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number"),", yang nilainya adalah ",(0,r.kt)("em",{parentName:"p"},"reference")," dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Cara pengambilan reference yang dilihat pada contoh, yaitu dengan menambahkan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"&")," pada variabel yang ingin dimabil pointernya."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// variabel pointer_number nilainya adalah reference variabel number.\n// contoh statement:\nlet pointer_number_1 = &number;\nlet pointer_number_2: &i32 = &number;\n")),(0,r.kt)("p",null,"By default, ketika variabel pointer di print, yang muncul adalah ",(0,r.kt)("em",{parentName:"p"},"underlying value")," atau nilai sebenarnya, yang pada contoh di atas adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"24"),". Untuk menampilkan alamat memory gunakan formatted print ",(0,r.kt)("inlineCode",{parentName:"p"},"{:p}"),"."),(0,r.kt)("p",null,"Coba jalankan program kemudian lihat hasilnya. Value muncul sesuai dengan yang ditulis, sedangkan pointer memunculkan data alamat memory yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"0xa3bbeff6dc"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"pointer & reference",src:n(1007).Z,width:"494",height:"320"})),(0,r.kt)("p",null,"Seperti yang sudah dijelaskan di awal bahwa variabel pointer isinya adalah alamat memory. Penulisannya dalam notasi heksadesimal diawali dengan karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"0x"),". Contohnya adalah nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"0xa3bbeff6dc")," yang merupakan alamat memory, yang alamat tersebut adalah reference ke pemilik data sebenarnya (yaitu variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),")."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Di environment lokal masing-masing, alamat memory yang muncul sangat mungkin berbeda karena alokasi adalah random")),(0,r.kt)("h2",{id:"a333-dereference-operator-"},"A.33.3. Dereference (operator ",(0,r.kt)("inlineCode",{parentName:"h2"},"*"),")"),(0,r.kt)("p",null,"Kita sudah belajar cara mengambil data pointer dari sebuah variabel. Pada bagian ini kita belajar cara mengambil nilai sebenarnya atau underlying value dari sebuah pointer (istilahnya adalah ",(0,r.kt)("em",{parentName:"p"},"dereference"),")."),(0,r.kt)("p",null,"Cara melakukan operasi ",(0,r.kt)("em",{parentName:"p"},"dereferencing")," adalah dengan menambahkan karakter ",(0,r.kt)("inlineCode",{parentName:"p"},"*")," pada variabel pointer. Contohnya seperti berikut, silakan tambahkan kode ini ke program yang sudah ditulis."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'// variabel underlying_value nilainya adalah nilai sebenarnya dari pointer pointer_number\nlet underlying_value = *pointer_number;\nprintln!("value: {:}", underlying_value);\n')),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Dereference",src:n(6356).Z,width:"467",height:"412"})),(0,r.kt)("p",null,"Bisa dilihat, nilai dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"underlying_value")," adalah nilai sebenarnya dari pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number"),", yang pastinya adalah sama dengan nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),"."),(0,r.kt)("h2",{id:"a334-mutable-references-operator-mut"},"A.33.4. Mutable References (operator ",(0,r.kt)("inlineCode",{parentName:"h2"},"&mut"),")"),(0,r.kt)("p",null,"By default, reference sifatnya ",(0,r.kt)("em",{parentName:"p"},"read-only")," atau ",(0,r.kt)("em",{parentName:"p"},"immutable"),", artinya tidak bisa diubah ",(0,r.kt)("em",{parentName:"p"},"underlying-value"),"-nya."),(0,r.kt)("p",null,"Jika ada variabel (sebut saja X) yang merupakan underlying value dari reference variabel lain, maka perubahan value pada variabel X tersebut ",(0,r.kt)("em",{parentName:"p"},"default"),"-nya menghasilkan error."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let mut number = 24;\nprintln!("number: {}", number);\n\nlet pointer_number = &number;\nprintln!("pointer_number: {:p}", pointer_number);\n\n*pointer_number = 12;\n\nprintln!("*pointer_number: {}", *pointer_number);\nprintln!("number: {}", number);\n')),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(8992).Z,width:"715",height:"343"})),(0,r.kt)("p",null,"Pada gambar di atas bisa dilihat, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," merupakan reference dari variabel mutable ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Setelahnya ada statement ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number = 12"),", yang artinya adalah underlying value dari variabel pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," diakses kemudian di-isi nilainya dengan angka ",(0,r.kt)("inlineCode",{parentName:"p"},"12"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number = 12")," tidak menghasilkan error, dan statement ini berbeda dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number = 12"),"."),(0,r.kt)("p",{parentName:"blockquote"},"Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number = 12")," menghasilkan error karena ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," adalah variabel bertipe ",(0,r.kt)("strong",{parentName:"p"},"pointer ",(0,r.kt)("inlineCode",{parentName:"strong"},"i32")," atau ",(0,r.kt)("inlineCode",{parentName:"strong"},"&i32")," (bukan ",(0,r.kt)("inlineCode",{parentName:"strong"},"i32"),")"),". Jika ingin mengubah nilainya perlu mengakses dulu underlying value-nya menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number"),".")),(0,r.kt)("p",null,"Ok, lalu kenapa muncul error? Di gambar terlihat ada garis merah dan popup pesan error muncul, padahal tidak ada yang salah dengan statement-nya."),(0,r.kt)("p",null,"Penyebab erronya bukan dari statement tersebut, tetapi pada baris statement pengambilan reference variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"&number")," artinya adalah mengambil reference dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Di atas sempat kita bahas bahwa ",(0,r.kt)("em",{parentName:"p"},"by default")," sebuah reference tidak bisa diubah nilainya (",(0,r.kt)("em",{parentName:"p"},"immutable"),"), dan ini adalah penyebab error yang dialami."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Silakan perhatikan pesan di popup error message agar mudah untuk tau dimana sumber masalahnya.")),(0,r.kt)("p",null,"Perubahan isi nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," tidak menghasilkan error, hal ini karena number adalah variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," adalah mutable. Sedangkan operasi perubahan nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"*pointer_number")," pada contoh di atas, dianggap sebagai error karena variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," reference-nya adalah bukan mutable (meskipun reference diperoleh dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," yang notabene mutable)."),(0,r.kt)("p",null,"Solusi dari error di atas adalah menerapkan ",(0,r.kt)("strong",{parentName:"p"},"mutable reference"),". Mutable reference sama seperti reference biasa tetapi nilainya diperbolehkan untuk diubah (mutable). Caranya pengaksesan mutable reference dilakukan menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"&mut"),"."),(0,r.kt)("p",null,"Ok, sekarang ubah statement berikut ini, lalu jalankan program:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// before\nlet pointer_number = &number;\n\n// after\nlet pointer_number = &mut number;\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(5127).Z,width:"488",height:"417"})),(0,r.kt)("p",null,"Deklarasi variable pointer yang menampung mutable reference bisa via metode penulisan ",(0,r.kt)("em",{parentName:"p"},"manifest typing")," atau ",(0,r.kt)("em",{parentName:"p"},"type inference"),". Pada contoh berikut, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," tipe data-nya adalah mutable reference ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", maka penulisan tipe data adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"&mut i32"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"// type inference\nlet pointer_number = &mut number;\n\n// manifest typing\nlet pointer_number: &mut i32 = &mut number;\n")),(0,r.kt)("p",null,"Pada contoh ini kita menggunakan tipe data primitif, lalu bagaimana dengan tipe data non-primitive seperti custom type struct atau ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),", apakah penerapan mutable reference juga sama? Jawabannya tidak. Ada beberapa perbedaan dan nantinya kita akan bahas secara detail pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),". Untuk sekarang, dianjurkan mengikuti pembahasan chapter per chapter secara urut."),(0,r.kt)("h2",{id:"a335-aturan-reference"},"A.33.5. Aturan Reference"),(0,r.kt)("p",null,"Ada dua aturan penting yang harus dipatuhi dalam penerapan reference baik mutable atau immutable reference."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Dalam waktu yang sama, hanya boleh ada satu mutable reference atau banyak immutable reference (keduanya tidak bisa bersamaan, harus salah satu)."),(0,r.kt)("li",{parentName:"ul"},"Reference harus selalu valid.")),(0,r.kt)("p",null,"Mengenai penjelasan tentang dua aturan penting di atas akan bahas pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,r.kt)("h2",{id:"a336-karakteristik-pointer--reference"},"A.33.6. Karakteristik pointer & reference"),(0,r.kt)("p",null,"Kita sudah belajar tentang definisi beserta cara penerapan pointer, reference, dereference, dan mutable reference. Sekarang lanjut ke pembahasan tentang karakteristik dari pointer & reference."),(0,r.kt)("p",null,"Pointer merupakan variabel yang isinya adalah alamat memory (bukan nilai sebenarnya). Dan reference adalah alamat memory suatu data/variabel. Dengan menerapkan keduanya kita bisa menerapkan efisiensi penggunaan memory yang dampaknya sangat positif terhadap performa program."),(0,r.kt)("p",null,"Sekarang perhatikan statement berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let number_one = 24;\nlet number_two = number_one;\n")),(0,r.kt)("p",null,"Variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," adalah data numerik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"i32"),", eksekusi statement tersebut menghasilkan alokasi memori selebar 32-bit."),(0,r.kt)("p",null,"Kemudian ada lagi statement ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),". Meskipun nilainya didapat dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one"),", yang terjadi di balik layar adalah Rust akan mengalokasikan lagi alamat memory selebar 32-bit untuk menampung data ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two")," yang didapat dari hasil operasi ",(0,r.kt)("strong",{parentName:"p"},"copy")," dari variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Semua variabel primitif di Rust mengadopsi ",(0,r.kt)("em",{parentName:"p"},"copy semantics"),", yang artinya jika variabel tersebut digunakan dalam statement assignment, maka nilai akan di-duplikasi untuk kemudian ditampung pada variabel baru."),(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ",(0,r.kt)("em",{parentName:"p"},"copy semantics")," dibahas pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/ownership#a334-copy-semantics-vs-move-semantics"},"Ownership"),".")),(0,r.kt)("p",null,"Selanjutnya, bandingkan dengan statement berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"let number_one = 24;\nlet number_two = &number_one;\n")),(0,r.kt)("p",null,"Pada contoh di atas, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," datanya disimpan di memory dengan lebar 32-bit (masih sama seperti contoh sebelumnya). Namun ada yang berbeda dengan dengan variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),", variabel ini adalah variabel pointer yang nilainya reference ke alamat memory data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one"),". Yang terjadi di belakang layar, Rust tidak mengalokasikan lagi memory selebar 32-bit untuk menampung data ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),", melainkan menggunakan alamat memory data ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," sebagai reference, menjadikannya sebagai alamat tujuan variabel pointer ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two"),"."),(0,r.kt)("p",null,"Ok, lanjut. Per sekarang, reference variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number_one")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"number_two")," adalah sama. Dengan ini, jika dicontohkan isi data satu variabel diubah, maka variabel lainnya juga akan berubah, hal karena reference-nya adalah sama."),(0,r.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,r.kt)("p",null,"Contoh penerapannya bisa kita lihat pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/pointer-references#a315-karakteristik-pointer--reference"},"Pointer & References")," chapter ini, disitu bisa dilihat ada variabel mutable ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," dan ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," yang reference-nya adalah sama dengan variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Ketika underlying value ",(0,r.kt)("inlineCode",{parentName:"p"},"pointer_number")," diubah (dari ",(0,r.kt)("inlineCode",{parentName:"p"},"24")," ke ",(0,r.kt)("inlineCode",{parentName:"p"},"12"),"), isi data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," juga berubah."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(5127).Z,width:"488",height:"417"})),(0,r.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,r.kt)("p",null,"Agar makin familiar dengan cara penerapan pointer & reference, silakan lanjut dengan praktik program berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'# ...\n\n[dependencies]\nrand = "0.8.5"\n')),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'},'use rand::Rng;\n\nfn main() {\n let mut number = 24;\n println!("number: {}", number);\n\n for _ in 0..=5 {\n change_value(&mut number);\n println!("number: {}", number);\n }\n}\n\nfn change_value(n: &mut i32) {\n *n = generate_random_number()\n}\n\nfn generate_random_number() -> i32 {\n rand::thread_rng().gen_range(0..100)\n}\n')),(0,r.kt)("p",null,"Pada sederhana di atas, ada sebuah variable mutable bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," yang dideklarasikan. Variabel tersebut kemudian diakses ",(0,r.kt)("em",{parentName:"p"},"mutable reference"),"-nya untuk dijadikan argumen statement pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"change_value"),"."),(0,r.kt)("p",null,"Di dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"change_value"),", disiapkan 1 buah angka random hasil pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"generate_random_number"),", yang angka tersebut kemudian dijadikan sebagai nilai baru variable mutable reference yang mengarah ke ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),". Perubahan dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"change_value")," akan mempengaruhi data variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),", karena reference-nya adalah sama."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Pointer & reference",src:n(3319).Z,width:"457",height:"204"})),(0,r.kt)("h2",{id:"a337-reference--borrowing"},"A.33.7. Reference & borrowing"),(0,r.kt)("p",null,"Di Rust, reference (atau pengaksesan alamat memory suatu data) memiliki hubungan yang sangat erat dengan konsep ",(0,r.kt)("strong",{parentName:"p"},"borrowing"),"."),(0,r.kt)("p",null,"Ketika kita mengambil reference suatu data, yang terjadi sebenarnya adalah kita meminjam data tersebut dari owner/pemilik sebenarnya."),(0,r.kt)("p",null,"Pada chapter ini kita tidak akan membahasnya lebih jauh lagi, karena akan ada chapter lain yang fokus mengulas topik tersebut secara detail, yaitu chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,r.kt)("p",null,"Untuk sekarang penulis anjurkan untuk lanjut ke chapter berikutnya secara urut."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/pointer_references"},"github.com/novalagung/dasarpemrogramanrust-example/../pointer_references")),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html"},"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/marker/trait.Copy.html"},"https://doc.rust-lang.org/std/marker/trait.Copy.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Reference_(computer_science)"},"https://en.wikipedia.org/wiki/Reference_(computer_science)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://progressivecoder.com/understanding-rust-ownership-and-borrowing-with-examples/"},"https://progressivecoder.com/understanding-rust-ownership-and-borrowing-with-examples/")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://os.phil-opp.com/heap-allocation/"},"https://os.phil-opp.com/heap-allocation/"))))}d.isMDXComponent=!0},1007:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-1-f103aebf5517db2d9de53c1fe39be319.png"},6356:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-2-8fdb7f20f15717b7d97311d81ffe005d.png"},8992:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-3-7b60c4bdc0392eb962187ee76ac2ab54.png"},5127:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/pointer-references-4-ba178a14defb70eb04b45ce050af0e6e.png"},3319:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAADMCAIAAACX588hAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDVUMTc6MDg6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI1OjI0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI1OjI0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdlZmZmODBiLTc4N2UtZDM0Ni1hZTBiLTNkYTE0MmY1ZDgxYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo4YmRlNzdmZS04ZmVjLWEwNDgtYmQ2OC1jNGFhMjUzZWRkYTMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo4YmRlNzdmZS04ZmVjLWEwNDgtYmQ2OC1jNGFhMjUzZWRkYTMiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjhiZGU3N2ZlLThmZWMtYTA0OC1iZDY4LWM0YWEyNTNlZGRhMzwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjhiZGU3N2ZlLThmZWMtYTA0OC1iZDY4LWM0YWEyNTNlZGRhMyIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0wNVQxNzowODoxNCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3ZWZmZjgwYi03ODdlLWQzNDYtYWUwYi0zZGExNDJmNWQ4MWEiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MjU6MjQrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5CQC5bAAAVqUlEQVR42u2dO5LUSBeF/5VUgzf22IDbHuBgjNF4HbgEER2Bx0JYAqvAZ1E/LVVJ+Tg38+pZqervi4lgWpVSKh86ukqlTv7vBAAAa/M/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"}}]); \ No newline at end of file diff --git a/assets/js/3aa512bf.35e7bf91.js b/assets/js/3aa512bf.35e7bf91.js new file mode 100644 index 00000000..14d7ec3c --- /dev/null +++ b/assets/js/3aa512bf.35e7bf91.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7386],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>o});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var d=i.createContext({}),u=function(a){var e=i.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},m=function(a){var e=u(a.components);return i.createElement(d.Provider,{value:e},a.children)},p={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},s=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,d=a.parentName,m=A(a,["components","mdxType","originalType","parentName"]),s=u(n),o=t,k=s["".concat(d,".").concat(o)]||s[o]||p[o]||l;return n?i.createElement(k,r(r({ref:e},m),{},{components:n})):i.createElement(k,r({ref:e},m))}));function o(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=s;var A={};for(var d in e)hasOwnProperty.call(e,d)&&(A[d]=e[d]);A.originalType=a,A.mdxType="string"==typeof a?a:t,r[1]=A;for(var u=2;u{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>A,toc:()=>u});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:21,title:"A.21. Module System \u279c Inline Module",sidebar_label:"A.21. Module System \u279c Inline Module"},r=void 0,A={unversionedId:"basic/module-inline",id:"basic/module-inline",title:"A.21. Module System \u279c Inline Module",description:"Pada chapter sebelumnya kita telah belajar cara manajemen module. Pembahasan tersebut dilanjut pada chapter ini, yaitu tentang inline module.",source:"@site/docs/basic/module-inline.md",sourceDirName:"basic",slug:"/basic/module-inline",permalink:"/basic/module-inline",draft:!1,tags:[],version:"current",sidebarPosition:21,frontMatter:{sidebar_position:21,title:"A.21. Module System \u279c Inline Module",sidebar_label:"A.21. Module System \u279c Inline Module"},sidebar:"tutorialSidebar",previous:{title:"A.20. Module System \u279c Module",permalink:"/basic/module-basic"},next:{title:"A.22. Module System \u279c Scope & Akses Item",permalink:"/basic/module-scope-item-access"}},d={},u=[{value:"A.21.1. Inline Module",id:"a211-inline-module",level:2},{value:"A.21.2. Praktik inline module",id:"a212-praktik-inline-module",level:2},{value:"A.21.3. Inline module item",id:"a213-inline-module-item",level:2},{value:"A.21.4. Inline module file nama_module.rs atau nama_module/mod.rs",id:"a214-inline-module-file-nama_modulers-atau-nama_modulemodrs",level:2},{value:"A.21.5. Inline module path attribute",id:"a215-inline-module-path-attribute",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:u};function p(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},m,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Pada chapter sebelumnya kita telah belajar cara manajemen module. Pembahasan tersebut dilanjut pada chapter ini, yaitu tentang inline module."),(0,t.kt)("h2",{id:"a211-inline-module"},"A.21.1. Inline Module"),(0,t.kt)("p",null,"Inline module adalah cara lain dalam pendefinisian module beserta item-nya, caranya dengan tetap menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mod")," hanya saja isi/item ditulis di dalam blok kode keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mod")," tersebut. Agar lebih jelas silakan lihat penerapan inline module berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"mod module_a {\n\n pub fn fungsi_satu() {\n // ...\n }\n\n pub mod submodule_b {\n\n pub const PI: u32 = 3.14;\n\n pub fn fungsi_dua() {\n // ...\n }\n }\n}\n")),(0,t.kt)("p",null,"Inline module cukup mudah diterapkan, yang sebelumnya module dan submodule di-manage dengan mengacu ke penamaan file, dalam inline module cukup tulis saja sebagai blok kode definisi module."),(0,t.kt)("p",null,"Pada contoh di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"module_a")," memiliki beberapa item:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Item berupa fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::fungsi_satu")),(0,t.kt)("li",{parentName:"ul"},"Item berupa submodule ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::submodule_b")),(0,t.kt)("li",{parentName:"ul"},"Item berupa konstanta ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::submodule_b::PI")),(0,t.kt)("li",{parentName:"ul"},"Item berupa fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::submodule_b::fungsi_dua"))),(0,t.kt)("p",null,"Aturan definisi submodule dan item pada inline module masih sama seperti pada ",(0,t.kt)("em",{parentName:"p"},"normal module"),", salah satunya adalah agar item bisa diakses dari luar module maka perlu menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),"."),(0,t.kt)("h2",{id:"a212-praktik-inline-module"},"A.21.2. Praktik inline module"),(0,t.kt)("p",null,"Mari lanjut proses pembalajaran dengan praktik. Kita akan buat program sederhana yang di dalamnya ada proses generate random string, yang kemudian di-hash."),(0,t.kt)("p",null,"Silakan buat package baru menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"cargo new"),". Penulis di sini memilih nama ",(0,t.kt)("inlineCode",{parentName:"p"},"inline_module_1")," sebagai nama package. Setelah itu, siapkan fungsi main dan juga module bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," dengan penulisan kode menerapkan inline module. O iya, tulis keduanya (",(0,t.kt)("inlineCode",{parentName:"p"},"module utilities")," dan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),") dalam satu file yang sama yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod utilities {\n\n pub mod random {\n\n pub fn string(length: u32) -> String {\n // ... isi fungsi string milik module utilities::random\n }\n }\n\n pub mod password {\n\n pub fn hash(text: &str) -> String {\n // ... isi fungsi hash milik module utilities::password\n }\n\n pub fn is_valid(plain: &str, hashed: &str) -> bool {\n // ... isi fungsi is_valid milik module utilities::password\n }\n }\n}\n\nfn main() {\n // ... isi fungsi main\n}\n")),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::random::string")," adalah fungsi nantinya digunakan untuk generate data random string"),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::hash")," adalah fungsi untuk melakukan proses hashing password menggunakan ",(0,t.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Bcrypt"},"bcrypt")),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::is_valid")," adalah fungsi untuk pengecekan apakah password sama dengan data setelah di-hash")),(0,t.kt)("p",null,"Ketiga fungsi tersebut kemudian diterapkan pada program kecil yang logic-nya ditulis dalam fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, semua item dan sub-item milik ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," didefinisikan public menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," agar bisa diakses dari module."),(0,t.kt)("p",{parentName:"blockquote"},"Sedangkan module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," sendiri tidak wajib di-expose menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", karena definisi module-nya berada dalam satu file yang sama dengan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", yaitu file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,t.kt)("p",null,"Sebelum lanjut proses koding, silakan tambahkan dulu beberapa dependencies berikut pada ",(0,t.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),", kemudian jalankan ",(0,t.kt)("inlineCode",{parentName:"p"},"cargo build")," di-download."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'[package]\nname = "module_inline_1"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nbcrypt = "0.13"\nrand = "0.8.5"\n')),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Package ",(0,t.kt)("a",{parentName:"li",href:"https://crates.io/keywords/bcrypt"},(0,t.kt)("inlineCode",{parentName:"a"},"bcrypt"))," adalah crate yang isinya banyak fungsi untuk kebutuhan enkripsi bcrypt"),(0,t.kt)("li",{parentName:"ul"},"Package ",(0,t.kt)("a",{parentName:"li",href:"https://crates.io/keywords/rand"},(0,t.kt)("inlineCode",{parentName:"a"},"rand"))," berisi item untuk keperluan generate data random. Kita sudah beberapa kali menggunakan crate ini.")),(0,t.kt)("p",null,"Ok, sekarang kembali ke source code. Tulis isi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::random::string")," berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod utilities {\n\n pub mod random {\n\n pub fn string(length: u32) -> String {\n use rand::Rng;\n \n const CHARSET: &[u8] = "abcdefghijklmnopqrstuvwxyz".as_bytes();\n let mut arr = Vec::new();\n for _ in 0..=length {\n let n = rand::thread_rng().gen_range(0..(CHARSET.len()));\n let char = CHARSET[n];\n arr.push(char);\n }\n\n std::str::from_utf8(&arr[..]).unwrap().to_string()\n }\n }\n\n // ...\n}\n')),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Di atas adalah salah satu contoh penerapan generate random string dengan lebar ",(0,t.kt)("em",{parentName:"p"},"parameterized"),"."),(0,t.kt)("p",{parentName:"blockquote"},"Cara tersebut sebenarnya bukan yang paling efisien, namun karena jumlah topik yang kita pelajari masih belum terlalu banyak, penulis menghindari penerapan beberapa hal yang sifatnya baru dan bikin tambah bingung.")),(0,t.kt)("p",null,"Lanjut, silakan tulis kode untuk hashing password dan juga untuk validasi password berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod utilities {\n\n // ...\n\n pub mod password {\n\n pub fn hash(text: &str) -> String {\n let result = bcrypt::hash(text, bcrypt::DEFAULT_COST).unwrap();\n result\n }\n\n pub fn is_valid(plain: &str, hashed: &str) -> bool {\n let valid = bcrypt::verify(plain, hashed).unwrap();\n valid\n }\n }\n}\n")),(0,t.kt)("p",null,"Dalam enkripsi menggunakan bcrypt ada dua hal yang penting diketahui, yang pertama adalah data yang akan di-hash (pada contoh di atas adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"text"),"), dan ",(0,t.kt)("em",{parentName:"p"},"cost")," atau biaya enkripsi dalam bentuk numerik. Pada praktik ini, ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::DEFAULT_COST")," digunakan sebagai cost enkripsi."),(0,t.kt)("p",null,"Pengecekan apakah data terenkripsi adalah sama dengan data asli dilakukan menggunakan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::verify"),"."),(0,t.kt)("p",null,"Kedua fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::hash")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::verify")," menghasilkan data bertipe ",(0,t.kt)("em",{parentName:"p"},"generic result type")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"Result"),". Tipe ini memiliki method bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"unwrap")," yang berguna untuk pengambilan result atau nilai."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang result type dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,t.kt)("p",null,"Oke, sekarang fungsi utility sudah siap, mari implementasikan semua fungsi tersebut pada ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("p",null,"Silakan tulis kode berikut. Sebuah variabel bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"password")," dibuat, diisi dengan kombinasi dari string dan juga random string. Lalu data password tersebut di-hash kemudian dicek nilainya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'fn main() {\n let password = format!("zereth mortis {}", utilities::random::string(10));\n println!("raw password: {}", password);\n\n let hashed = utilities::password::hash(&password);\n println!("hashed password: {}", hashed);\n\n let is_valid = utilities::password::is_valid(&password, &hashed);\n println!("is password matched? {}", is_valid);\n}\n')),(0,t.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(9632).Z,width:"605",height:"125"})),(0,t.kt)("p",null,"Statement ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::random::string(10)")," menghasilkan random string dengan lebar ",(0,t.kt)("inlineCode",{parentName:"p"},"10"),", sesuai kebutuhan. Hasil dari pemanggilan fungsi tersebut di-concat dengan text kemudian ditampung variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"password"),"."),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"password")," kemudian di-hash menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::password::hash"),", kemudian dibandingkan hasil hash-nya apakah cocok dengan text aslinya menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::password::is_valid"),"."),(0,t.kt)("h2",{id:"a213-inline-module-item"},"A.21.3. Inline module item"),(0,t.kt)("p",null,"Module item dalam inline module masih sama seperti pada module normal, yaitu adalah apapun yang didefinisikan di dalam sebuah module. Bisa berupa fungsi, konstanta, submodule, dan lainnya. Pada contoh di atas ada beberapa item didefinisikan:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::random")," yang merupakan sebuah submodule (inline module)."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::random::string")," yang merupakan sebuah fungsi."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password")," yang merupakan sebuah submodule (inline module)."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::hash")," yang merupakan sebuah fungsi."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::is_valid")," yang merupakan sebuah fungsi.")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang macam-macam item dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/path-item"},"Module System \u279c Path & Item"))),(0,t.kt)("h2",{id:"a214-inline-module-file-nama_modulers-atau-nama_modulemodrs"},"A.21.4. Inline module file ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module/mod.rs")),(0,t.kt)("p",null,"Dalam ",(0,t.kt)("em",{parentName:"p"},"real project")," hampir tidak mungkin semua kode ditulis di file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),". Pastinya kode akan di-split menjadi banyak module sesuai kebutuhan."),(0,t.kt)("p",null,"Kode sebelumya, akan kita refactor. Module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," yang berada di ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," perlu dipindah ke file baru yang sesuai dengan aturan penulisan module, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs"),". Di sini penulis memilih ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs"),", jadi silakan buat file bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities.rs"),", lalu pindah isi itemnya kesana (statement definisi inline module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," tidak perlu ikut dipindah, hanya isinya saja, seperti normalnya definisi module)."),(0,t.kt)("p",null,"O iya, jangan lupa untuk menambahkan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"mod utilities")," pada ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),", agar module terdaftar dan bisa digunakan."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(3009).Z,width:"775",height:"963"})),(0,t.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,t.kt)("p",null,"Pada contoh ke-2 ini modul ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," didefinisikan menggunakan cara biasa, sedang isi dari module tersebut didefinisikan menggunakan teknik inline module."),(0,t.kt)("h2",{id:"a215-inline-module-path-attribute"},"A.21.5. Inline module ",(0,t.kt)("inlineCode",{parentName:"h2"},"path")," attribute"),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute bisa digunakan dalam manajemen inline module. Silakan utak-atik kode yang sudah dibuat dengan mengikuti step berikut:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},(0,t.kt)("p",{parentName:"li"},"Buat file baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/password.rs"),", kemudian pindah isi definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"password")," ke file tersebut.")),(0,t.kt)("li",{parentName:"ol"},(0,t.kt)("p",{parentName:"li"},"Buat file baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs"),", kemudian pindah isi definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"random")," ke file tersebut.")),(0,t.kt)("li",{parentName:"ol"},(0,t.kt)("p",{parentName:"li"},"Hapus file ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities.rs"),", pindah definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," ke file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),", hasilnya kurang lebih seperti ini:"),(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod utilities {\n #[path = "random.rs"]\n pub mod random;\n\n #[path = "password.rs"]\n pub mod password;\n}\n\nfn main() {\n // ...\n}\n')))),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(6633).Z,width:"920",height:"954"})),(0,t.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,t.kt)("p",null,"Pada kode di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," yang digunakan bukan ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs")," melainkan ",(0,t.kt)("inlineCode",{parentName:"p"},"random.rs"),", hail ini dikarenakan ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute dipanggil ",(0,t.kt)("strong",{parentName:"p"},"di dalam module ",(0,t.kt)("inlineCode",{parentName:"strong"},"utilities")),", menjadikan current path pada blok kode tersebut menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/"),"."),(0,t.kt)("p",null,"Silakan coba ubah isi ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs"),", hasilnya adalah error. Rust akan menggunakan gabungan dari current path (",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/"),") dan path pada ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute (",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs"),") dalam lookup, jadinya yang di-lookup adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/utilities/random.rs"),", dan hasilnya error karena tidak ada file di sana."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(1081).Z,width:"772",height:"188"})),(0,t.kt)("p",null,"Module system di Rust merupakan topik yang cukup membingungkan (menurut penulis) karena desain-nya yang cukup unik jika dibandingkan dengan bagaimana bahasa pemrograman lain mengelola module-nya. Penulis anjurkan untuk mencoba praktik membuat program lainnya yang menerapkan module system, agar cepat terbiasa."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/module_inline"},"github.com/novalagung/dasarpemrogramanrust-example/../module_inline")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html"},"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.mod.html"},"https://doc.rust-lang.org/std/keyword.mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/mod.html"},"https://doc.rust-lang.org/rust-by-example/mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"},"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"))))}p.isMDXComponent=!0},9632:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAl0AAAB9CAIAAAAX00FjAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTlUMTg6MDI6MjYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTE5VDE5OjE3OjEyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTE5VDE5OjE3OjEyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2NGQ1ZmI5LTQ5Njct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"},3009:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/module-inline-2-c6d08bd6d0d03ddba99457fd3c0bdc5d.png"},6633:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/module-inline-3-9234cea75bd46ea1eea49d0320315320.png"},1081:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwQAAAC8CAIAAABJ6P4wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTlUMTk6MzA6NDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjE1OjEyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjE1OjEyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNlMDMxODFiLTU2OTgt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"}}]); \ No newline at end of file diff --git a/assets/js/3aa512bf.a1c7a02b.js b/assets/js/3aa512bf.a1c7a02b.js deleted file mode 100644 index f74c9470..00000000 --- a/assets/js/3aa512bf.a1c7a02b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7386],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>o});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var d=i.createContext({}),u=function(a){var e=i.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},m=function(a){var e=u(a.components);return i.createElement(d.Provider,{value:e},a.children)},p={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},s=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,d=a.parentName,m=A(a,["components","mdxType","originalType","parentName"]),s=u(n),o=t,k=s["".concat(d,".").concat(o)]||s[o]||p[o]||l;return n?i.createElement(k,r(r({ref:e},m),{},{components:n})):i.createElement(k,r({ref:e},m))}));function o(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=s;var A={};for(var d in e)hasOwnProperty.call(e,d)&&(A[d]=e[d]);A.originalType=a,A.mdxType="string"==typeof a?a:t,r[1]=A;for(var u=2;u{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>p,frontMatter:()=>l,metadata:()=>A,toc:()=>u});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:21,title:"A.21. Module System \u279c Inline Module",sidebar_label:"A.21. Module System \u279c Inline Module"},r=void 0,A={unversionedId:"basic/module-inline",id:"basic/module-inline",title:"A.21. Module System \u279c Inline Module",description:"Pada chapter sebelumnya kita telah belajar cara manajemen module. Pembahasan tersebut dilanjut pada chapter ini, yaitu tentang inline module.",source:"@site/docs/basic/module-inline.md",sourceDirName:"basic",slug:"/basic/module-inline",permalink:"/basic/module-inline",draft:!1,tags:[],version:"current",sidebarPosition:21,frontMatter:{sidebar_position:21,title:"A.21. Module System \u279c Inline Module",sidebar_label:"A.21. Module System \u279c Inline Module"},sidebar:"tutorialSidebar",previous:{title:"A.20. Module System \u279c Module",permalink:"/basic/module-basic"},next:{title:"A.22. Module System \u279c Scope & Akses Item",permalink:"/basic/module-scope-item-access"}},d={},u=[{value:"A.21.1. Inline Module",id:"a211-inline-module",level:2},{value:"A.21.2. Praktik inline module",id:"a212-praktik-inline-module",level:2},{value:"A.21.3. Inline module item",id:"a213-inline-module-item",level:2},{value:"A.21.4. Inline module file nama_module.rs atau nama_module/mod.rs",id:"a214-inline-module-file-nama_modulers-atau-nama_modulemodrs",level:2},{value:"A.21.5. Inline module path attribute",id:"a215-inline-module-path-attribute",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:u};function p(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},m,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Pada chapter sebelumnya kita telah belajar cara manajemen module. Pembahasan tersebut dilanjut pada chapter ini, yaitu tentang inline module."),(0,t.kt)("h2",{id:"a211-inline-module"},"A.21.1. Inline Module"),(0,t.kt)("p",null,"Inline module adalah cara lain dalam pendefinisian module beserta item-nya, caranya dengan tetap menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mod")," hanya saja isi/item ditulis di dalam blok kode keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mod")," tersebut. Agar lebih jelas silakan lihat penerapan inline module berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"mod module_a {\n\n pub fn fungsi_satu() {\n // ...\n }\n\n pub mod submodule_b {\n\n pub const PI: u32 = 3.14;\n\n pub fn fungsi_dua() {\n // ...\n }\n }\n}\n")),(0,t.kt)("p",null,"Inline module cukup mudah diterapkan, yang sebelumnya module dan submodule di-manage dengan mengacu ke penamaan file, dalam inline module cukup tulis saja sebagai blok kode definisi module."),(0,t.kt)("p",null,"Pada contoh di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"module_a")," memiliki beberapa item:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Item berupa fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::fungsi_satu")),(0,t.kt)("li",{parentName:"ul"},"Item berupa submodule ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::submodule_b")),(0,t.kt)("li",{parentName:"ul"},"Item berupa konstanta ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::submodule_b::PI")),(0,t.kt)("li",{parentName:"ul"},"Item berupa fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"module_a::submodule_b::fungsi_dua"))),(0,t.kt)("p",null,"Aturan definisi submodule dan item pada inline module masih sama seperti pada ",(0,t.kt)("em",{parentName:"p"},"normal module"),", salah satunya adalah agar item bisa diakses dari luar module maka perlu menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),"."),(0,t.kt)("h2",{id:"a212-praktik-inline-module"},"A.21.2. Praktik inline module"),(0,t.kt)("p",null,"Mari lanjut proses pembalajaran dengan praktik. Kita akan buat program sederhana yang di dalamnya ada proses generate random string, yang kemudian di-hash."),(0,t.kt)("p",null,"Silakan buat package baru menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"cargo new"),". Penulis di sini memilih nama ",(0,t.kt)("inlineCode",{parentName:"p"},"inline_module_1")," sebagai nama package. Setelah itu, siapkan fungsi main dan juga module bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," dengan penulisan kode menerapkan inline module. O iya, tulis keduanya (",(0,t.kt)("inlineCode",{parentName:"p"},"module utilities")," dan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),") dalam satu file yang sama yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod utilities {\n\n pub mod random {\n\n pub fn string(length: u32) -> String {\n // ... isi fungsi string milik module utilities::random\n }\n }\n\n pub mod password {\n\n pub fn hash(text: &str) -> String {\n // ... isi fungsi hash milik module utilities::password\n }\n\n pub fn is_valid(plain: &str, hashed: &str) -> bool {\n // ... isi fungsi is_valid milik module utilities::password\n }\n }\n}\n\nfn main() {\n // ... isi fungsi main\n}\n")),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::random::string")," adalah fungsi nantinya digunakan untuk generate data random string"),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::hash")," adalah fungsi untuk melakukan proses hashing password menggunakan ",(0,t.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Bcrypt"},"bcrypt")),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::is_valid")," adalah fungsi untuk pengecekan apakah password sama dengan data setelah di-hash")),(0,t.kt)("p",null,"Ketiga fungsi tersebut kemudian diterapkan pada program kecil yang logic-nya ditulis dalam fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, semua item dan sub-item milik ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," didefinisikan public menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," agar bisa diakses dari module."),(0,t.kt)("p",{parentName:"blockquote"},"Sedangkan module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," sendiri tidak wajib di-expose menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", karena definisi module-nya berada dalam satu file yang sama dengan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", yaitu file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,t.kt)("p",null,"Sebelum lanjut proses koding, silakan tambahkan dulu beberapa dependencies berikut pada ",(0,t.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),", kemudian jalankan ",(0,t.kt)("inlineCode",{parentName:"p"},"cargo build")," di-download."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'[package]\nname = "module_inline_1"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nbcrypt = "0.13"\nrand = "0.8.5"\n')),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Package ",(0,t.kt)("a",{parentName:"li",href:"https://crates.io/keywords/bcrypt"},(0,t.kt)("inlineCode",{parentName:"a"},"bcrypt"))," adalah crate yang isinya banyak fungsi untuk kebutuhan enkripsi bcrypt"),(0,t.kt)("li",{parentName:"ul"},"Package ",(0,t.kt)("a",{parentName:"li",href:"https://crates.io/keywords/rand"},(0,t.kt)("inlineCode",{parentName:"a"},"rand"))," berisi item untuk keperluan generate data random. Kita sudah beberapa kali menggunakan crate ini.")),(0,t.kt)("p",null,"Ok, sekarang kembali ke source code. Tulis isi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::random::string")," berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod utilities {\n\n pub mod random {\n\n pub fn string(length: u32) -> String {\n use rand::Rng;\n \n const CHARSET: &[u8] = "abcdefghijklmnopqrstuvwxyz".as_bytes();\n let mut arr = Vec::new();\n for _ in 0..=length {\n let n = rand::thread_rng().gen_range(0..(CHARSET.len()));\n let char = CHARSET[n];\n arr.push(char);\n }\n\n std::str::from_utf8(&arr[..]).unwrap().to_string()\n }\n }\n\n // ...\n}\n')),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Di atas adalah salah satu contoh penerapan generate random string dengan lebar ",(0,t.kt)("em",{parentName:"p"},"parameterized"),"."),(0,t.kt)("p",{parentName:"blockquote"},"Cara tersebut sebenarnya bukan yang paling efisien, namun karena jumlah topik yang kita pelajari masih belum terlalu banyak, penulis menghindari penerapan beberapa hal yang sifatnya baru dan bikin tambah bingung.")),(0,t.kt)("p",null,"Lanjut, silakan tulis kode untuk hashing password dan juga untuk validasi password berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod utilities {\n\n // ...\n\n pub mod password {\n\n pub fn hash(text: &str) -> String {\n let result = bcrypt::hash(text, bcrypt::DEFAULT_COST).unwrap();\n result\n }\n\n pub fn is_valid(plain: &str, hashed: &str) -> bool {\n let valid = bcrypt::verify(plain, hashed).unwrap();\n valid\n }\n }\n}\n")),(0,t.kt)("p",null,"Dalam enkripsi menggunakan bcrypt ada dua hal yang penting diketahui, yang pertama adalah data yang akan di-hash (pada contoh di atas adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"text"),"), dan ",(0,t.kt)("em",{parentName:"p"},"cost")," atau biaya enkripsi dalam bentuk numerik. Pada praktik ini, ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::DEFAULT_COST")," digunakan sebagai cost enkripsi."),(0,t.kt)("p",null,"Pengecekan apakah data terenkripsi adalah sama dengan data asli dilakukan menggunakan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::verify"),"."),(0,t.kt)("p",null,"Kedua fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::hash")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"bcrypt::verify")," menghasilkan data bertipe ",(0,t.kt)("em",{parentName:"p"},"generic result type")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"Result"),". Tipe ini memiliki method bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"unwrap")," yang berguna untuk pengambilan result atau nilai."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang result type dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,t.kt)("p",null,"Oke, sekarang fungsi utility sudah siap, mari implementasikan semua fungsi tersebut pada ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("p",null,"Silakan tulis kode berikut. Sebuah variabel bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"password")," dibuat, diisi dengan kombinasi dari string dan juga random string. Lalu data password tersebut di-hash kemudian dicek nilainya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'fn main() {\n let password = format!("zereth mortis {}", utilities::random::string(10));\n println!("raw password: {}", password);\n\n let hashed = utilities::password::hash(&password);\n println!("hashed password: {}", hashed);\n\n let is_valid = utilities::password::is_valid(&password, &hashed);\n println!("is password matched? {}", is_valid);\n}\n')),(0,t.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(9632).Z,width:"605",height:"125"})),(0,t.kt)("p",null,"Statement ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::random::string(10)")," menghasilkan random string dengan lebar ",(0,t.kt)("inlineCode",{parentName:"p"},"10"),", sesuai kebutuhan. Hasil dari pemanggilan fungsi tersebut di-concat dengan text kemudian ditampung variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"password"),"."),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"password")," kemudian di-hash menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::password::hash"),", kemudian dibandingkan hasil hash-nya apakah cocok dengan text aslinya menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities::password::is_valid"),"."),(0,t.kt)("h2",{id:"a213-inline-module-item"},"A.21.3. Inline module item"),(0,t.kt)("p",null,"Module item dalam inline module masih sama seperti pada module normal, yaitu adalah apapun yang didefinisikan di dalam sebuah module. Bisa berupa fungsi, konstanta, submodule, dan lainnya. Pada contoh di atas ada beberapa item didefinisikan:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::random")," yang merupakan sebuah submodule (inline module)."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::random::string")," yang merupakan sebuah fungsi."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password")," yang merupakan sebuah submodule (inline module)."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::hash")," yang merupakan sebuah fungsi."),(0,t.kt)("li",{parentName:"ul"},"Item ",(0,t.kt)("inlineCode",{parentName:"li"},"utilities::password::is_valid")," yang merupakan sebuah fungsi.")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang macam-macam item dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/path-item"},"Module System \u279c Path & Item"))),(0,t.kt)("h2",{id:"a214-inline-module-file-nama_modulers-atau-nama_modulemodrs"},"A.21.4. Inline module file ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module/mod.rs")),(0,t.kt)("p",null,"Dalam ",(0,t.kt)("em",{parentName:"p"},"real project")," hampir tidak mungkin semua kode ditulis di file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),". Pastinya kode akan di-split menjadi banyak module sesuai kebutuhan."),(0,t.kt)("p",null,"Kode sebelumya, akan kita refactor. Module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," yang berada di ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," perlu dipindah ke file baru yang sesuai dengan aturan penulisan module, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs"),". Di sini penulis memilih ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs"),", jadi silakan buat file bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities.rs"),", lalu pindah isi itemnya kesana (statement definisi inline module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," tidak perlu ikut dipindah, hanya isinya saja, seperti normalnya definisi module)."),(0,t.kt)("p",null,"O iya, jangan lupa untuk menambahkan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"mod utilities")," pada ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),", agar module terdaftar dan bisa digunakan."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(3009).Z,width:"775",height:"963"})),(0,t.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,t.kt)("p",null,"Pada contoh ke-2 ini modul ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," didefinisikan menggunakan cara biasa, sedang isi dari module tersebut didefinisikan menggunakan teknik inline module."),(0,t.kt)("h2",{id:"a215-inline-module-path-attribute"},"A.21.5. Inline module ",(0,t.kt)("inlineCode",{parentName:"h2"},"path")," attribute"),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute bisa digunakan dalam manajemen inline module. Silakan utak-atik kode yang sudah dibuat dengan mengikuti step berikut:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},(0,t.kt)("p",{parentName:"li"},"Buat file baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/password.rs"),", kemudian pindah isi definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"password")," ke file tersebut.")),(0,t.kt)("li",{parentName:"ol"},(0,t.kt)("p",{parentName:"li"},"Buat file baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs"),", kemudian pindah isi definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"random")," ke file tersebut.")),(0,t.kt)("li",{parentName:"ol"},(0,t.kt)("p",{parentName:"li"},"Hapus file ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities.rs"),", pindah definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities")," ke file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),", hasilnya kurang lebih seperti ini:"),(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod utilities {\n #[path = "random.rs"]\n pub mod random;\n\n #[path = "password.rs"]\n pub mod password;\n}\n\nfn main() {\n // ...\n}\n')))),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(6633).Z,width:"920",height:"954"})),(0,t.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,t.kt)("p",null,"Pada kode di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," yang digunakan bukan ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs")," melainkan ",(0,t.kt)("inlineCode",{parentName:"p"},"random.rs"),", hail ini dikarenakan ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute dipanggil ",(0,t.kt)("strong",{parentName:"p"},"di dalam module ",(0,t.kt)("inlineCode",{parentName:"strong"},"utilities")),", menjadikan current path pada blok kode tersebut menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/"),"."),(0,t.kt)("p",null,"Silakan coba ubah isi ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs"),", hasilnya adalah error. Rust akan menggunakan gabungan dari current path (",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/"),") dan path pada ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute (",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/random.rs"),") dalam lookup, jadinya yang di-lookup adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"utilities/utilities/random.rs"),", dan hasilnya error karena tidak ada file disana."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust Inline Module",src:n(1081).Z,width:"772",height:"188"})),(0,t.kt)("p",null,"Module system di Rust merupakan topik yang cukup membingungkan (menurut penulis) karena desain-nya yang cukup unik jika dibandingkan dengan bagaimana bahasa pemrograman lain mengelola module-nya. Penulis anjurkan untuk mencoba praktik membuat program lainnya yang menerapkan module system, agar cepat terbiasa."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/module_inline"},"github.com/novalagung/dasarpemrogramanrust-example/../module_inline")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html"},"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.mod.html"},"https://doc.rust-lang.org/std/keyword.mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/mod.html"},"https://doc.rust-lang.org/rust-by-example/mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"},"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"))))}p.isMDXComponent=!0},9632:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAl0AAAB9CAIAAAAX00FjAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTlUMTg6MDI6MjYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTE5VDE5OjE3OjEyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTE5VDE5OjE3OjEyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2NGQ1ZmI5LTQ5Njct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"},3009:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/module-inline-2-c6d08bd6d0d03ddba99457fd3c0bdc5d.png"},6633:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/module-inline-3-9234cea75bd46ea1eea49d0320315320.png"},1081:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwQAAAC8CAIAAABJ6P4wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTlUMTk6MzA6NDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjE1OjEyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjE1OjEyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNlMDMxODFiLTU2OTgt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"}}]); \ No newline at end of file diff --git a/assets/js/3b1dfe68.84da4a4d.js b/assets/js/3b1dfe68.84da4a4d.js deleted file mode 100644 index ac2eff03..00000000 --- a/assets/js/3b1dfe68.84da4a4d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6161],{3905:(e,a,n)=>{n.d(a,{Zo:()=>u,kt:()=>k});var i=n(7294);function t(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);a&&(i=i.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var a=1;a=0||(t[n]=e[n]);return t}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}var m=i.createContext({}),p=function(e){var a=i.useContext(m),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},u=function(e){var a=p(e.components);return i.createElement(m.Provider,{value:a},e.children)},d={inlineCode:"code",wrapper:function(e){var a=e.children;return i.createElement(i.Fragment,{},a)}},o=i.forwardRef((function(e,a){var n=e.components,t=e.mdxType,l=e.originalType,m=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),o=p(n),k=t,g=o["".concat(m,".").concat(k)]||o[k]||d[k]||l;return n?i.createElement(g,r(r({ref:a},u),{},{components:n})):i.createElement(g,r({ref:a},u))}));function k(e,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var l=n.length,r=new Array(l);r[0]=o;var s={};for(var m in a)hasOwnProperty.call(a,m)&&(s[m]=a[m]);s.originalType=e,s.mdxType="string"==typeof e?e:t,r[1]=s;for(var p=2;p{n.r(a),n.d(a,{assets:()=>m,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:28,title:"A.28. Module System \u279c Visibility & Privacy",sidebar_label:"A.28. Module System \u279c Visibility & Privacy"},r=void 0,s={unversionedId:"basic/visibility-privacy",id:"basic/visibility-privacy",title:"A.28. Module System \u279c Visibility & Privacy",description:"Kita sebenarnya sudah mempelajari banyak hal yang berhubungan dengan visibility & privacy pada beberapa chapter sebelumnya. Jika pembaca mempelajari ebook ini secara urut, maka pastinya sudah familiar dengan keyword pub, self, crate, dan super.",source:"@site/docs/basic/visibility-privacy.md",sourceDirName:"basic",slug:"/basic/visibility-privacy",permalink:"/basic/visibility-privacy",draft:!1,tags:[],version:"current",sidebarPosition:28,frontMatter:{sidebar_position:28,title:"A.28. Module System \u279c Visibility & Privacy",sidebar_label:"A.28. Module System \u279c Visibility & Privacy"},sidebar:"tutorialSidebar",previous:{title:"A.27. Type Alias & Casting",permalink:"/basic/type-alias-casting"},next:{title:"A.29. Module System \u279c Use, Import, Re-export",permalink:"/basic/use"}},m={},p=[{value:"A.28.1. Pembahasan module system",id:"a281-pembahasan-module-system",level:2},{value:"A.28.2. Default visibility",id:"a282-default-visibility",level:2},{value:"A.28.3. Re-export item",id:"a283-re-export-item",level:2},{value:"A.28.4. Public visibility scope",id:"a284-public-visibility-scope",level:2},{value:"\u25c9 Keyword pub",id:"-keyword-pub",level:3},{value:"\u25c9 Keyword pub(in path)",id:"-keyword-pubin-path",level:3},{value:"\u25c9 Keyword pub(crate)",id:"-keyword-pubcrate",level:3},{value:"\u25c9 Keyword pub(super)",id:"-keyword-pubsuper",level:3},{value:"\u25c9 Keyword pub(self)",id:"-keyword-pubself",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:p};function d(e){let{components:a,...l}=e;return(0,t.kt)("wrapper",(0,i.Z)({},u,l,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Kita sebenarnya sudah mempelajari banyak hal yang berhubungan dengan visibility & privacy pada beberapa chapter sebelumnya. Jika pembaca mempelajari ebook ini secara urut, maka pastinya sudah familiar dengan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"self"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"crate"),", dan ",(0,t.kt)("inlineCode",{parentName:"p"},"super"),"."),(0,t.kt)("p",null,"Chapter ini merupakan pembahasan tambahan untuk ke-4 keyword tersebut, dan fokusnya lebih ke visibility & privacy di Rust secara general."),(0,t.kt)("p",null,"O iya, perihal ",(0,t.kt)("em",{parentName:"p"},"visbility")," dan ",(0,t.kt)("em",{parentName:"p"},"privacy")," itu sendiri, kedua istilah tersebut di sini kita maknai sama, yang artinya kurang lebih adalah tentang manajemen akses item di Rust."),(0,t.kt)("h2",{id:"a281-pembahasan-module-system"},"A.28.1. Pembahasan module system"),(0,t.kt)("p",null,"Pastikan sudah mempelajari 5 buah chapter tentang module system yang sebelumnya sudah dibahas. Kesemua chapter tersebut sangat berhubungan dengan pembahasan chapter ini."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/path-item"},"A.18. Module System \u279c Path & Item")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/package-crate"},"A.19. Module System \u279c Package & Crate")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/module-basic"},"A.20. Module System \u279c Module")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/module-inline"},"A.21. Module System \u279c Inline Module")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/module-scope-item-access"},"A.22. Module System \u279c Scope & Akses Item"))),(0,t.kt)("h2",{id:"a282-default-visibility"},"A.28.2. Default visibility"),(0,t.kt)("p",null,"Di Rust, ",(0,t.kt)("em",{parentName:"p"},"by default"),", hampir semua item adalah private. Apa efeknya ketika item adalah private atau publik? Silakan ingat 2 aturan penting berikut:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Jika suatu item adalah private, maka item tersebut hanya bisa diakses dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," dan dari ",(0,t.kt)("em",{parentName:"li"},"submodules")," milik ",(0,t.kt)("em",{parentName:"li"},"current module"),"."),(0,t.kt)("li",{parentName:"ol"},"Jika suatu item adalah publik, maka dia bisa diakses dari module lain di luar ",(0,t.kt)("em",{parentName:"li"},"current module scope"),", dengan catatan parent module scope item tersebut harus publik.")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Kita sepakati di sini, pada istilah ",(0,t.kt)("strong",{parentName:"p"},"current module")," kata ",(0,t.kt)("em",{parentName:"p"},"module")," disitu bisa saja tertuju untuk module atau juga submodule")),(0,t.kt)("p",null,"Dua point di atas sangat penting untuk dipahami, karena digunakan sebagai landasan pertimbangan dalam penyusunan hirarki module. Sebagai contoh, kita bisa membuat program yang hanya meng-expose API tertentu (yang memang diperlukan untuk diakses oleh publik), tanpa perlu ikut meng-expose detail implementasinya."),(0,t.kt)("p",null,"Ok, sekarang silakan perhatikan path sederhana di bawah ini. Diasumsikan ada sebuah fungsi yang path aksesnya adalah berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"messaging::service_layer::some_black_magic\n")),(0,t.kt)("p",null,"Segmen pertama yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging")," pasti adalah publik, karena di-import ke ",(0,t.kt)("em",{parentName:"p"},"crate root"),". Lalu bagaimana dengan segmen ",(0,t.kt)("inlineCode",{parentName:"p"},"service_layer")," dan juga ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic"),"?"),(0,t.kt)("p",null,"Jika item ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," disitu adalah publik, maka idealnya pengaksesan menggunakan path tersebut memungkinkan. Tapi kembali ke point ke-2 aturan yang sudah dibahas di atas, yaitu meskipun ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," adalah publik, jika parent-nya (yang pada konteks ini adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"service_layer"),") adalah private, maka pengaksesan menggunakan path tersebut menghasilkan error."),(0,t.kt)("p",null,"Intinya, ",(0,t.kt)("strong",{parentName:"p"},"sebuah item bisa diakses jika item tersebut adalah publik, dan parent item tersebut juga publik. Sedangkan default visibility untuk hampir semua item adalah private.")),(0,t.kt)("p",null,"Ok, sekarang mari lanjut ke praktik menggunakan contoh dengan pembahasan yang lebih mendetail. Silakan perhatikan dan praktikkan kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 messaging.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'const SOME_MESSAGE: &str = "hello rust";\n\nmod service_layer {\n\n pub fn some_black_magic() {\n println!("{}", crate::messaging::SOME_MESSAGE)\n }\n}\n\npub fn say_hello() {\n service_layer::some_black_magic();\n}\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello();\n}\n")),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Konstanta ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::SOME_MESSAGE")," adalah ",(0,t.kt)("strong",{parentName:"p"},"private"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Konstanta ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Konstanta ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."),(0,t.kt)("li",{parentName:"ul"},"Konstanta ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),". Contohnya bisa dilihat pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer::some_black_magic")," yang disitu ada statement pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"SOME_MESSAGE"),"."),(0,t.kt)("li",{parentName:"ul"},"Konstanta ini ",(0,t.kt)("strong",{parentName:"li"},"tidak bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Submodule ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::service_layer")," adalah ",(0,t.kt)("strong",{parentName:"p"},"private"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Submodule ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Submodule ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"). Contohnya bisa dilihat pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::say_hello")," yang disitu ada statement pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer"),"."),(0,t.kt)("li",{parentName:"ul"},"Submodule ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Submodule ini ",(0,t.kt)("strong",{parentName:"li"},"tidak bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::service_layer::some_black_magic")," adalah ",(0,t.kt)("strong",{parentName:"p"},"publik"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Fungsi ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),")."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),". Contohnya bisa dilihat pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::say_hello")," yang disitu ada statement pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),")."),(0,t.kt)("li",{parentName:"ul"},"Namun meskipun demikian, bisa tidaknya fungsi ini diakses dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),") juga tergantung dengan visibility dari current module itu sendiri, yaitu ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),"."),(0,t.kt)("li",{parentName:"ul"},"Karena module ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer")," adalah private, meskipun fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic")," di dalamnya adalah publik, pengaksesan fungsi tersebut dari luar module scope ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer")," tidak dimungkinkan.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Pengaksesan ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer::some_black_magic")," dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::say_hello")," tidak error karena submodule ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer")," meskipun private, posisinya adalah masih dalam satu module scope yang sama dengan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),"."),(0,t.kt)("li",{parentName:"ul"},"Dimisalkan jika ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer::some_black_magic")," dipaksa diakses dari ",(0,t.kt)("inlineCode",{parentName:"li"},"main"),", maka muncul error karena ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer")," adalah private dan posisinya tidak berada dalam module scope yang sama dengan crate root (",(0,t.kt)("inlineCode",{parentName:"li"},"main"),")."))))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::say_hello")," adalah ",(0,t.kt)("strong",{parentName:"p"},"public"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Fungsi ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"). Contohnya bisa dilihat pada crate root fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"main"),", disitu ada pemanggilan statement ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),".")))),(0,t.kt)("h2",{id:"a283-re-export-item"},"A.28.3. Re-export item"),(0,t.kt)("p",null,"Pada contoh, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::say_hello")," didesain sebagai media untuk mengakses fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic"),". Di situasi ",(0,t.kt)("em",{parentName:"p"},"real world")," pastinya sangat jarang terjadi sebuah fungsi isinya hanya satu baris pemanggilan fungsi lainnya. Jika memang ada situasi seperti itu, (kontekstual) lebih baik hapus saja fungsi yang jadi media pemanggilan dan langsung saja panggil fungsi di dalamnya sesuai kebutuhan."),(0,t.kt)("p",null,"Pada praktik selanjutnya ini kita misalkan bahwa fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," isinya memang hanya 1 baris, dan yang paling penting adalah isi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," perlu untuk bisa diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),". Untuk kasus seperti ini ada 3 alternatif solusi:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Tidak perlu mengubah apapun, gunakan saja kode yang sudah ditulis di atas. Kode tersebut sudah bisa mengakomodir pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic")," via ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),"."),(0,t.kt)("li",{parentName:"ol"},"Atau, hapus saja fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),", lalu ubah visibility module ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer")," menjadi publik, dengan demikian kita bisa mengakses ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic")," dari ",(0,t.kt)("inlineCode",{parentName:"li"},"main")," menggunakan path ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer::some_black_magic"),"."),(0,t.kt)("li",{parentName:"ol"},"Atau, gunakan teknik ",(0,t.kt)("strong",{parentName:"li"},"re-export item"),".")),(0,t.kt)("p",null,"Re-export item adalah sebuah cara untuk mem-",(0,t.kt)("em",{parentName:"p"},"bypass")," pengaksesan item yang secara hirarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module."),(0,t.kt)("p",null,"Item yang di-re-export akan menjadi item milik ",(0,t.kt)("em",{parentName:"p"},"current module")," dimana statement re-export tersebut ditulis."),(0,t.kt)("p",null,"Cara re-export item adalah menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub use")," kemudian diikuti dengan path yang ingin di-export dan juga nama export item dengan notasi penulisan berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"pub use the_path as exported_name;\npub use self::service_layer::some_black_magic as say_hello;\n")),(0,t.kt)("p",null,"Contoh jika diterapkan pada program yang sebelumnya sudah ditulis:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::service_layer::some_black_magic as say_hello;\n\nconst SOME_MESSAGE: &str = "hello rust";\n\nmod service_layer {\n\n pub fn some_black_magic() {\n println!("{}", crate::messaging::SOME_MESSAGE)\n }\n}\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello();\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Visibility & Privacy",src:n(2201).Z,width:"466",height:"109"})),(0,t.kt)("p",null,"Bisa dilihat di contoh di atas, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," dihapus, kemudian item ",(0,t.kt)("inlineCode",{parentName:"p"},"service_layer::some_black_magic")," di-re-export dengan nama ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello"),". Dengannya kita bisa mengakses ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," dari luar module ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging")," menggunakan path ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::say_hello"),"."),(0,t.kt)("p",null,"Jika item ingin di-re-export tanpa perubahan nama item, bisa gunakan notasi berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"pub use the_path;\npub use self::service_layer::some_black_magic;\n")),(0,t.kt)("p",null,"Jika diterapkan pada program sebelumnya, kurang lebih seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::service_layer::some_black_magic;\n\nconst SOME_MESSAGE: &str = "hello rust";\n\nmod service_layer {\n\n pub fn some_black_magic() {\n println!("{}", crate::messaging::SOME_MESSAGE)\n }\n}\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::some_black_magic();\n}\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"use")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/use"},"Module System \u279c Use"))),(0,t.kt)("h2",{id:"a284-public-visibility-scope"},"A.28.4. Public visibility scope"),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," digunakan untuk mengubah visibility item menjadi publik. Keyword ini bisa dikombinasikan dengan salah satu dari keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"self"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"crate"),", dan ",(0,t.kt)("inlineCode",{parentName:"p"},"super"),"; denganya kita bisa menentukan visibility sebuah publik item dengan scope yang lebih spesifik."),(0,t.kt)("h3",{id:"-keyword-pub"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub")),(0,t.kt)("p",null,"Penulis rasa untuk penerapan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," ini sudah sangat jelas, kita beberapa kali mempraktikkannya."),(0,t.kt)("p",null,"Dengan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", sebuah item visibility-nya menjadi publik."),(0,t.kt)("h3",{id:"-keyword-pubin-path"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(in path)")),(0,t.kt)("p",null,"Keyword ini menjadikan visibility item hanya di dalam ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," yang ditulis di ",(0,t.kt)("inlineCode",{parentName:"p"},"pub(in path)"),", dengan ketentuan ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," tersebut merupakan parent dari module item dimana keyword digunakan."),(0,t.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," didefinisikan publik dengan scope path ditentukan secara eksplisit adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"crate::outer_mod"),". Dengan demikian fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," hanya bisa diakses dari dalam ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod"),"."),(0,t.kt)("p",null,"Bisa dilihat di contoh, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),". Silakan coba saja paksa untuk mengaksesnya dari fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", hasilnya pasti error."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod {\n\n pub mod inner_mod {\n\n // fungsi say_hello berikut hanya bisa diakses dari dalam `outer_mod`.\n // pengaksesannya dari luar `outer_mod` menghasilkan error.\n pub(in crate::outer_mod) fn say_hello() {\n println!("hello rust")\n }\n }\n\n pub fn do_something() {\n inner_mod::say_hello();\n }\n}\n\nfn main() {\n outer_mod::do_something();\n}\n')),(0,t.kt)("h3",{id:"-keyword-pubcrate"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(crate)")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub(crate)")," digunakan untuk membuat visibility item menjadi publik dengan scope akses ",(0,t.kt)("em",{parentName:"p"},"current crate"),". Dengan ini item bisa diakses dari manapun asalakan masih dalam crate yang sama."),(0,t.kt)("p",null,"Contoh penerapannya bisa dilihat berikut ini. Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," visibility scope nya ditentukan adalah ",(0,t.kt)("em",{parentName:"p"},"current crate"),". Fungsi tersebut bisa diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod_one::do_something"),", dari ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod_two::do_something"),", dan juga dari fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod_one {\n\n pub mod inner_mod {\n\n // fungsi ini visibility scope-nya di level crate\n pub(crate) fn say_hello() {\n println!("hello rust")\n }\n }\n\n pub fn do_something() {\n inner_mod::say_hello();\n }\n}\n\npub mod outer_mod_two {\n\n pub fn do_something() {\n crate::outer_mod_one::inner_mod::say_hello();\n }\n}\n\nfn main() {\n outer_mod_one::inner_mod::say_hello();\n outer_mod_one::do_something();\n outer_mod_two::do_something();\n}\n')),(0,t.kt)("h3",{id:"-keyword-pubsuper"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(super)")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub(super)")," digunakan untuk membuat visibility item menjadi publik dengan scope akses ",(0,t.kt)("em",{parentName:"p"},"parent module"),"."),(0,t.kt)("p",null,"Pada contoh berikut, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," visibility scope nya ditentukan adalah ",(0,t.kt)("em",{parentName:"p"},"parent module"),", artinya fungsi tersebut hanya bisa diakses dari dalam ",(0,t.kt)("em",{parentName:"p"},"parent module")," (yang pada konteks ini adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod"),")."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod {\n\n pub mod inner_mod {\n\n // fungsi ini visibility scope-nya di parent module scope,\n // yaitu `outer_mod`\n pub(super) fn say_hello() {\n println!("hello rust")\n }\n }\n\n pub fn do_something() {\n inner_mod::say_hello();\n }\n}\n\nfn main() {\n outer_mod::do_something();\n}\n')),(0,t.kt)("h3",{id:"-keyword-pubself"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(self)")),(0,t.kt)("p",null,"Keyword ini digunakan untuk membuat visibility item menjadi publik dengan scope akses hanya pada current module. Contohnya bisa dilihat pada kode program berikut."),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," visibility scope-nya adalah ",(0,t.kt)("em",{parentName:"p"},"current module"),". Fungsi tersebut hanya bisa diakses dari tempat yang merupakan module item dari ",(0,t.kt)("em",{parentName:"p"},"current module")," yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"inner_mod"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod {\n\n pub mod inner_mod {\n\n // fungsi ini visibility scope-nya di current module scope,\n // yaitu `inner_mod`\n pub(self) fn say_hello() {\n println!("hello rust")\n }\n\n pub fn do_something() {\n say_hello();\n }\n }\n}\n\nfn main() {\n outer_mod::inner_mod::do_something();\n}\n')),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/visibility_privacy"},"github.com/novalagung/dasarpemrogramanrust-example/../visibility_privacy")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/visibility-and-privacy.html"},"https://doc.rust-lang.org/reference/visibility-and-privacy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html"))))}d.isMDXComponent=!0},2201:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdIAAABtCAIAAACa6Xd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTEtMTRUMTM6MjI6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBmNDI1NTJiLTNmYTgt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"}}]); \ No newline at end of file diff --git a/assets/js/3b1dfe68.a3e9cea9.js b/assets/js/3b1dfe68.a3e9cea9.js new file mode 100644 index 00000000..36b7f22d --- /dev/null +++ b/assets/js/3b1dfe68.a3e9cea9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6161],{3905:(e,a,n)=>{n.d(a,{Zo:()=>u,kt:()=>k});var i=n(7294);function t(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);a&&(i=i.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var a=1;a=0||(t[n]=e[n]);return t}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}var m=i.createContext({}),p=function(e){var a=i.useContext(m),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},u=function(e){var a=p(e.components);return i.createElement(m.Provider,{value:a},e.children)},d={inlineCode:"code",wrapper:function(e){var a=e.children;return i.createElement(i.Fragment,{},a)}},o=i.forwardRef((function(e,a){var n=e.components,t=e.mdxType,l=e.originalType,m=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),o=p(n),k=t,g=o["".concat(m,".").concat(k)]||o[k]||d[k]||l;return n?i.createElement(g,r(r({ref:a},u),{},{components:n})):i.createElement(g,r({ref:a},u))}));function k(e,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var l=n.length,r=new Array(l);r[0]=o;var s={};for(var m in a)hasOwnProperty.call(a,m)&&(s[m]=a[m]);s.originalType=e,s.mdxType="string"==typeof e?e:t,r[1]=s;for(var p=2;p{n.r(a),n.d(a,{assets:()=>m,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>s,toc:()=>p});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:28,title:"A.28. Module System \u279c Visibility & Privacy",sidebar_label:"A.28. Module System \u279c Visibility & Privacy"},r=void 0,s={unversionedId:"basic/visibility-privacy",id:"basic/visibility-privacy",title:"A.28. Module System \u279c Visibility & Privacy",description:"Kita sebenarnya sudah mempelajari banyak hal yang berhubungan dengan visibility & privacy pada beberapa chapter sebelumnya. Jika pembaca mempelajari ebook ini secara urut, maka pastinya sudah familiar dengan keyword pub, self, crate, dan super.",source:"@site/docs/basic/visibility-privacy.md",sourceDirName:"basic",slug:"/basic/visibility-privacy",permalink:"/basic/visibility-privacy",draft:!1,tags:[],version:"current",sidebarPosition:28,frontMatter:{sidebar_position:28,title:"A.28. Module System \u279c Visibility & Privacy",sidebar_label:"A.28. Module System \u279c Visibility & Privacy"},sidebar:"tutorialSidebar",previous:{title:"A.27. Type Alias & Casting",permalink:"/basic/type-alias-casting"},next:{title:"A.29. Module System \u279c Use, Import, Re-export",permalink:"/basic/use"}},m={},p=[{value:"A.28.1. Pembahasan module system",id:"a281-pembahasan-module-system",level:2},{value:"A.28.2. Default visibility",id:"a282-default-visibility",level:2},{value:"A.28.3. Re-export item",id:"a283-re-export-item",level:2},{value:"A.28.4. Public visibility scope",id:"a284-public-visibility-scope",level:2},{value:"\u25c9 Keyword pub",id:"-keyword-pub",level:3},{value:"\u25c9 Keyword pub(in path)",id:"-keyword-pubin-path",level:3},{value:"\u25c9 Keyword pub(crate)",id:"-keyword-pubcrate",level:3},{value:"\u25c9 Keyword pub(super)",id:"-keyword-pubsuper",level:3},{value:"\u25c9 Keyword pub(self)",id:"-keyword-pubself",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:p};function d(e){let{components:a,...l}=e;return(0,t.kt)("wrapper",(0,i.Z)({},u,l,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Kita sebenarnya sudah mempelajari banyak hal yang berhubungan dengan visibility & privacy pada beberapa chapter sebelumnya. Jika pembaca mempelajari ebook ini secara urut, maka pastinya sudah familiar dengan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"self"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"crate"),", dan ",(0,t.kt)("inlineCode",{parentName:"p"},"super"),"."),(0,t.kt)("p",null,"Chapter ini merupakan pembahasan tambahan untuk ke-4 keyword tersebut, dan fokusnya lebih ke visibility & privacy di Rust secara general."),(0,t.kt)("p",null,"O iya, perihal ",(0,t.kt)("em",{parentName:"p"},"visbility")," dan ",(0,t.kt)("em",{parentName:"p"},"privacy")," itu sendiri, kedua istilah tersebut di sini kita maknai sama, yang artinya kurang lebih adalah tentang manajemen akses item di Rust."),(0,t.kt)("h2",{id:"a281-pembahasan-module-system"},"A.28.1. Pembahasan module system"),(0,t.kt)("p",null,"Pastikan sudah mempelajari 5 buah chapter tentang module system yang sebelumnya sudah dibahas. Kesemua chapter tersebut sangat berhubungan dengan pembahasan chapter ini."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/path-item"},"A.18. Module System \u279c Path & Item")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/package-crate"},"A.19. Module System \u279c Package & Crate")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/module-basic"},"A.20. Module System \u279c Module")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/module-inline"},"A.21. Module System \u279c Inline Module")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/module-scope-item-access"},"A.22. Module System \u279c Scope & Akses Item"))),(0,t.kt)("h2",{id:"a282-default-visibility"},"A.28.2. Default visibility"),(0,t.kt)("p",null,"Di Rust, ",(0,t.kt)("em",{parentName:"p"},"by default"),", hampir semua item adalah private. Apa efeknya ketika item adalah private atau publik? Silakan ingat 2 aturan penting berikut:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Jika suatu item adalah private, maka item tersebut hanya bisa diakses dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," dan dari ",(0,t.kt)("em",{parentName:"li"},"submodules")," milik ",(0,t.kt)("em",{parentName:"li"},"current module"),"."),(0,t.kt)("li",{parentName:"ol"},"Jika suatu item adalah publik, maka dia bisa diakses dari module lain di luar ",(0,t.kt)("em",{parentName:"li"},"current module scope"),", dengan catatan parent module scope item tersebut harus publik.")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Kita sepakati di sini, pada istilah ",(0,t.kt)("strong",{parentName:"p"},"current module")," kata ",(0,t.kt)("em",{parentName:"p"},"module")," di situ bisa saja tertuju untuk module atau juga submodule")),(0,t.kt)("p",null,"Dua point di atas sangat penting untuk dipahami, karena digunakan sebagai landasan pertimbangan dalam penyusunan hirarki module. Sebagai contoh, kita bisa membuat program yang hanya meng-expose API tertentu (yang memang diperlukan untuk diakses oleh publik), tanpa perlu ikut meng-expose detail implementasinya."),(0,t.kt)("p",null,"Ok, sekarang silakan perhatikan path sederhana di bawah ini. Diasumsikan ada sebuah fungsi yang path aksesnya adalah berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash"},"messaging::service_layer::some_black_magic\n")),(0,t.kt)("p",null,"Segmen pertama yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging")," pasti adalah publik, karena di-import ke ",(0,t.kt)("em",{parentName:"p"},"crate root"),". Lalu bagaimana dengan segmen ",(0,t.kt)("inlineCode",{parentName:"p"},"service_layer")," dan juga ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic"),"?"),(0,t.kt)("p",null,"Jika item ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," di situ adalah publik, maka idealnya pengaksesan menggunakan path tersebut memungkinkan. Tapi kembali ke point ke-2 aturan yang sudah dibahas di atas, yaitu meskipun ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," adalah publik, jika parent-nya (yang pada konteks ini adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"service_layer"),") adalah private, maka pengaksesan menggunakan path tersebut menghasilkan error."),(0,t.kt)("p",null,"Intinya, ",(0,t.kt)("strong",{parentName:"p"},"sebuah item bisa diakses jika item tersebut adalah publik, dan parent item tersebut juga publik. Sedangkan default visibility untuk hampir semua item adalah private.")),(0,t.kt)("p",null,"Ok, sekarang mari lanjut ke praktik menggunakan contoh dengan pembahasan yang lebih mendetail. Silakan perhatikan dan praktikkan kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 messaging.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'const SOME_MESSAGE: &str = "hello rust";\n\nmod service_layer {\n\n pub fn some_black_magic() {\n println!("{}", crate::messaging::SOME_MESSAGE)\n }\n}\n\npub fn say_hello() {\n service_layer::some_black_magic();\n}\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello();\n}\n")),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Konstanta ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::SOME_MESSAGE")," adalah ",(0,t.kt)("strong",{parentName:"p"},"private"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Konstanta ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Konstanta ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."),(0,t.kt)("li",{parentName:"ul"},"Konstanta ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),". Contohnya bisa dilihat pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer::some_black_magic")," yang di situ ada statement pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"SOME_MESSAGE"),"."),(0,t.kt)("li",{parentName:"ul"},"Konstanta ini ",(0,t.kt)("strong",{parentName:"li"},"tidak bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Submodule ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::service_layer")," adalah ",(0,t.kt)("strong",{parentName:"p"},"private"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Submodule ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Submodule ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"). Contohnya bisa dilihat pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::say_hello")," yang di situ ada statement pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer"),"."),(0,t.kt)("li",{parentName:"ul"},"Submodule ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Submodule ini ",(0,t.kt)("strong",{parentName:"li"},"tidak bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::service_layer::some_black_magic")," adalah ",(0,t.kt)("strong",{parentName:"p"},"publik"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Fungsi ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),")."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),". Contohnya bisa dilihat pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::say_hello")," yang di situ ada statement pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),")."),(0,t.kt)("li",{parentName:"ul"},"Namun meskipun demikian, bisa tidaknya fungsi ini diakses dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),") juga tergantung dengan visibility dari current module itu sendiri, yaitu ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer"),"."),(0,t.kt)("li",{parentName:"ul"},"Karena module ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer")," adalah private, meskipun fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic")," di dalamnya adalah publik, pengaksesan fungsi tersebut dari luar module scope ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer")," tidak dimungkinkan.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Pengaksesan ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer::some_black_magic")," dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::say_hello")," tidak error karena submodule ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer")," meskipun private, posisinya adalah masih dalam satu module scope yang sama dengan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),"."),(0,t.kt)("li",{parentName:"ul"},"Dimisalkan jika ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer::some_black_magic")," dipaksa diakses dari ",(0,t.kt)("inlineCode",{parentName:"li"},"main"),", maka muncul error karena ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer")," adalah private dan posisinya tidak berada dalam module scope yang sama dengan crate root (",(0,t.kt)("inlineCode",{parentName:"li"},"main"),")."))))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::say_hello")," adalah ",(0,t.kt)("strong",{parentName:"p"},"public"),". Penjelasan:"),(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Fungsi ini merupakan module item milik ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),")."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari submodule milik ",(0,t.kt)("em",{parentName:"li"},"current module"),", yaitu submodule dari ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ini ",(0,t.kt)("strong",{parentName:"li"},"bisa diakses")," dari luar ",(0,t.kt)("em",{parentName:"li"},"current module scope")," (",(0,t.kt)("inlineCode",{parentName:"li"},"messaging"),"). Contohnya bisa dilihat pada crate root fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"main"),", di situ ada pemanggilan statement ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),".")))),(0,t.kt)("h2",{id:"a283-re-export-item"},"A.28.3. Re-export item"),(0,t.kt)("p",null,"Pada contoh, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::say_hello")," didesain sebagai media untuk mengakses fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic"),". Di situasi ",(0,t.kt)("em",{parentName:"p"},"real world")," pastinya sangat jarang terjadi sebuah fungsi isinya hanya satu baris pemanggilan fungsi lainnya. Jika memang ada situasi seperti itu, (kontekstual) lebih baik hapus saja fungsi yang jadi media pemanggilan dan langsung saja panggil fungsi di dalamnya sesuai kebutuhan."),(0,t.kt)("p",null,"Pada praktik selanjutnya ini kita misalkan bahwa fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," isinya memang hanya 1 baris, dan yang paling penting adalah isi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," perlu untuk bisa diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),". Untuk kasus seperti ini ada 3 alternatif solusi:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Tidak perlu mengubah apapun, gunakan saja kode yang sudah ditulis di atas. Kode tersebut sudah bisa mengakomodir pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic")," via ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),"."),(0,t.kt)("li",{parentName:"ol"},"Atau, hapus saja fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"say_hello"),", lalu ubah visibility module ",(0,t.kt)("inlineCode",{parentName:"li"},"service_layer")," menjadi publik, dengan demikian kita bisa mengakses ",(0,t.kt)("inlineCode",{parentName:"li"},"some_black_magic")," dari ",(0,t.kt)("inlineCode",{parentName:"li"},"main")," menggunakan path ",(0,t.kt)("inlineCode",{parentName:"li"},"messaging::service_layer::some_black_magic"),"."),(0,t.kt)("li",{parentName:"ol"},"Atau, gunakan teknik ",(0,t.kt)("strong",{parentName:"li"},"re-export item"),".")),(0,t.kt)("p",null,"Re-export item adalah sebuah cara untuk mem-",(0,t.kt)("em",{parentName:"p"},"bypass")," pengaksesan item yang secara hirarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module."),(0,t.kt)("p",null,"Item yang di-re-export akan menjadi item milik ",(0,t.kt)("em",{parentName:"p"},"current module")," di mana statement re-export tersebut ditulis."),(0,t.kt)("p",null,"Cara re-export item adalah menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub use")," kemudian diikuti dengan path yang ingin di-export dan juga nama export item dengan notasi penulisan berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"pub use the_path as exported_name;\npub use self::service_layer::some_black_magic as say_hello;\n")),(0,t.kt)("p",null,"Contoh jika diterapkan pada program yang sebelumnya sudah ditulis:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::service_layer::some_black_magic as say_hello;\n\nconst SOME_MESSAGE: &str = "hello rust";\n\nmod service_layer {\n\n pub fn some_black_magic() {\n println!("{}", crate::messaging::SOME_MESSAGE)\n }\n}\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello();\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Visibility & Privacy",src:n(2201).Z,width:"466",height:"109"})),(0,t.kt)("p",null,"Bisa dilihat di contoh di atas, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," dihapus, kemudian item ",(0,t.kt)("inlineCode",{parentName:"p"},"service_layer::some_black_magic")," di-re-export dengan nama ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello"),". Dengannya kita bisa mengakses ",(0,t.kt)("inlineCode",{parentName:"p"},"some_black_magic")," dari luar module ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging")," menggunakan path ",(0,t.kt)("inlineCode",{parentName:"p"},"messaging::say_hello"),"."),(0,t.kt)("p",null,"Jika item ingin di-re-export tanpa perubahan nama item, bisa gunakan notasi berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"pub use the_path;\npub use self::service_layer::some_black_magic;\n")),(0,t.kt)("p",null,"Jika diterapkan pada program sebelumnya, kurang lebih seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::service_layer::some_black_magic;\n\nconst SOME_MESSAGE: &str = "hello rust";\n\nmod service_layer {\n\n pub fn some_black_magic() {\n println!("{}", crate::messaging::SOME_MESSAGE)\n }\n}\n')),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::some_black_magic();\n}\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"use")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/use"},"Module System \u279c Use"))),(0,t.kt)("h2",{id:"a284-public-visibility-scope"},"A.28.4. Public visibility scope"),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," digunakan untuk mengubah visibility item menjadi publik. Keyword ini bisa dikombinasikan dengan salah satu dari keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"self"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"crate"),", dan ",(0,t.kt)("inlineCode",{parentName:"p"},"super"),"; denganya kita bisa menentukan visibility sebuah publik item dengan scope yang lebih spesifik."),(0,t.kt)("h3",{id:"-keyword-pub"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub")),(0,t.kt)("p",null,"Penulis rasa untuk penerapan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," ini sudah sangat jelas, kita beberapa kali mempraktikkannya."),(0,t.kt)("p",null,"Dengan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", sebuah item visibility-nya menjadi publik."),(0,t.kt)("h3",{id:"-keyword-pubin-path"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(in path)")),(0,t.kt)("p",null,"Keyword ini menjadikan visibility item hanya di dalam ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," yang ditulis di ",(0,t.kt)("inlineCode",{parentName:"p"},"pub(in path)"),", dengan ketentuan ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," tersebut merupakan parent dari module item di mana keyword digunakan."),(0,t.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," didefinisikan publik dengan scope path ditentukan secara eksplisit adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"crate::outer_mod"),". Dengan demikian fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," hanya bisa diakses dari dalam ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod"),"."),(0,t.kt)("p",null,"Bisa dilihat di contoh, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),". Silakan coba saja paksa untuk mengaksesnya dari fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", hasilnya pasti error."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod {\n\n pub mod inner_mod {\n\n // fungsi say_hello berikut hanya bisa diakses dari dalam `outer_mod`.\n // pengaksesannya dari luar `outer_mod` menghasilkan error.\n pub(in crate::outer_mod) fn say_hello() {\n println!("hello rust")\n }\n }\n\n pub fn do_something() {\n inner_mod::say_hello();\n }\n}\n\nfn main() {\n outer_mod::do_something();\n}\n')),(0,t.kt)("h3",{id:"-keyword-pubcrate"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(crate)")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub(crate)")," digunakan untuk membuat visibility item menjadi publik dengan scope akses ",(0,t.kt)("em",{parentName:"p"},"current crate"),". Dengan ini item bisa diakses dari manapun asalakan masih dalam crate yang sama."),(0,t.kt)("p",null,"Contoh penerapannya bisa dilihat berikut ini. Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," visibility scope nya ditentukan adalah ",(0,t.kt)("em",{parentName:"p"},"current crate"),". Fungsi tersebut bisa diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod_one::do_something"),", dari ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod_two::do_something"),", dan juga dari fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod_one {\n\n pub mod inner_mod {\n\n // fungsi ini visibility scope-nya di level crate\n pub(crate) fn say_hello() {\n println!("hello rust")\n }\n }\n\n pub fn do_something() {\n inner_mod::say_hello();\n }\n}\n\npub mod outer_mod_two {\n\n pub fn do_something() {\n crate::outer_mod_one::inner_mod::say_hello();\n }\n}\n\nfn main() {\n outer_mod_one::inner_mod::say_hello();\n outer_mod_one::do_something();\n outer_mod_two::do_something();\n}\n')),(0,t.kt)("h3",{id:"-keyword-pubsuper"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(super)")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub(super)")," digunakan untuk membuat visibility item menjadi publik dengan scope akses ",(0,t.kt)("em",{parentName:"p"},"parent module"),"."),(0,t.kt)("p",null,"Pada contoh berikut, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," visibility scope nya ditentukan adalah ",(0,t.kt)("em",{parentName:"p"},"parent module"),", artinya fungsi tersebut hanya bisa diakses dari dalam ",(0,t.kt)("em",{parentName:"p"},"parent module")," (yang pada konteks ini adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"outer_mod"),")."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod {\n\n pub mod inner_mod {\n\n // fungsi ini visibility scope-nya di parent module scope,\n // yaitu `outer_mod`\n pub(super) fn say_hello() {\n println!("hello rust")\n }\n }\n\n pub fn do_something() {\n inner_mod::say_hello();\n }\n}\n\nfn main() {\n outer_mod::do_something();\n}\n')),(0,t.kt)("h3",{id:"-keyword-pubself"},"\u25c9 Keyword ",(0,t.kt)("inlineCode",{parentName:"h3"},"pub(self)")),(0,t.kt)("p",null,"Keyword ini digunakan untuk membuat visibility item menjadi publik dengan scope akses hanya pada current module. Contohnya bisa dilihat pada kode program berikut."),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," visibility scope-nya adalah ",(0,t.kt)("em",{parentName:"p"},"current module"),". Fungsi tersebut hanya bisa diakses dari tempat yang merupakan module item dari ",(0,t.kt)("em",{parentName:"p"},"current module")," yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"inner_mod"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'pub mod outer_mod {\n\n pub mod inner_mod {\n\n // fungsi ini visibility scope-nya di current module scope,\n // yaitu `inner_mod`\n pub(self) fn say_hello() {\n println!("hello rust")\n }\n\n pub fn do_something() {\n say_hello();\n }\n }\n}\n\nfn main() {\n outer_mod::inner_mod::do_something();\n}\n')),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/visibility_privacy"},"github.com/novalagung/dasarpemrogramanrust-example/../visibility_privacy")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/visibility-and-privacy.html"},"https://doc.rust-lang.org/reference/visibility-and-privacy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html"))))}d.isMDXComponent=!0},2201:(e,a,n)=>{n.d(a,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdIAAABtCAIAAACa6Xd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTEtMTRUMTM6MjI6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBmNDI1NTJiLTNmYTgt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"}}]); \ No newline at end of file diff --git a/assets/js/4232c3ed.0eade53f.js b/assets/js/4232c3ed.0eade53f.js deleted file mode 100644 index 8bb5a038..00000000 --- a/assets/js/4232c3ed.0eade53f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8308],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>A});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var u=t.createContext({}),m=function(a){var e=t.useContext(u),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},d=function(a){var e=m(a.components);return t.createElement(u.Provider,{value:e},a.children)},o={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},k=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,u=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),k=m(n),A=i,s=k["".concat(u,".").concat(A)]||k[A]||o[A]||l;return n?t.createElement(s,r(r({ref:e},d),{},{components:n})):t.createElement(s,r({ref:e},d))}));function A(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=k;var p={};for(var u in e)hasOwnProperty.call(e,u)&&(p[u]=e[u]);p.originalType=a,p.mdxType="string"==typeof a?a:i,r[1]=p;for(var m=2;m{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>r,default:()=>o,frontMatter:()=>l,metadata:()=>p,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:26,title:"A.26. Enum",sidebar_label:"A.26. Enum"},r=void 0,p={unversionedId:"basic/enum",id:"basic/enum",title:"A.26. Enum",description:"Enum atau enumerated type adalah sebuah tipe data yang digunakan untuk menampung nilai konstan. Pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/enum.md",sourceDirName:"basic",slug:"/basic/enum",permalink:"/basic/enum",draft:!1,tags:[],version:"current",sidebarPosition:26,frontMatter:{sidebar_position:26,title:"A.26. Enum",sidebar_label:"A.26. Enum"},sidebar:"tutorialSidebar",previous:{title:"A.25. Method",permalink:"/basic/method"},next:{title:"A.27. Type Alias & Casting",permalink:"/basic/type-alias-casting"}},u={},m=[{value:"A.26.1. Keyword enum",id:"a261-keyword-enum",level:2},{value:"A.26.2. Naming convention enum",id:"a262-naming-convention-enum",level:2},{value:"A.26.3. Seleksi kondisi enum",id:"a263-seleksi-kondisi-enum",level:2},{value:"A.26.4. Keyword match",id:"a264-keyword-match",level:2},{value:"A.26.5. Enum value \u279c tuple struct-like",id:"a265-enum-value--tuple-struct-like",level:2},{value:"A.26.6. Enum value \u279c struct-like",id:"a266-enum-value--struct-like",level:2},{value:"A.26.7. Aturan pattern matching enum",id:"a267-aturan-pattern-matching-enum",level:2},{value:"A.26.8. Enum module & visibility",id:"a268-enum-module--visibility",level:2},{value:"A.26.9. Generic pada enum",id:"a269-generic-pada-enum",level:2},{value:"A.26.10. Pembahasan lanjutan pattern matching",id:"a2610-pembahasan-lanjutan-pattern-matching",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function o(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},d,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Enum atau ",(0,i.kt)("em",{parentName:"p"},"enumerated type")," adalah sebuah tipe data yang digunakan untuk menampung nilai konstan. Pada chapter ini kita akan mempelajarinya."),(0,i.kt)("p",null,"Enum ada sedikit kemiripan dengan konstanta, bedanya ada pada nilai atau ",(0,i.kt)("em",{parentName:"p"},"underlying value"),"-nya. Jika di konstanta, yang didefinisikan adalah nama beserta value-nya, di enum yang didefinisikan adalah tipe data enum dan enum value. Enum value ini bentuknya seperti variabel tanpa nilai (lebih tepatnya nama dari enum value tersebut adalah nilainya). Lebih jelasnya silakan ikut pembahasan chapter ini."),(0,i.kt)("h2",{id:"a261-keyword-enum"},"A.26.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"enum")),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"enum")," digunakan untuk membuat ",(0,i.kt)("em",{parentName:"p"},"enumerated type"),". Cara penulisannya seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum NamaEnum {\n NilaiEnum1,\n Nilai2,\n NilaiEnumKe3,\n // ...\n}\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"NamaEnum")," di atas adalah tipe data custom yang didefinisikan bertipe enum. Sedangkan ",(0,i.kt)("inlineCode",{parentName:"p"},"NilaiEnum1"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Nilai2"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"NilaiEnumKe3")," adalah yang disebut dengan enum value. Dengan itu maka ketiga enum values tersebut tipe datanya adalah sama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaEnum"),"."),(0,i.kt)("p",null,"Mari kita lanjut praktik. Berikut ini adalah definisi konstanta yang menggunakan tipe data string untuk menampung nilai konstan-nya. Lalu dibawahnya ada lagi definisi nilai konstan tetapi menggunakan enum sebagai tipe data yang digunakan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// definisi konstanta\nconst SuperheroSuperman: &str = "superman";\nconst SuperheroOmniMan: &str = "omniman";\nconst SuperheroHomelander: &str = "homelander";\nconst SuperheroHyperion: &str = "hyperion";\n\n// definisi enum\nenum Superhero {\n Superman,\n OmniMan,\n Homelander,\n Hyperion,\n};\n')),(0,i.kt)("p",null,"Di contoh bisa dilihat, ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," adalah tipe data enum baru. Dari tipe data tersebut dibuat 4 buah enum values, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Superman"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"OmniMan"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Homelander"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Hyperion"),"."),(0,i.kt)("p",null,"Pada pembuatan konstanta, tipe data beserta value-nya harus ditentukan di awal. Pada enum, yang perlu didefinisikan adalah tipe data enum-nya (sebagai contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),") kemudian diikut dengan enum value yang dituliskan tanpa pengisian nilai."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Definisi variabel dengan isi konstanta:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let value1: &str = SuperheroSuperman;\nlet value2 = SuperheroOmniMan;\n// ...\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Definisi variabel bertipe data enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),":"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let value3: Superhero = Superhero::Superman;\nlet value4 = Superhero::OmniMan;\n// ...\n")))),(0,i.kt)("p",null,"Notasi path digunakan dalam penulisan enum value dengan format ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaEnum::EnumValue")),(0,i.kt)("h2",{id:"a262-naming-convention-enum"},"A.26.2. ",(0,i.kt)("em",{parentName:"h2"},"Naming convention")," enum"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", upper camel case digunakan dalam penamaan Enum beserta value-nya."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Superhero {\n Superman,\n OmniMan,\n Homelander,\n Hyperion,\n};\n")),(0,i.kt)("h2",{id:"a263-seleksi-kondisi-enum"},"A.26.3. Seleksi kondisi enum"),(0,i.kt)("p",null,"Tipe data enum biasa dipakai pada seleksi kondisi, namun caranya sedikit berbeda. Default-nya keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," tidak bisa digunakan pada tipe data enum."),(0,i.kt)("p",null,"Pada contoh berikut, statement seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"value3")," menghasilkan error:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// seleksi kondisi pada konstanta\nif value1 == SuperheroSuperman {\n println!("hello superman!");\n}\n\n// seleksi kondisi pada enum\nif value3 == Superhero::Superman {\n println!("hello superman!");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(1179).Z,width:"859",height:"378"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Error tersebut muncul karena tipe data enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," tidak memiliki trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq"),". Lebih jelasnya mengenai trait dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),".")),(0,i.kt)("p",null,"Lalu bagaimana cara pengaplikasian seleksi kondisi pada tipe enum? Ada beberapa cara, namun yang paling praktis adalah keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("h2",{id:"a264-keyword-match"},"A.26.4. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"match")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"match")," adalah salah satu keyword untuk operasi seleksi kondisi di Rust. Penerapan keyword ini cukup luas, namun pada chapter ini hanya akan dibahas penerapannya yang relevan dengan topik enum."),(0,i.kt)("p",null,"Mari kita pelajarinya sembari praktik. Silakan buat package baru, lalu definisikan tipe enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Food")," berikut beserta 4 enum value-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Food {\n PenyetanTerangBulan,\n PizzaNanas,\n EsKrimIkanMujaer,\n MiGorengKuah,\n}\n")),(0,i.kt)("p",null,"Lalu buat sebuah variabel bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," untuk menampung salah satu nilai enum. Kemudian gunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk menerapkan operasi seleksi kondisi dengan aksi menampilkan sebuah pesan sesuai dengan nilai yang cocok."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let makanan_favorit: Food = Food::PenyetanTerangBulan;\n \n match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n Food::EsKrimIkanMujaer => {\n println!("I don\'t know what to say");\n },\n Food::MiGorengKuah => {\n println!("sometimes people do eat this, but it\'s ok");\n }\n }\n}\n')),(0,i.kt)("p",null,"Di atas bisa dilihat bagaimana cara penggunaan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk penerapan seleksi kondisi pada tipe data enum."),(0,i.kt)("p",null,"Notasi penulisannya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"}," match variabel_enum {\n TipeEnum::ValueEnum1 => {\n // ...\n },\n TipeEnum::ValueEnum2 => {\n // ...\n },\n \n // ...\n}\n")),(0,i.kt)("p",null,"Kembali ke contoh program, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," dicek nilainya menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PenyetanTerangBulan"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"your food taste is quite ... unique"\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PizzaNanas"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"it is morally wrong to have pineaple on top of pizza"\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::EsKrimIkanMujaer"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"I don\'t know what to say"\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MiGorengKuah"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"sometimes people do eat this, but it\'s ok"\n')))),(0,i.kt)("p",null,"Jalankan program untuk melihat hasilnya:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(5543).Z,width:"450",height:"82"})),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," ini sebenarnya tidak hanya digunakan untuk seleksi kondisi saja. Di Rust ada yang disebut dengan ",(0,i.kt)("em",{parentName:"p"},"pattern matching"),". Metode ",(0,i.kt)("em",{parentName:"p"},"pattern matching")," ini memahami ",(0,i.kt)("em",{parentName:"p"},"special syntax")," yang kegunaanya lebih luas dibanding hanya sekedar seleksi kondisi biasa."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"p"},"pattern matching")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h2",{id:"a265-enum-value--tuple-struct-like"},"A.26.5. Enum value \u279c ",(0,i.kt)("em",{parentName:"h2"},"tuple struct"),"-like"),(0,i.kt)("p",null,"Enum value di struct bisa juga didesain seperti ",(0,i.kt)("em",{parentName:"p"},"tuple struct"),". Sebagai contoh, enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Food")," di atas akan kita tambahi dengan satu enum value baru berbentuk ",(0,i.kt)("em",{parentName:"p"},"tuple struct"),"."),(0,i.kt)("p",null,"Silakan tambahkan enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"MakananLainnya")," berikut. Enum ini kita fungsikan untuk mengidentifikasi data makanan lainnya selain dari yang sudah ada di enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Food"),". Notasi penulisan ",(0,i.kt)("em",{parentName:"p"},"tuple struct")," ",(0,i.kt)("inlineCode",{parentName:"p"},"MakananLainnya(String)")," artinya enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"MakananLainnya")," didefinisikan untuk bisa menampung data property dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Food {\n PenyetanTerangBulan,\n PizzaNanas,\n EsKrimIkanMujaer,\n MiGorengKuah,\n MakananLainnya(String), // <---- enum value baru\n}\n")),(0,i.kt)("p",null,"Sekarang ubah isi variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," dengan enum value baru yang sudah dibuat. Syntax ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya(nasi_goreng)")," artinya enum value yang digunakan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," dengan isi property didapat dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"nasi_goreng"),"."),(0,i.kt)("p",null,"Tambahkan juga ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n // enum value MakananLainnya digunakan\n // dengan isi property adalah string "nasi goreng"\n let nasi_goreng = String::from("nasi goreng");\n let makanan_favorit = Food::MakananLainnya(nasi_goreng);\n \n match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n Food::EsKrimIkanMujaer => {\n println!("I don\'t know what to say. this should be illegal");\n },\n Food::MiGorengKuah => {\n println!("sometimes people do eat this, but it\'s ok");\n },\n Food::MakananLainnya(m) => { // <---- seleksi kondisi baru\n println!("do you like {m}? nice taste!");\n }\n }\n}\n')),(0,i.kt)("p",null,"Bisa dilihat ada keunikan dalam penulisan seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),". Disitu ada parameter bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"m")," yang parameter tersebut akan berisi data property jika memang ",(0,i.kt)("em",{parentName:"p"},"match")," dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit"),"."),(0,i.kt)("p",null,"Coba jalankan untuk melihat hasilnya:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(8424).Z,width:"462",height:"87"})),(0,i.kt)("p",null,"O iya, jumlah property value enum berbentuk ",(0,i.kt)("em",{parentName:"p"},"tuple struct")," ini tidak terbatas ya. Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," hanya memiliki 1 property. Lebih dari satu juga bisa."),(0,i.kt)("h2",{id:"a266-enum-value--struct-like"},"A.26.6. Enum value \u279c ",(0,i.kt)("em",{parentName:"h2"},"struct"),"-like"),(0,i.kt)("p",null,"Enum value bisa juga didesain memiliki property seperti ",(0,i.kt)("em",{parentName:"p"},"struct"),"."),(0,i.kt)("p",null,"Mari kita terapkan pada kode sebelumnya. Tambahkan 1 buah enum value lagi dengan nama ",(0,i.kt)("inlineCode",{parentName:"p"},"MieSetan")," yang ditulis dalam bentuk ",(0,i.kt)("em",{parentName:"p"},"struct"),"-like, dan memiliki 2 buah property."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Food {\n PenyetanTerangBulan,\n PizzaNanas,\n EsKrimIkanMujaer,\n MiGorengKuah,\n MakananLainnya(String),\n MieSetan { level_pedas: i32, pakek_piring: bool }\n}\n")),(0,i.kt)("p",null,"Setelah itu, isi variabel dengan nilai adalah enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan"),", level pedasnya 5, dan tanpa piring."),(0,i.kt)("p",null,"Tak lupa tambahkan seleksi kondisi untuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan")," pada blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let makanan_favorit = Food::MieSetan { \n level_pedas: 5,\n pakek_piring: false\n };\n \n match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n Food::EsKrimIkanMujaer => {\n println!("I don\'t know what to say. this should be illegal");\n },\n Food::MiGorengKuah => {\n println!("sometimes people do eat this, but it\'s ok");\n },\n Food::MakananLainnya(m) => {\n println!("do you like {m}? nice taste!");\n },\n Food::MieSetan { level_pedas, pakek_piring } => {\n if level_pedas > 3 {\n println!("mie setan lvl {} is too much!", level_pedas);\n } else {\n println!("mie setan lvl {} is perfect!", level_pedas);\n }\n\n if !pakek_piring {\n println!("how are you going to eat the food without a plate, huh?");\n }\n }\n }\n}\n')),(0,i.kt)("p",null,"Dalam seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan")," bisa dilihat ada beberapa statement. Kurang lebih jika nilai dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan")," maka:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Akan memunculkan pesan yang berbeda tergantung level pedasnya"),(0,i.kt)("li",{parentName:"ul"},"Dan jika terdeteksi tidak menggunakan piring, dimunculkan pesan tambahan")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(6989).Z,width:"448",height:"98"})),(0,i.kt)("h2",{id:"a267-aturan-pattern-matching-enum"},"A.26.7. Aturan ",(0,i.kt)("em",{parentName:"h2"},"pattern matching")," enum"),(0,i.kt)("p",null,"Dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),", semua enum value harus dituliskan. Jika tidak, pasti muncul error. Contohnya bisa dilihat di gambar berikut, beberapa seleksi kondisi enum value di-remark, hasilnya ada error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(2930).Z,width:"1096",height:"309"})),(0,i.kt)("p",null,"Error tersebut sebenarnya bisa diantisipasi dengan menambahkan seleksi kondisi dengan penulisan seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n _ => {\n println!("never heard about that food");\n }\n}\n')),(0,i.kt)("p",null,"Menggunakan blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," di atas, jika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," adalah selain ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PenyetanTerangBulan")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PizzaNanas"),", maka pesan ",(0,i.kt)("inlineCode",{parentName:"p"},"never heard about that food")," adalah yang muncul di layar."),(0,i.kt)("p",null,"Selain variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," bisa juga menggunakan nama variabel apapun, misalnya ",(0,i.kt)("inlineCode",{parentName:"p"},"some_var"),". Namun jika variabel tersebut tidak digunakan dalam blok kode, akan muncul warning."),(0,i.kt)("h2",{id:"a268-enum-module--visibility"},"A.26.8. Enum module & visibility"),(0,i.kt)("p",null,"Mari kita coba cek perihal visibility dari enum. Siapkan package baru dengan struktur seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 constants.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("p",null,"Pada file ",(0,i.kt)("inlineCode",{parentName:"p"},"constants.rs"),", tambahkan enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Company")," berikut. Pastikan enum adalah publik dengan menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada deklarasinya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/constants.rs"',title:'"src/constants.rs"'},"pub enum Company {\n Apple,\n Microsoft,\n Google,\n Github\n}\n")),(0,i.kt)("p",null,"Kemudian tambahkan kode berikut di ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod constants;\n\nfn main() {\n let company = constants::Company::Apple;\n \n match company {\n constants::Company::Apple => {\n print!("apple")\n },\n _ => {\n print!("other than apple")\n }\n }\n}\n')),(0,i.kt)("p",null,"Jalankan, hasilnya tidak error, karena ",(0,i.kt)("inlineCode",{parentName:"p"},"Company")," didefinisikan publik."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(3101).Z,width:"457",height:"85"})),(0,i.kt)("p",null,"Coba lakukan modifikasi dengan menghilangkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," saat definisi enum, hasilnya pasti error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada tipe data enum, keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," cukup ditambahkan pada definisi enum type, tidak perlu ditambahkan satu persatu di tiap enum values.")),(0,i.kt)("h2",{id:"a269-generic-pada-enum"},"A.26.9. Generic pada enum"),(0,i.kt)("p",null,"Pembahasan mengenai generic pada enum ada pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics#a368-generics-enum"},"Generics"),"."),(0,i.kt)("h2",{id:"a2610-pembahasan-lanjutan-pattern-matching"},"A.26.10. Pembahasan lanjutan ",(0,i.kt)("em",{parentName:"h2"},"pattern matching")),(0,i.kt)("p",null,"Pembahasan yang lebih mendetail tentang keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," dan ",(0,i.kt)("em",{parentName:"p"},"pattern matching")," ada pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/enum"},"github.com/novalagung/dasarpemrogramanrust-example/../enum")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang associated function dan method pada enum")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html"},"https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/custom_types/enum.html"},"https://doc.rust-lang.org/rust-by-example/custom_types/enum.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items/enumerations.html"},"https://doc.rust-lang.org/reference/items/enumerations.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch06-02-match.html"},"https://doc.rust-lang.org/book/ch06-02-match.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.enum.html"},"https://doc.rust-lang.org/std/keyword.enum.html"))))}o.isMDXComponent=!0},1179:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/enum-1-15c91a97fbd3c87f01a4c4c5060b5fd8.png"},5543:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABSCAIAAABIa0PlAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTU6MzM6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjU4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjU4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmM4OWNmODJhLTZlOGUt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"},8424:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc4AAABXCAIAAAACmjLYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTY6MDM6MTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjA0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjA0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE4M2ZmNmJjLTg0ODgt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"},6989:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAABiCAIAAABI5JR1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTY6MjQ6NTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjE1OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjE1OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRjZWU1MjgyLTVmZjQtYjI0Ni1hMTY3LTc5YTU4NmY2YzBhMyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkY2VlNTI4Mi01ZmY0LWIyNDYtYTE2Ny03OWE1ODZmNmMwYTMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkY2VlNTI4Mi01ZmY0LWIyNDYtYTE2Ny03OWE1ODZmNmMwYTMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmRjZWU1MjgyLTVmZjQtYjI0Ni1hMTY3LTc5YTU4NmY2YzBhMyIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0zMFQxNjoyNDo1OCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlgX+R0AAA1tSURBVHja7Z07cuQ2EIZ9EmmdOXa8u6kyy4mDDbSZyqnKVaraTAfREXQK5TqUZ8ghiUd3o0GCnOHo+2qrtMMB8WiAPxsA2fPbDQAAzOI3TAAAgIACACCgAAAIKAAAAgoAAAgoAAACCgCAgAIAIKAAAAgoAAAgoAAA1yygf97++uf3/743Stml+ffP1epwc//4/PTwtUnLD1mdaJXjjPJdRftTbmQ6X55fH56eH+83s5KzR6dEi+u21TApNP+Qwt+UNmPp0wno7X///P5r+vfl5x+ReP2688pcIeXOBHSbgaQUhIC2v824i3PV7dwjpK9muQq+VMvH0rEc381HvJX5T79QAb1bvxwE9JwFXaOAVl3d/tJ2IaAVwrhBVYMb1PG/dr8P304nuU/fj4AGbuldqGVffn6/PR3/6/ablnL0ScOUvYB+H9KfTo9ymIQyPN0W0ODeNZk+u6ElLkjJI8nGXHRRDR8Ofw+pxjvq+P10jx1yEVJG9Q4ymI6H+T0+dIefHu5Pf7+KKbNch2/EO7xouoWujK87TiZMTCcaObbnkKvSdrE7xO7O+8groFrHRd8EInH47/jFkK3QotxKekGiKIbJ4+o77gh19jSHhjVQ4o441Us9XW/RXjzQ+KuTqN3+LbiTSSbHj6nqyacHJ44HQ6+z4IGGPTIOquDg2B1R1xVHlFtAo9E/ylokHGlKuc6WF9SN4cOn4G884MS2BMtfkkFc1agVUHd3iAaRBXQ6fTSnrAxCdygaJPbRUg/068PjcCA2ciiIyVgMChf7SOsaqXSj0l4PvGjPsi3CBhet1n3UTl84STnbGmgncLqAnkQz1TVBQOOs5NO/ff8SrLre/ttl8vddcK4poLGNh46IF86Ho0Ha/tZ600RA04OJs9Md1SpaIaBDw6K/1sURGkEwiF6jBQLq7g4haWal4UNo0LQO+QUv3yPt+UdqwQZT+Ej9n0JdfVRaJA9apSChhvl9YMYs3mtPMffTzSq9wZt32OdJQLPT7Rbt1gP1CWivjNIUPj6908r4393Nz78WCWjudUw30cETKI2mRQKaXeKiXtyvKaDR5SgZxC+gghOnpXV3h3ipWm7+5K9FRc8XUF2G5wto0tJBQEX5S1ukDVo5B3kFapxs593j9ObmC2i6XKQXFj7p0A9T/XSjRdcuoCOdGk4Tc9MDDU9ZJqBi/01LLp6paBsPVPKtVvdAk2dXRINs5oHK3SEktabwinK38UBTOZonoLmveW9MwIVFcqVMpweq1WQLDzQZGu5Nq9OVWD59zs7StQho74pqAiqeOJ3ST+qNNdBkNSm4m0ud3XXY/cNT+V4sCmiwYmes2YWdHTkY4czlKV8tayWg3umdaLqFa6D+7ghrKS0fj0auWNtzC6jcR3UCmp2WrGHqHqh+R9EGreiC+na6l66B+rYNusoHt4J4dD6XHiPQT6/bwLwgAY03wU8SJiqgnjLdQ9f0N07cJ+j91u7jUUONXfhgkzBwLbX95WEbplpAgyz7nXB90yPyMPL92WdhcFub88GyQPhXTikfVCogm27ZLry3OxSDCEYWd6zVtvsEVOyjOfNdZdO8e2bC54HKzyoUn5GUvOZnrUXlBlXa08whW2QRO1jYuDOsMWMtlFc5z0nrR+e2fezxmkgsN8cXubDOatOiy3oO9AJBQBFQkJ4cXN2QK3dWqxa1fxMJAYWGg7zlu/AIaIu+WP0l9Y3ehW/WosbvwiOgAACAgAIAIKAAAAgoAAACelYqwtN5mJ5qvxiKK/urxnn7JM+sXGC/AwI6EL3J3lLvaoI0u5GeBDlnuMbSU+nrBsr0vKm6Hu0D49b1O8DFCGj/UlAf76M6EPKlu4FrFlQQwZUjDZ/xkalAvJsFxgXYtYAmYTqlVzmzKMv+0MtyyvwN0TgyntMHuth4tytGGi6XHsX0cxSkhHP2TLJNHc+qFL4SHb11u6VbCwjoCh5oFzDJehc+DpPsD72sR1nu1w3EcE2zHMMt493mh7eNNGyULhYkBj0J40up4ZxnC6hsz9FvTX7kQbI8wGULqOgVigLqOqgLqOzV/hG4qA0EVJzlrhPv1nIab84QabhckCfCqRgLytJHK5Vqz67Qhzh4lXFrALhoDzQLm7SFgHZpAv/XP3+3LrTt4t1mGrZ5pOGs9EJBbQW0vLuj2zM920oJcPlT+Cm88bYCmgS4WyqgW8a7zb7aPNKwUbrpIjcQ0HglszQFkI12H8eKZOET9iugkjcaxDleQUC7Emd4nekVer54t5mGbR1pOFdQO+plKKBpQTUCqqqnGBdS/lWKeEGah5Vg3wJ6krxuJXT8CaMpznGlW+oK0jwI9CIn9KzxbnOR2ijS8I1nGq/uF4kFVQhoUqPE5xdj7QYJ42jXp58c+3pT+fPLAGcX0POSrHse1xCmH5FfnbYRfNfb9PDUky0XQEA/HdGPyvXe6IYCeoYIvlddTwAEdGPiKfyG6ilMRC9Xlc5Xz2yqzlPugIACACCgAAAIKAAAIKAAAAgoAAACCgCAgAIAAAIKAICAAgAgoAAACCgAAAIKAAAIKAAAAgoAcCUC+vL28fHx/vpjb23+8fr+0fP20irlJzGdZiTFPMevrqSVADsV0EMxaxRiXPczUk5S69LbRaZbySAIKMAVTuH3IqCbKQUCCrATAT1crG+vnXf1/vpy+vtDndsGflhBcUKPbUyanp64dUHa4JvTBdorWOfZ+abc0XV/PC84Jf7YVkDLptML0w0yNjx0bMWDri5OGp3ZKsy1/1K0vP8mBXCtAtpdE8Hf6VpMro9Adgquh3hhaafnDteP17fhwJjyx6TuPscnrkMkmUn11vBAZxShe6Bhezs7HLMSD3q7WBXQY6KsN3TLH8UZAYVPLaDdBZH+lTUoVlNdUaQLWj3dnrEOddA9pmoJS8Wweg3UoRlC6W6pSQ2SuM9d1uLBF3cXK/YU70yW5RFQQEB9AppPL02XbJzyTVNw5XRBQIUtm6UCOn3OnMnKiahLDPM8U4NUCWj4eRTQ7OBiAU1UGQEFBLSlgM64WIY5oX56JqDRNLKVBzoeyCfjtS2bVbrcujkeaPfRXtVd4oFWCSgAAuqcwldNQ/P1O/X0bN6YLJY28kBPrufL63t6Zp0o+Myg51lewBUNEi53Dj2VH6wT0NMpvW88besl9TYsPyyrAiCgydVV2Bz/KC2BCiuG2unG7ny3f1wnoFrl8wveSGnkWVa/D2n9oWYJNX/aIdgaT5pTzFO7R46F9JvzQw5ZUxFQQEABAAABBQBAQAEAEFAAAAQUAAAQUAAABBQA4FIFlFdL/FxTmGQ/jUbI9NDqfAvODfTn6bjdXAirRQFvOxi0lKdxsJfLCAG9aAHdLPSnvyAxFtTiEWK8anoeAV2jmVsGcnVWt3WVWkXZ3c0rGAjopUvypxDQdl5sK3MhoGcV0N0E43YKaB4uNw2rWzng8ojIpxzGL4RXB+33EeXYGXlQ4aq35oPTpyyEQMXSvEmL8SzmaRjIEzu5ZGTx/dQkNnbpvU8lpTZC/NG1RQfUHyLa9QKxNj7zjqtspmuA+Y2sXR1KMjWIuBgrx9fvNR3nkgsjMI0RAb3NpOQiBDQLlysE69WCGymZ5hGRh5E4vu0+hsRwBWmOzD18UCMNOwV0ynSKomEFKhaiq2SRhqU86/wgV5hkxXSi5Zd7oFYzzY4z1MoZIjrseKMV9vgUows6mlk3wJxG1vrIvDYLAWD9/e4Pi14lF6KAWhHQr8sDjT9oEXyHAS27pKUC8ih11UGaJx8tVd8gT7+AhucP/WmOU+OTFFKzPEY8sZP1QPMF0824totz26CZ3o4zJxDxAMsPZsFLrKBT+vh0CqjrQlgsoO6JrtX4wi9VqVWq7DiPXFQcjG6qu9hHmiugeQTfUxzNl7cjL4VYutKPWJYDJ9tGDZV4nL7n9ayN2zR5i9J9oVpApTyrBNQZJlkznfLzoY0FtDK6tiCgvhDRFQJqjs/5AlozwGp8Cm8MMOVXacR44Y5+r+24lQR0P4+ytPBA+wi+/Yh8eetWZbopveUM5BGRNQGti8TZ1y5YLczrWTmFTwZSxc/PyQUJec72QI1lIrlhsuXXEdCa9Su7XXqI6AoBNcdnGw+0NMB8Rlb7aIEH6u73pVtlLQR0V8wSUDWC79trt9RyOHS4y7umxlNEZHWWWWHZYxbv7/GeQ1ZPOVTwLA1KfciygM74eZBy7OSS+1yyfNWKU5ay5GjPENCKENHJknJBQLXxKUbXdjSzboD5jKz2UWkubgxFf7/rHVeyrz0YMoOoAtqVsxsXdJ6A3kjBeoOGl2wgRUTW7s/OIM3yMJKDCiuhgm0PNH5ewIokbQ8R1x68bCojdnJ5KpjN4CfLKwU5q6SNkJqOs3fh7RDRwUauOfkTx6cRM9vZzKoB5jKy3keeS0NuUU2/23HN7cGhWEkwyGcR0H3R9LE24ZczF2e+Rp7wSdl64lv+ua7Px1UJaOMnx/L1zdZv3LTJExDQLS4t1PN6BXSlF2jj6XabsbpGnoCAAgIKAICAAgAgoAAAgIACACCgAAAIKAAAAgoAgIACAAACCgCAgAIAIKAAAAgoAAAc+B86KtU7hT6iaAAAAABJRU5ErkJggg=="},2930:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/enum-5-c9da1005565fda09175ddda67f9a16b5.png"},3101:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAABVCAIAAACtjoiqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTc6NTQ6NTUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjEzOjQxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjEzOjQxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmI1MzY2NDIxLTE0MDUt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"}}]); \ No newline at end of file diff --git a/assets/js/4232c3ed.32b73572.js b/assets/js/4232c3ed.32b73572.js new file mode 100644 index 00000000..87502edf --- /dev/null +++ b/assets/js/4232c3ed.32b73572.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8308],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>A});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var u=t.createContext({}),m=function(a){var e=t.useContext(u),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},d=function(a){var e=m(a.components);return t.createElement(u.Provider,{value:e},a.children)},o={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},k=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,u=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),k=m(n),A=i,s=k["".concat(u,".").concat(A)]||k[A]||o[A]||l;return n?t.createElement(s,r(r({ref:e},d),{},{components:n})):t.createElement(s,r({ref:e},d))}));function A(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=k;var p={};for(var u in e)hasOwnProperty.call(e,u)&&(p[u]=e[u]);p.originalType=a,p.mdxType="string"==typeof a?a:i,r[1]=p;for(var m=2;m{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>r,default:()=>o,frontMatter:()=>l,metadata:()=>p,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:26,title:"A.26. Enum",sidebar_label:"A.26. Enum"},r=void 0,p={unversionedId:"basic/enum",id:"basic/enum",title:"A.26. Enum",description:"Enum atau enumerated type adalah sebuah tipe data yang digunakan untuk menampung nilai konstan. Pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/enum.md",sourceDirName:"basic",slug:"/basic/enum",permalink:"/basic/enum",draft:!1,tags:[],version:"current",sidebarPosition:26,frontMatter:{sidebar_position:26,title:"A.26. Enum",sidebar_label:"A.26. Enum"},sidebar:"tutorialSidebar",previous:{title:"A.25. Method",permalink:"/basic/method"},next:{title:"A.27. Type Alias & Casting",permalink:"/basic/type-alias-casting"}},u={},m=[{value:"A.26.1. Keyword enum",id:"a261-keyword-enum",level:2},{value:"A.26.2. Naming convention enum",id:"a262-naming-convention-enum",level:2},{value:"A.26.3. Seleksi kondisi enum",id:"a263-seleksi-kondisi-enum",level:2},{value:"A.26.4. Keyword match",id:"a264-keyword-match",level:2},{value:"A.26.5. Enum value \u279c tuple struct-like",id:"a265-enum-value--tuple-struct-like",level:2},{value:"A.26.6. Enum value \u279c struct-like",id:"a266-enum-value--struct-like",level:2},{value:"A.26.7. Aturan pattern matching enum",id:"a267-aturan-pattern-matching-enum",level:2},{value:"A.26.8. Enum module & visibility",id:"a268-enum-module--visibility",level:2},{value:"A.26.9. Generic pada enum",id:"a269-generic-pada-enum",level:2},{value:"A.26.10. Pembahasan lanjutan pattern matching",id:"a2610-pembahasan-lanjutan-pattern-matching",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function o(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},d,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Enum atau ",(0,i.kt)("em",{parentName:"p"},"enumerated type")," adalah sebuah tipe data yang digunakan untuk menampung nilai konstan. Pada chapter ini kita akan mempelajarinya."),(0,i.kt)("p",null,"Enum ada sedikit kemiripan dengan konstanta, bedanya ada pada nilai atau ",(0,i.kt)("em",{parentName:"p"},"underlying value"),"-nya. Jika di konstanta, yang didefinisikan adalah nama beserta value-nya, di enum yang didefinisikan adalah tipe data enum dan enum value. Enum value ini bentuknya seperti variabel tanpa nilai (lebih tepatnya nama dari enum value tersebut adalah nilainya). Lebih jelasnya silakan ikut pembahasan chapter ini."),(0,i.kt)("h2",{id:"a261-keyword-enum"},"A.26.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"enum")),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"enum")," digunakan untuk membuat ",(0,i.kt)("em",{parentName:"p"},"enumerated type"),". Cara penulisannya seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum NamaEnum {\n NilaiEnum1,\n Nilai2,\n NilaiEnumKe3,\n // ...\n}\n")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"NamaEnum")," di atas adalah tipe data custom yang didefinisikan bertipe enum. Sedangkan ",(0,i.kt)("inlineCode",{parentName:"p"},"NilaiEnum1"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Nilai2"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"NilaiEnumKe3")," adalah yang disebut dengan enum value. Dengan itu maka ketiga enum values tersebut tipe datanya adalah sama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaEnum"),"."),(0,i.kt)("p",null,"Mari kita lanjut praktik. Berikut ini adalah definisi konstanta yang menggunakan tipe data string untuk menampung nilai konstan-nya. Lalu di bawahnya ada lagi definisi nilai konstan tetapi menggunakan enum sebagai tipe data yang digunakan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// definisi konstanta\nconst SuperheroSuperman: &str = "superman";\nconst SuperheroOmniMan: &str = "omniman";\nconst SuperheroHomelander: &str = "homelander";\nconst SuperheroHyperion: &str = "hyperion";\n\n// definisi enum\nenum Superhero {\n Superman,\n OmniMan,\n Homelander,\n Hyperion,\n};\n')),(0,i.kt)("p",null,"Di contoh bisa dilihat, ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," adalah tipe data enum baru. Dari tipe data tersebut dibuat 4 buah enum values, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Superman"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"OmniMan"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Homelander"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Hyperion"),"."),(0,i.kt)("p",null,"Pada pembuatan konstanta, tipe data beserta value-nya harus ditentukan di awal. Pada enum, yang perlu didefinisikan adalah tipe data enum-nya (sebagai contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),") kemudian diikut dengan enum value yang dituliskan tanpa pengisian nilai."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Definisi variabel dengan isi konstanta:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let value1: &str = SuperheroSuperman;\nlet value2 = SuperheroOmniMan;\n// ...\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Definisi variabel bertipe data enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),":"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let value3: Superhero = Superhero::Superman;\nlet value4 = Superhero::OmniMan;\n// ...\n")))),(0,i.kt)("p",null,"Notasi path digunakan dalam penulisan enum value dengan format ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaEnum::EnumValue")),(0,i.kt)("h2",{id:"a262-naming-convention-enum"},"A.26.2. ",(0,i.kt)("em",{parentName:"h2"},"Naming convention")," enum"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", upper camel case digunakan dalam penamaan Enum beserta value-nya."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Superhero {\n Superman,\n OmniMan,\n Homelander,\n Hyperion,\n};\n")),(0,i.kt)("h2",{id:"a263-seleksi-kondisi-enum"},"A.26.3. Seleksi kondisi enum"),(0,i.kt)("p",null,"Tipe data enum biasa dipakai pada seleksi kondisi, namun caranya sedikit berbeda. Default-nya keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," tidak bisa digunakan pada tipe data enum."),(0,i.kt)("p",null,"Pada contoh berikut, statement seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"value3")," menghasilkan error:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// seleksi kondisi pada konstanta\nif value1 == SuperheroSuperman {\n println!("hello superman!");\n}\n\n// seleksi kondisi pada enum\nif value3 == Superhero::Superman {\n println!("hello superman!");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(1179).Z,width:"859",height:"378"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Error tersebut muncul karena tipe data enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," tidak memiliki trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq"),". Lebih jelasnya mengenai trait dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),".")),(0,i.kt)("p",null,"Lalu bagaimana cara pengaplikasian seleksi kondisi pada tipe enum? Ada beberapa cara, namun yang paling praktis adalah keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("h2",{id:"a264-keyword-match"},"A.26.4. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"match")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"match")," adalah salah satu keyword untuk operasi seleksi kondisi di Rust. Penerapan keyword ini cukup luas, namun pada chapter ini hanya akan dibahas penerapannya yang relevan dengan topik enum."),(0,i.kt)("p",null,"Mari kita pelajarinya sembari praktik. Silakan buat package baru, lalu definisikan tipe enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Food")," berikut beserta 4 enum value-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Food {\n PenyetanTerangBulan,\n PizzaNanas,\n EsKrimIkanMujaer,\n MiGorengKuah,\n}\n")),(0,i.kt)("p",null,"Lalu buat sebuah variabel bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," untuk menampung salah satu nilai enum. Kemudian gunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk menerapkan operasi seleksi kondisi dengan aksi menampilkan sebuah pesan sesuai dengan nilai yang cocok."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let makanan_favorit: Food = Food::PenyetanTerangBulan;\n \n match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n Food::EsKrimIkanMujaer => {\n println!("I don\'t know what to say");\n },\n Food::MiGorengKuah => {\n println!("sometimes people do eat this, but it\'s ok");\n }\n }\n}\n')),(0,i.kt)("p",null,"Di atas bisa dilihat bagaimana cara penggunaan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk penerapan seleksi kondisi pada tipe data enum."),(0,i.kt)("p",null,"Notasi penulisannya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"}," match variabel_enum {\n TipeEnum::ValueEnum1 => {\n // ...\n },\n TipeEnum::ValueEnum2 => {\n // ...\n },\n \n // ...\n}\n")),(0,i.kt)("p",null,"Kembali ke contoh program, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," dicek nilainya menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PenyetanTerangBulan"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"your food taste is quite ... unique"\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PizzaNanas"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"it is morally wrong to have pineaple on top of pizza"\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::EsKrimIkanMujaer"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"I don\'t know what to say"\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Jika nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MiGorengKuah"),", muncul pesan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'"sometimes people do eat this, but it\'s ok"\n')))),(0,i.kt)("p",null,"Jalankan program untuk melihat hasilnya:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(5543).Z,width:"450",height:"82"})),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," ini sebenarnya tidak hanya digunakan untuk seleksi kondisi saja. Di Rust ada yang disebut dengan ",(0,i.kt)("em",{parentName:"p"},"pattern matching"),". Metode ",(0,i.kt)("em",{parentName:"p"},"pattern matching")," ini memahami ",(0,i.kt)("em",{parentName:"p"},"special syntax")," yang kegunaanya lebih luas dibanding hanya sekedar seleksi kondisi biasa."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"p"},"pattern matching")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h2",{id:"a265-enum-value--tuple-struct-like"},"A.26.5. Enum value \u279c ",(0,i.kt)("em",{parentName:"h2"},"tuple struct"),"-like"),(0,i.kt)("p",null,"Enum value di struct bisa juga didesain seperti ",(0,i.kt)("em",{parentName:"p"},"tuple struct"),". Sebagai contoh, enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Food")," di atas akan kita tambahi dengan satu enum value baru berbentuk ",(0,i.kt)("em",{parentName:"p"},"tuple struct"),"."),(0,i.kt)("p",null,"Silakan tambahkan enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"MakananLainnya")," berikut. Enum ini kita fungsikan untuk mengidentifikasi data makanan lainnya selain dari yang sudah ada di enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Food"),". Notasi penulisan ",(0,i.kt)("em",{parentName:"p"},"tuple struct")," ",(0,i.kt)("inlineCode",{parentName:"p"},"MakananLainnya(String)")," artinya enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"MakananLainnya")," didefinisikan untuk bisa menampung data property dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Food {\n PenyetanTerangBulan,\n PizzaNanas,\n EsKrimIkanMujaer,\n MiGorengKuah,\n MakananLainnya(String), // <---- enum value baru\n}\n")),(0,i.kt)("p",null,"Sekarang ubah isi variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," dengan enum value baru yang sudah dibuat. Syntax ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya(nasi_goreng)")," artinya enum value yang digunakan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," dengan isi property didapat dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"nasi_goreng"),"."),(0,i.kt)("p",null,"Tambahkan juga ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n // enum value MakananLainnya digunakan\n // dengan isi property adalah string "nasi goreng"\n let nasi_goreng = String::from("nasi goreng");\n let makanan_favorit = Food::MakananLainnya(nasi_goreng);\n \n match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n Food::EsKrimIkanMujaer => {\n println!("I don\'t know what to say. this should be illegal");\n },\n Food::MiGorengKuah => {\n println!("sometimes people do eat this, but it\'s ok");\n },\n Food::MakananLainnya(m) => { // <---- seleksi kondisi baru\n println!("do you like {m}? nice taste!");\n }\n }\n}\n')),(0,i.kt)("p",null,"Bisa dilihat ada keunikan dalam penulisan seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),". Di situ ada parameter bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"m")," yang parameter tersebut akan berisi data property jika memang ",(0,i.kt)("em",{parentName:"p"},"match")," dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit"),"."),(0,i.kt)("p",null,"Coba jalankan untuk melihat hasilnya:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(8424).Z,width:"462",height:"87"})),(0,i.kt)("p",null,"O iya, jumlah property value enum berbentuk ",(0,i.kt)("em",{parentName:"p"},"tuple struct")," ini tidak terbatas ya. Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MakananLainnya")," hanya memiliki 1 property. Lebih dari satu juga bisa."),(0,i.kt)("h2",{id:"a266-enum-value--struct-like"},"A.26.6. Enum value \u279c ",(0,i.kt)("em",{parentName:"h2"},"struct"),"-like"),(0,i.kt)("p",null,"Enum value bisa juga didesain memiliki property seperti ",(0,i.kt)("em",{parentName:"p"},"struct"),"."),(0,i.kt)("p",null,"Mari kita terapkan pada kode sebelumnya. Tambahkan 1 buah enum value lagi dengan nama ",(0,i.kt)("inlineCode",{parentName:"p"},"MieSetan")," yang ditulis dalam bentuk ",(0,i.kt)("em",{parentName:"p"},"struct"),"-like, dan memiliki 2 buah property."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Food {\n PenyetanTerangBulan,\n PizzaNanas,\n EsKrimIkanMujaer,\n MiGorengKuah,\n MakananLainnya(String),\n MieSetan { level_pedas: i32, pakek_piring: bool }\n}\n")),(0,i.kt)("p",null,"Setelah itu, isi variabel dengan nilai adalah enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan"),", level pedasnya 5, dan tanpa piring."),(0,i.kt)("p",null,"Tak lupa tambahkan seleksi kondisi untuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan")," pada blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let makanan_favorit = Food::MieSetan { \n level_pedas: 5,\n pakek_piring: false\n };\n \n match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n Food::EsKrimIkanMujaer => {\n println!("I don\'t know what to say. this should be illegal");\n },\n Food::MiGorengKuah => {\n println!("sometimes people do eat this, but it\'s ok");\n },\n Food::MakananLainnya(m) => {\n println!("do you like {m}? nice taste!");\n },\n Food::MieSetan { level_pedas, pakek_piring } => {\n if level_pedas > 3 {\n println!("mie setan lvl {} is too much!", level_pedas);\n } else {\n println!("mie setan lvl {} is perfect!", level_pedas);\n }\n\n if !pakek_piring {\n println!("how are you going to eat the food without a plate, huh?");\n }\n }\n }\n}\n')),(0,i.kt)("p",null,"Dalam seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan")," bisa dilihat ada beberapa statement. Kurang lebih jika nilai dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::MieSetan")," maka:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Akan memunculkan pesan yang berbeda tergantung level pedasnya"),(0,i.kt)("li",{parentName:"ul"},"Dan jika terdeteksi tidak menggunakan piring, dimunculkan pesan tambahan")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(6989).Z,width:"448",height:"98"})),(0,i.kt)("h2",{id:"a267-aturan-pattern-matching-enum"},"A.26.7. Aturan ",(0,i.kt)("em",{parentName:"h2"},"pattern matching")," enum"),(0,i.kt)("p",null,"Dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),", semua enum value harus dituliskan. Jika tidak, pasti muncul error. Contohnya bisa dilihat di gambar berikut, beberapa seleksi kondisi enum value di-remark, hasilnya ada error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(2930).Z,width:"1096",height:"309"})),(0,i.kt)("p",null,"Error tersebut sebenarnya bisa diantisipasi dengan menambahkan seleksi kondisi dengan penulisan seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match makanan_favorit {\n Food::PenyetanTerangBulan => {\n println!("your food taste is quite ... unique");\n },\n Food::PizzaNanas => {\n println!("it\'s morally wrong to have pineaple on top of pizza");\n },\n _ => {\n println!("never heard about that food");\n }\n}\n')),(0,i.kt)("p",null,"Menggunakan blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," di atas, jika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"makanan_favorit")," adalah selain ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PenyetanTerangBulan")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Food::PizzaNanas"),", maka pesan ",(0,i.kt)("inlineCode",{parentName:"p"},"never heard about that food")," adalah yang muncul di layar."),(0,i.kt)("p",null,"Selain variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," bisa juga menggunakan nama variabel apapun, misalnya ",(0,i.kt)("inlineCode",{parentName:"p"},"some_var"),". Namun jika variabel tersebut tidak digunakan dalam blok kode, akan muncul warning."),(0,i.kt)("h2",{id:"a268-enum-module--visibility"},"A.26.8. Enum module & visibility"),(0,i.kt)("p",null,"Mari kita coba cek perihal visibility dari enum. Siapkan package baru dengan struktur seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 constants.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("p",null,"Pada file ",(0,i.kt)("inlineCode",{parentName:"p"},"constants.rs"),", tambahkan enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Company")," berikut. Pastikan enum adalah publik dengan menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada deklarasinya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/constants.rs"',title:'"src/constants.rs"'},"pub enum Company {\n Apple,\n Microsoft,\n Google,\n Github\n}\n")),(0,i.kt)("p",null,"Kemudian tambahkan kode berikut di ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod constants;\n\nfn main() {\n let company = constants::Company::Apple;\n \n match company {\n constants::Company::Apple => {\n print!("apple")\n },\n _ => {\n print!("other than apple")\n }\n }\n}\n')),(0,i.kt)("p",null,"Jalankan, hasilnya tidak error, karena ",(0,i.kt)("inlineCode",{parentName:"p"},"Company")," didefinisikan publik."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Enum",src:n(3101).Z,width:"457",height:"85"})),(0,i.kt)("p",null,"Coba lakukan modifikasi dengan menghilangkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," saat definisi enum, hasilnya pasti error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada tipe data enum, keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," cukup ditambahkan pada definisi enum type, tidak perlu ditambahkan satu persatu di tiap enum values.")),(0,i.kt)("h2",{id:"a269-generic-pada-enum"},"A.26.9. Generic pada enum"),(0,i.kt)("p",null,"Pembahasan mengenai generic pada enum ada pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics#a368-generics-enum"},"Generics"),"."),(0,i.kt)("h2",{id:"a2610-pembahasan-lanjutan-pattern-matching"},"A.26.10. Pembahasan lanjutan ",(0,i.kt)("em",{parentName:"h2"},"pattern matching")),(0,i.kt)("p",null,"Pembahasan yang lebih mendetail tentang keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," dan ",(0,i.kt)("em",{parentName:"p"},"pattern matching")," ada pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/enum"},"github.com/novalagung/dasarpemrogramanrust-example/../enum")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang associated function dan method pada enum")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html"},"https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/custom_types/enum.html"},"https://doc.rust-lang.org/rust-by-example/custom_types/enum.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items/enumerations.html"},"https://doc.rust-lang.org/reference/items/enumerations.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch06-02-match.html"},"https://doc.rust-lang.org/book/ch06-02-match.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.enum.html"},"https://doc.rust-lang.org/std/keyword.enum.html"))))}o.isMDXComponent=!0},1179:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/enum-1-15c91a97fbd3c87f01a4c4c5060b5fd8.png"},5543:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABSCAIAAABIa0PlAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTU6MzM6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjU4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjU4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmM4OWNmODJhLTZlOGUt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"},8424:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc4AAABXCAIAAAACmjLYAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTY6MDM6MTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjA0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjEyOjA0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE4M2ZmNmJjLTg0ODgt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"},6989:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAABiCAIAAABI5JR1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTY6MjQ6NTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjE1OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjE1OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRjZWU1MjgyLTVmZjQt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"},2930:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/enum-5-c9da1005565fda09175ddda67f9a16b5.png"},3101:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAABVCAIAAACtjoiqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMzBUMTc6NTQ6NTUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTMwVDE4OjEzOjQxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTMwVDE4OjEzOjQxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmI1MzY2NDIxLTE0MDUt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"}}]); \ No newline at end of file diff --git a/assets/js/4513d9f5.6ce8fc47.js b/assets/js/4513d9f5.6ce8fc47.js deleted file mode 100644 index 1de1d2d6..00000000 --- a/assets/js/4513d9f5.6ce8fc47.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[5729],{3905:(a,e,t)=>{t.d(e,{Zo:()=>p,kt:()=>u});var i=t(7294);function n(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function l(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,i)}return t}function r(a){for(var e=1;e=0||(n[t]=a[t]);return n}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(n[t]=a[t])}return n}var c=i.createContext({}),s=function(a){var e=i.useContext(c),t=e;return a&&(t="function"==typeof a?a(e):r(r({},e),a)),t},p=function(a){var e=s(a.components);return i.createElement(c.Provider,{value:e},a.children)},d={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},o=i.forwardRef((function(a,e){var t=a.components,n=a.mdxType,l=a.originalType,c=a.parentName,p=m(a,["components","mdxType","originalType","parentName"]),o=s(t),u=n,k=o["".concat(c,".").concat(u)]||o[u]||d[u]||l;return t?i.createElement(k,r(r({ref:e},p),{},{components:t})):i.createElement(k,r({ref:e},p))}));function u(a,e){var t=arguments,n=e&&e.mdxType;if("string"==typeof a||n){var l=t.length,r=new Array(l);r[0]=o;var m={};for(var c in e)hasOwnProperty.call(e,c)&&(m[c]=e[c]);m.originalType=a,m.mdxType="string"==typeof a?a:n,r[1]=m;for(var s=2;s{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>m,toc:()=>s});var i=t(7462),n=(t(7294),t(3905));const l={sidebar_position:43,title:"A.43. Slice Memory Management",sidebar_label:"A.43. Slice Memory Management"},r=void 0,m={unversionedId:"basic/slice-memory-management",id:"basic/slice-memory-management",title:"A.43. Slice Memory Management",description:"Kita telah mempelajari tipe data Array dan Vector, serta sudah beberapa kali menggunakan tipe data string slice (String). 3 tipe data itu memiliki kemiripan, yaitu kesemuanya termasuk dalam kategori tipe data slice.",source:"@site/docs/basic/slice-memory-management.md",sourceDirName:"basic",slug:"/basic/slice-memory-management",permalink:"/basic/slice-memory-management",draft:!1,tags:[],version:"current",sidebarPosition:43,frontMatter:{sidebar_position:43,title:"A.43. Slice Memory Management",sidebar_label:"A.43. Slice Memory Management"},sidebar:"tutorialSidebar",previous:{title:"A.42. Lifetime",permalink:"/basic/lifetime"},next:{title:"A.44. String Literal (&str) vs. String Custom Type",permalink:"/basic/string-slice-vs-string-literal"}},c={},s=[{value:"A.43.1. Konsep slice",id:"a431-konsep-slice",level:2},{value:"A.43.2. Memory management pada slice",id:"a432-memory-management-pada-slice",level:2},{value:"A.43.2. Mutable slice",id:"a432-mutable-slice",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:s};function d(a){let{components:e,...l}=a;return(0,n.kt)("wrapper",(0,i.Z)({},p,l,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Kita telah mempelajari tipe data ",(0,n.kt)("a",{parentName:"p",href:"/basic/array"},"Array")," dan ",(0,n.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector"),", serta sudah beberapa kali menggunakan tipe data string slice (",(0,n.kt)("inlineCode",{parentName:"p"},"String"),"). 3 tipe data itu memiliki kemiripan, yaitu kesemuanya termasuk dalam kategori tipe data slice."),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Ciri khas dari tipe data yang termasuk dalam kategori slice adalah jika diakses reference-nya menghasilkan data bertipe ",(0,n.kt)("inlineCode",{parentName:"p"},"&[T]")," dimana ",(0,n.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data elemen.")),(0,n.kt)("p",null,"Pada chapter ini, kita akan bahas lebih dalam lagi tentang apa itu slice terutama bagian memory management-nya."),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Perbedaan chapter ini dengan chapter ini dengan chapter ",(0,n.kt)("a",{parentName:"p",href:"/basic/slice"},"Slice (Basic)")," adalah di sini fokusnya lebih banyak di memory management.")),(0,n.kt)("h2",{id:"a431-konsep-slice"},"A.43.1. Konsep slice"),(0,n.kt)("p",null,"Slice adalah representasi ",(0,n.kt)("em",{parentName:"p"},"block of memory")," berbentuk pointer dan memiliki size yang dinamis, dengan isi adalah koleksi element data. Slice merupakan reference atau data pinjaman (borrow)."),(0,n.kt)("p",null,"Pada program berikut, beberapa variabel dideklarasikan menggunakan tiga tipe data di atas, kemudian masing-masing data dipinjam kemudian di-print."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let data_arr = [1, 2, 3];\nprintln!("data_arr: {} {:?}", data_arr.len(), data_arr);\nlet slice1 = &data_arr[1..];\nprintln!("slice1 : {} {:?}", slice1.len(), slice1);\nlet slice2 = &data_arr[..2];\nprintln!("slice2 : {} {:?}", slice2.len(), slice2);\n\nlet data_vec = vec![1, 2, 3];\nprintln!("data_vec: {} {:?}", data_vec.len(), data_vec);\nlet slice1 = &data_vec[1..];\nprintln!("slice1 : {} {:?}", slice1.len(), slice1);\nlet slice2 = &data_vec[..2];\nprintln!("slice2 : {} {:?}", slice2.len(), slice2);\n\nlet data_str = String::from("sesuk prei jarene, mosokk");\nprintln!("data_str: {} {:?}", data_str.len(), data_str);\nlet slice1 = &data_str[1..];\nprintln!("slice1 : {} {:?}", slice1.len(), slice1);\nlet slice2 = &data_str[..2];\nprintln!("slice2 : {} {:?}", slice2.len(), slice2);\n')),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(456).Z,width:"302",height:"205"})),(0,n.kt)("p",null,"Terlihat kemiripan-nya, slice bisa terbentuk dari ketiga jenis data di atas."),(0,n.kt)("p",null,"Penulis ingatkan lagi, bahwa slice adalah tipe data reference yang berarti isi adalah data pinjaman (borrow). Tipe data slice selalu ",(0,n.kt)("inlineCode",{parentName:"p"},"&[T]")," dimana ",(0,n.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data element."),(0,n.kt)("p",null,"Karena slice adalah data borrow, maka operasi standar borrowing termasuk mutable borrowing bisa dilakukan di slice."),(0,n.kt)("h2",{id:"a432-memory-management-pada-slice"},"A.43.2. Memory management pada slice"),(0,n.kt)("p",null,"Sekarang lanjut ke pembahasan tentang bagaimana data bertipe slice di manage di-memory. Sebagai bahan belajar, kita perlu memilih satu dari 3 tipe data slice yang ada. Bebas sebenarnya mau pilih yang mana. Penulis memilih ",(0,n.kt)("inlineCode",{parentName:"p"},"String")," untuk memulai pembahasan."),(0,n.kt)("p",null,"Silakan perhatikan statement sederhana berikut:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let data_str = String::from("sesuk preiii");\n')),(0,n.kt)("p",null,"Ada sebuah data ",(0,n.kt)("inlineCode",{parentName:"p"},"String")," dideklarasikan, value-nya adalah ",(0,n.kt)("inlineCode",{parentName:"p"},"sesuk preiii"),", dan owner-nya adalah variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str"),". Data variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str")," disimpan di memory pada 2 tempat, yaitu ",(0,n.kt)("strong",{parentName:"p"},"heap")," dan ",(0,n.kt)("strong",{parentName:"p"},"stack"),"."),(0,n.kt)("p",null,"Selanjutnya, 2 buah slice tercipta hasil operasi slicing pada variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let data_str = String::from("sesuk preiii"); // "sesuk preiii"\nlet slice1 = &data_str[8..]; // "eiii"\nlet slice2 = &data_str[..5]; // "sesuk"\n')),(0,n.kt)("p",null,"Slice adalah data borrow, artinya jika ada beberapa variabel baru dibuat hasil dari operasi slicing, maka isi variabel tersebut merupakan reference yang mengarah ke data sebenarnya. Di heap memory tidak ada perubahan, namun di stack memory ada beberapa data baru. Lebih jelasnya silakan perhatikan ilustrasi berikut."),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(2236).Z,width:"739",height:"713"})),(0,n.kt)("p",null,"Sekarang di stack memory ada 3 buah metadata informasi disimpan, yaitu ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str")," (yang merupakan owner sebenarnya data), dan ",(0,n.kt)("inlineCode",{parentName:"p"},"slice1")," & ",(0,n.kt)("inlineCode",{parentName:"p"},"slice2"),". Sedangkan untuk data-nya sendiri tetap berada di heap memory tanpa ada perubahan."),(0,n.kt)("p",null,"Tiga variabel di atas kesemuanya mengakses reference yang sama, yang membedakan adalah elemen-nya saja. Owner (yaitu ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str"),") bisa mengakses seluruh data, selain itu juga tau informasi kapasitas data. Sedangkan borrower hanya bisa mengakses data yang dia pinjam sesuai dengan operasi slicing-nya. Borrower tidak mengetahui kapasitas data, namun ia tau size dari elemen yang ia pinjam."),(0,n.kt)("h2",{id:"a432-mutable-slice"},"A.43.2. Mutable slice"),(0,n.kt)("p",null,"Bagaimana dengan ",(0,n.kt)("em",{parentName:"p"},"mutability")," pada slice, apa yang terjadi di belakang layar ketika elemen slice nilainya diubah?"),(0,n.kt)("p",null,"Ok, mari kita bahas dengan contoh. Pada kode berikut ada sebuah data mutable array bertipe ",(0,n.kt)("inlineCode",{parentName:"p"},"[i32; 6]")," dengan owner bernama ",(0,n.kt)("inlineCode",{parentName:"p"},"numbers"),". Dari variabel tersebut, dilakukan operasi mutable borrowing untuk disimpan pada variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"n1"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let mut numbers = [24, 12, 8, 7, 9, 2];\nprintln!("numbers: {:?}", numbers);\nlet n1 = &mut numbers[2..];\nprintln!("n1 : {:?}", n1);\nn1[0] = 3022;\nprintln!("numbers: {:?}", numbers);\n')),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(743).Z,width:"409",height:"147"})),(0,n.kt)("p",null,"Salah satu elemen ",(0,n.kt)("inlineCode",{parentName:"p"},"n1")," diubah nilainya, maka efeknya juga berpengaruh pada owner. Ketika variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"numbers")," di-print, element indeks ",(0,n.kt)("inlineCode",{parentName:"p"},"2")," berubah nilainya dari yang sebelumnya ",(0,n.kt)("inlineCode",{parentName:"p"},"8")," sekarang ",(0,n.kt)("inlineCode",{parentName:"p"},"3022"),"."),(0,n.kt)("p",null,"Visualisasi memory management-nya kurang lebih seperti ini:"),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(7609).Z,width:"718",height:"1088"})),(0,n.kt)("p",null,"Variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"numbers")," dan ",(0,n.kt)("inlineCode",{parentName:"p"},"n1")," sama-sama mengarah ke reference yang sama. Itulah kenapa perubahan data pada peminjam membawa efek ke owner."),(0,n.kt)("hr",null),(0,n.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,n.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,n.kt)("pre",null,(0,n.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/slice_memory_management"},"github.com/novalagung/dasarpemrogramanrust-example/../slice_memory_management")),(0,n.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/array"},"Array")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/slice"},"Slice (Basic)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/vector"},"Vector")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/basic-memory-management"},"Basic Memory Management")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type"))),(0,n.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-03-slices.html"},"https://doc.rust-lang.org/book/ch04-03-slices.html")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://users.rust-lang.org/t/why-rust-slice-has-not-ownership/27356"},"https://users.rust-lang.org/t/why-rust-slice-has-not-ownership/27356"))))}d.isMDXComponent=!0},456:(a,e,t)=>{t.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS4AAADNCAIAAACJhQqMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF32lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTNUMTg6MDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjQ5OjQ1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjQ5OjQ1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg2OWExN2RkLTNmNzktNDI0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"},2236:(a,e,t)=>{t.d(e,{Z:()=>i});const i=t.p+"assets/images/slice-memory-management-2-97ee1868013eb53b825e4c59489aa236.png"},743:(a,e,t)=>{t.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAACTCAIAAADTK/NLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTRUMTQ6MjE6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjUwOjQ1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjUwOjQ1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ4M2Y1YjIzLTIwNGEt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"},7609:(a,e,t)=>{t.d(e,{Z:()=>i});const i=t.p+"assets/images/slice-memory-management-4-25a4c7b54f07cac6f773e2ff178a6d32.png"}}]); \ No newline at end of file diff --git a/assets/js/4513d9f5.f78b137f.js b/assets/js/4513d9f5.f78b137f.js new file mode 100644 index 00000000..dd98aa96 --- /dev/null +++ b/assets/js/4513d9f5.f78b137f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[5729],{3905:(a,e,t)=>{t.d(e,{Zo:()=>p,kt:()=>u});var i=t(7294);function n(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function l(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,i)}return t}function r(a){for(var e=1;e=0||(n[t]=a[t]);return n}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(n[t]=a[t])}return n}var c=i.createContext({}),s=function(a){var e=i.useContext(c),t=e;return a&&(t="function"==typeof a?a(e):r(r({},e),a)),t},p=function(a){var e=s(a.components);return i.createElement(c.Provider,{value:e},a.children)},d={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},o=i.forwardRef((function(a,e){var t=a.components,n=a.mdxType,l=a.originalType,c=a.parentName,p=m(a,["components","mdxType","originalType","parentName"]),o=s(t),u=n,k=o["".concat(c,".").concat(u)]||o[u]||d[u]||l;return t?i.createElement(k,r(r({ref:e},p),{},{components:t})):i.createElement(k,r({ref:e},p))}));function u(a,e){var t=arguments,n=e&&e.mdxType;if("string"==typeof a||n){var l=t.length,r=new Array(l);r[0]=o;var m={};for(var c in e)hasOwnProperty.call(e,c)&&(m[c]=e[c]);m.originalType=a,m.mdxType="string"==typeof a?a:n,r[1]=m;for(var s=2;s{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>r,default:()=>d,frontMatter:()=>l,metadata:()=>m,toc:()=>s});var i=t(7462),n=(t(7294),t(3905));const l={sidebar_position:43,title:"A.43. Slice Memory Management",sidebar_label:"A.43. Slice Memory Management"},r=void 0,m={unversionedId:"basic/slice-memory-management",id:"basic/slice-memory-management",title:"A.43. Slice Memory Management",description:"Kita telah mempelajari tipe data Array dan Vector, serta sudah beberapa kali menggunakan tipe data string slice (String). 3 tipe data itu memiliki kemiripan, yaitu kesemuanya termasuk dalam kategori tipe data slice.",source:"@site/docs/basic/slice-memory-management.md",sourceDirName:"basic",slug:"/basic/slice-memory-management",permalink:"/basic/slice-memory-management",draft:!1,tags:[],version:"current",sidebarPosition:43,frontMatter:{sidebar_position:43,title:"A.43. Slice Memory Management",sidebar_label:"A.43. Slice Memory Management"},sidebar:"tutorialSidebar",previous:{title:"A.42. Lifetime",permalink:"/basic/lifetime"},next:{title:"A.44. String Literal (&str) vs. String Custom Type",permalink:"/basic/string-slice-vs-string-literal"}},c={},s=[{value:"A.43.1. Konsep slice",id:"a431-konsep-slice",level:2},{value:"A.43.2. Memory management pada slice",id:"a432-memory-management-pada-slice",level:2},{value:"A.43.2. Mutable slice",id:"a432-mutable-slice",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:s};function d(a){let{components:e,...l}=a;return(0,n.kt)("wrapper",(0,i.Z)({},p,l,{components:e,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Kita telah mempelajari tipe data ",(0,n.kt)("a",{parentName:"p",href:"/basic/array"},"Array")," dan ",(0,n.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector"),", serta sudah beberapa kali menggunakan tipe data string slice (",(0,n.kt)("inlineCode",{parentName:"p"},"String"),"). 3 tipe data itu memiliki kemiripan, yaitu kesemuanya termasuk dalam kategori tipe data slice."),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Ciri khas dari tipe data yang termasuk dalam kategori slice adalah jika diakses reference-nya menghasilkan data bertipe ",(0,n.kt)("inlineCode",{parentName:"p"},"&[T]")," yang mana ",(0,n.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data elemen.")),(0,n.kt)("p",null,"Pada chapter ini, kita akan bahas lebih dalam lagi tentang apa itu slice terutama bagian memory management-nya."),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},"Perbedaan chapter ini dengan chapter ini dengan chapter ",(0,n.kt)("a",{parentName:"p",href:"/basic/slice"},"Slice (Basic)")," adalah di sini fokusnya lebih banyak di memory management.")),(0,n.kt)("h2",{id:"a431-konsep-slice"},"A.43.1. Konsep slice"),(0,n.kt)("p",null,"Slice adalah representasi ",(0,n.kt)("em",{parentName:"p"},"block of memory")," berbentuk pointer dan memiliki size yang dinamis, dengan isi adalah koleksi element data. Slice merupakan reference atau data pinjaman (borrow)."),(0,n.kt)("p",null,"Pada program berikut, beberapa variabel dideklarasikan menggunakan tiga tipe data di atas, kemudian masing-masing data dipinjam kemudian di-print."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let data_arr = [1, 2, 3];\nprintln!("data_arr: {} {:?}", data_arr.len(), data_arr);\nlet slice1 = &data_arr[1..];\nprintln!("slice1 : {} {:?}", slice1.len(), slice1);\nlet slice2 = &data_arr[..2];\nprintln!("slice2 : {} {:?}", slice2.len(), slice2);\n\nlet data_vec = vec![1, 2, 3];\nprintln!("data_vec: {} {:?}", data_vec.len(), data_vec);\nlet slice1 = &data_vec[1..];\nprintln!("slice1 : {} {:?}", slice1.len(), slice1);\nlet slice2 = &data_vec[..2];\nprintln!("slice2 : {} {:?}", slice2.len(), slice2);\n\nlet data_str = String::from("sesuk prei jarene, mosokk");\nprintln!("data_str: {} {:?}", data_str.len(), data_str);\nlet slice1 = &data_str[1..];\nprintln!("slice1 : {} {:?}", slice1.len(), slice1);\nlet slice2 = &data_str[..2];\nprintln!("slice2 : {} {:?}", slice2.len(), slice2);\n')),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(456).Z,width:"302",height:"205"})),(0,n.kt)("p",null,"Terlihat kemiripan-nya, slice bisa terbentuk dari ketiga jenis data di atas."),(0,n.kt)("p",null,"Penulis ingatkan lagi, bahwa slice adalah tipe data reference yang berarti isi adalah data pinjaman (borrow). Tipe data slice selalu ",(0,n.kt)("inlineCode",{parentName:"p"},"&[T]")," yang mana ",(0,n.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data element."),(0,n.kt)("p",null,"Karena slice adalah data borrow, maka operasi standar borrowing termasuk mutable borrowing bisa dilakukan di slice."),(0,n.kt)("h2",{id:"a432-memory-management-pada-slice"},"A.43.2. Memory management pada slice"),(0,n.kt)("p",null,"Sekarang lanjut ke pembahasan tentang bagaimana data bertipe slice di-manage di memory. Sebagai bahan belajar, kita perlu memilih satu dari 3 tipe data slice yang ada. Bebas sebenarnya mau pilih yang mana. Penulis memilih ",(0,n.kt)("inlineCode",{parentName:"p"},"String")," untuk memulai pembahasan."),(0,n.kt)("p",null,"Silakan perhatikan statement sederhana berikut:"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let data_str = String::from("sesuk preiii");\n')),(0,n.kt)("p",null,"Ada sebuah data ",(0,n.kt)("inlineCode",{parentName:"p"},"String")," dideklarasikan, value-nya adalah ",(0,n.kt)("inlineCode",{parentName:"p"},"sesuk preiii"),", dan owner-nya adalah variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str"),". Data variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str")," disimpan di memory pada 2 tempat, yaitu ",(0,n.kt)("strong",{parentName:"p"},"heap")," dan ",(0,n.kt)("strong",{parentName:"p"},"stack"),"."),(0,n.kt)("p",null,"Selanjutnya, 2 buah slice tercipta hasil operasi slicing pada variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let data_str = String::from("sesuk preiii"); // "sesuk preiii"\nlet slice1 = &data_str[8..]; // "eiii"\nlet slice2 = &data_str[..5]; // "sesuk"\n')),(0,n.kt)("p",null,"Slice adalah data borrow, artinya jika ada beberapa variabel baru dibuat hasil dari operasi slicing, maka isi variabel tersebut merupakan reference yang mengarah ke data sebenarnya. Di heap memory tidak ada perubahan, namun di stack memory ada beberapa data baru. Lebih jelasnya silakan perhatikan ilustrasi berikut."),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(2236).Z,width:"739",height:"713"})),(0,n.kt)("p",null,"Sekarang di stack memory ada 3 buah metadata informasi disimpan, yaitu ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str")," (yang merupakan owner sebenarnya data), dan ",(0,n.kt)("inlineCode",{parentName:"p"},"slice1")," & ",(0,n.kt)("inlineCode",{parentName:"p"},"slice2"),". Sedangkan untuk data-nya sendiri tetap berada di heap memory tanpa ada perubahan."),(0,n.kt)("p",null,"Tiga variabel di atas kesemuanya mengakses reference yang sama, yang membedakan adalah elemen-nya saja. Owner (yaitu ",(0,n.kt)("inlineCode",{parentName:"p"},"data_str"),") bisa mengakses seluruh data, selain itu juga tau informasi kapasitas data. Sedangkan borrower hanya bisa mengakses data yang dia pinjam sesuai dengan operasi slicing-nya. Borrower tidak mengetahui kapasitas data, namun ia tau size dari elemen yang ia pinjam."),(0,n.kt)("h2",{id:"a432-mutable-slice"},"A.43.2. Mutable slice"),(0,n.kt)("p",null,"Bagaimana dengan ",(0,n.kt)("em",{parentName:"p"},"mutability")," pada slice, apa yang terjadi di belakang layar ketika elemen slice nilainya diubah?"),(0,n.kt)("p",null,"Ok, mari kita bahas dengan contoh. Pada kode berikut ada sebuah data mutable array bertipe ",(0,n.kt)("inlineCode",{parentName:"p"},"[i32; 6]")," dengan owner bernama ",(0,n.kt)("inlineCode",{parentName:"p"},"numbers"),". Dari variabel tersebut, dilakukan operasi mutable borrowing untuk disimpan pada variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"n1"),"."),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre",className:"language-rust"},'let mut numbers = [24, 12, 8, 7, 9, 2];\nprintln!("numbers: {:?}", numbers);\nlet n1 = &mut numbers[2..];\nprintln!("n1 : {:?}", n1);\nn1[0] = 3022;\nprintln!("numbers: {:?}", numbers);\n')),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(743).Z,width:"409",height:"147"})),(0,n.kt)("p",null,"Salah satu elemen ",(0,n.kt)("inlineCode",{parentName:"p"},"n1")," diubah nilainya, maka efeknya juga berpengaruh pada owner. Ketika variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"numbers")," di-print, element indeks ",(0,n.kt)("inlineCode",{parentName:"p"},"2")," berubah nilainya dari yang sebelumnya ",(0,n.kt)("inlineCode",{parentName:"p"},"8")," sekarang ",(0,n.kt)("inlineCode",{parentName:"p"},"3022"),"."),(0,n.kt)("p",null,"Visualisasi memory management-nya kurang lebih seperti ini:"),(0,n.kt)("p",null,(0,n.kt)("img",{alt:"Slice memory management",src:t(7609).Z,width:"718",height:"1088"})),(0,n.kt)("p",null,"Variabel ",(0,n.kt)("inlineCode",{parentName:"p"},"numbers")," dan ",(0,n.kt)("inlineCode",{parentName:"p"},"n1")," sama-sama mengarah ke reference yang sama. Itulah kenapa perubahan data pada peminjam membawa efek ke owner."),(0,n.kt)("hr",null),(0,n.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,n.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,n.kt)("pre",null,(0,n.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/slice_memory_management"},"github.com/novalagung/dasarpemrogramanrust-example/../slice_memory_management")),(0,n.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/array"},"Array")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/slice"},"Slice (Basic)")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/vector"},"Vector")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/basic-memory-management"},"Basic Memory Management")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type"))),(0,n.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-03-slices.html"},"https://doc.rust-lang.org/book/ch04-03-slices.html")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://users.rust-lang.org/t/why-rust-slice-has-not-ownership/27356"},"https://users.rust-lang.org/t/why-rust-slice-has-not-ownership/27356"))))}d.isMDXComponent=!0},456:(a,e,t)=>{t.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAS4AAADNCAIAAACJhQqMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF32lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTNUMTg6MDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjQ5OjQ1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjQ5OjQ1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg2OWExN2RkLTNmNzktNDI0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"},2236:(a,e,t)=>{t.d(e,{Z:()=>i});const i=t.p+"assets/images/slice-memory-management-2-97ee1868013eb53b825e4c59489aa236.png"},743:(a,e,t)=>{t.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZkAAACTCAIAAADTK/NLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTRUMTQ6MjE6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjUwOjQ1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjUwOjQ1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ4M2Y1YjIzLTIwNGEt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"},7609:(a,e,t)=>{t.d(e,{Z:()=>i});const i=t.p+"assets/images/slice-memory-management-4-25a4c7b54f07cac6f773e2ff178a6d32.png"}}]); \ No newline at end of file diff --git a/assets/js/475d163e.4cbfe654.js b/assets/js/475d163e.60520781.js similarity index 97% rename from assets/js/475d163e.4cbfe654.js rename to assets/js/475d163e.60520781.js index 076312f9..82793d6c 100644 --- a/assets/js/475d163e.4cbfe654.js +++ b/assets/js/475d163e.60520781.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6403],{3905:(a,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>m});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var d=t.createContext({}),p=function(a){var e=t.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},u=function(a){var e=p(a.components);return t.createElement(d.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},o=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,d=a.parentName,u=A(a,["components","mdxType","originalType","parentName"]),o=p(n),m=i,c=o["".concat(d,".").concat(m)]||o[m]||k[m]||l;return n?t.createElement(c,r(r({ref:e},u),{},{components:n})):t.createElement(c,r({ref:e},u))}));function m(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=o;var A={};for(var d in e)hasOwnProperty.call(e,d)&&(A[d]=e[d]);A.originalType=a,A.mdxType="string"==typeof a?a:i,r[1]=A;for(var p=2;p{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>A,toc:()=>p});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:10,title:"A.10. Perulangan \u279c while",sidebar_label:"A.10. Perulangan \u279c while"},r=void 0,A={unversionedId:"basic/perulangan-while",id:"basic/perulangan-while",title:"A.10. Perulangan \u279c while",description:"Di Rust ada beberapa cara untuk melakukan perulangan, salah satunya adalah dengan menggunakan keyword while, dan pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/perulangan-while.md",sourceDirName:"basic",slug:"/basic/perulangan-while",permalink:"/basic/perulangan-while",draft:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_position:10,title:"A.10. Perulangan \u279c while",sidebar_label:"A.10. Perulangan \u279c while"},sidebar:"tutorialSidebar",previous:{title:"A.9. Seleksi Kondisi \u279c if, else if, else",permalink:"/basic/seleksi-kondisi-if"},next:{title:"A.11. Perulangan \u279c loop, break, continue, label",permalink:"/basic/perulangan-loop-break-continue-label"}},d={},p=[{value:"A.10.1. Keyword while",id:"a101-keyword-while",level:2},{value:"A.10.2. Nested while",id:"a102-nested-while",level:2},{value:"\u25c9 Macro print",id:"-macro-print",level:3},{value:"A.10.3. Keyword while let",id:"a103-keyword-while-let",level:2},{value:"A.10.4. Menambahkan delay dalam perulangan",id:"a104-menambahkan-delay-dalam-perulangan",level:2},{value:"\u25c9 Keyword use dan module dalam Rust",id:"-keyword-use-dan-module-dalam-rust",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:p};function k(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},u,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Di Rust ada beberapa cara untuk melakukan perulangan, salah satunya adalah dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"while"),", dan pada chapter ini kita akan mempelajarinya."),(0,i.kt)("p",null,"Perulangan sendiri merupakan teknik untuk mengulang-ulang eksekusi blok kode dengan kondisi tertentu. Perulangan akan terus menerus dieksekusi ketika kondisi perulangan nilainya ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", dan hanya akan berhenti kita nilainya ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("h2",{id:"a101-keyword-while"},"A.10.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"while")),(0,i.kt)("p",null,"Perulangan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," mengharuskan kondisi perulangan dituliskan di awal dengan notasi penulisan sebagai berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"while kondisi {\n \n}\n")),(0,i.kt)("p",null,"Contoh berikut adalah penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," untuk operasi perulangan yang isinya menampilkan angka ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," dengan kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," dibawah ",(0,i.kt)("inlineCode",{parentName:"p"},"max"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nwhile i < max {\n println!("nilai: {i}");\n i += 1;\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"keyword while",src:n(4735).Z,width:"463",height:"163"})),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," pada contoh di atas menjadi penentu kapan perulangan berhenti. Di dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," (yang dimana akan dieksekusi setiap kondisi menghasilkan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"), nilai variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," di-increment, membuat variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," nilainya selalu bertambah 1 setiap kali perulangan. Perulangan akan berhenti ketika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," sudah tidak dibawah ",(0,i.kt)("inlineCode",{parentName:"p"},"max")," lagi."),(0,i.kt)("h2",{id:"a102-nested-while"},"A.10.2. Nested ",(0,i.kt)("inlineCode",{parentName:"h2"},"while")),(0,i.kt)("p",null,"Penerapan nested while (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," di dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"while"),") cukup mudah, tulis saja statement ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," di dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," sesuai kebutuhan. Contoh bisa dilihat pada kode berikut, yaitu penerapan teknik nested while untuk print karakter ",(0,i.kt)("inlineCode",{parentName:"p"},"*")," membuat bentuk segitiga."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nwhile i < max {\n let mut j = 0;\n let max_inner = i;\n\n while j <= max_inner {\n print!("* ");\n j += 1;\n }\n \n println!();\n i += 1;\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"nested while",src:n(8423).Z,width:"448",height:"172"})),(0,i.kt)("h3",{id:"-macro-print"},"\u25c9 Macro ",(0,i.kt)("inlineCode",{parentName:"h3"},"print")),(0,i.kt)("p",null,"Macro ",(0,i.kt)("inlineCode",{parentName:"p"},"print")," kegunaannya mirip dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),", hanya saja tanpa ",(0,i.kt)("em",{parentName:"p"},"newline")," atau baris baru. Jadi semua string yang di-print menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"print")," akan muncul menyamping ke kanan dan tidak di baris baru. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'print!("* ");\nprint!("* ");\nprint!("* ");\nprint!("* ");\n')),(0,i.kt)("p",null,"Akan menghasilkan output:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"* * * * \n")),(0,i.kt)("h2",{id:"a103-keyword-while-let"},"A.10.3. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"while let")),(0,i.kt)("p",null,"Kita akan bahas keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"while let")," pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"),"."),(0,i.kt)("h2",{id:"a104-menambahkan-delay-dalam-perulangan"},"A.10.4. Menambahkan delay dalam perulangan"),(0,i.kt)("p",null,"Eksekusi statement perulangan pada program sangatlah cepat. Bisa jadi dalam 1 detik ada ribuan (atau bahkan jauh lebih banyak) statement dalam perulangan yang dieksekusi. Di-tiap eksekusinya, delay bisa saja ditambahkan, misalnya 1 detik, dan pada contoh di bawah ini kita akan coba mengaplikasikannya."),(0,i.kt)("p",null,"Silakan tulis kode program berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::thread::sleep;\nuse std::time::Duration;\n\nfn main() {\n let mut i = 0;\n let max = 5;\n\n while i < max {\n println!("nilai: {i}");\n i += 1;\n\n sleep(Duration::from_secs(1));\n }\n}\n')),(0,i.kt)("p",null,"Ada beberapa keyword baru dipergunakan pada source code di atas. Untuk sekarang coba jalankan terlebih dahulu program yang baru dibuat, kemudian stop. Text ",(0,i.kt)("inlineCode",{parentName:"p"},"nilai: {i}")," akan muncul di console setiap satu detik, dan hanya akan berhenti ketika program di stop."),(0,i.kt)("p",null,"Selanjutnya kita akan beberapa sintaks baru di atas."),(0,i.kt)("h3",{id:"-keyword-use-dan-module-dalam-rust"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"use")," dan module dalam Rust"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," memiliki banyak kegunaan. Pada contoh ini ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," difungsikan untuk ",(0,i.kt)("em",{parentName:"p"},"import module"),", yang di bahasa Rust dikenal dengan istilah ",(0,i.kt)("strong",{parentName:"p"},"import paths"),"."),(0,i.kt)("p",null,"Notasi penulisan ",(0,i.kt)("em",{parentName:"p"},"module path")," di Rust dinotasikan dengan separator ",(0,i.kt)("inlineCode",{parentName:"p"},"::"),", contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"std::thread::sleep")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use std::thread::sleep")," artinya path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::thread::sleep")," digunakan dalam kode program. ",(0,i.kt)("inlineCode",{parentName:"p"},"sleep")," adalah sebuah fungsi yang gunanya untuk menambahkan jeda dengan durasi sesuai keinginan, contohnya, 1 detik, 30 menit, dst.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use std::time::Duration")," artinya path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration")," digunakan dalam kode program. ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration")," merupakan sebuah struct yang isinya banyak hal untuk keperluan yang berhubungan dengan waktu atau ",(0,i.kt)("em",{parentName:"p"},"duration"),"."))),(0,i.kt)("p",null,"Pada contoh di atas, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"sleep")," dipanggil dalam blok kode perulangan agar ada jeda ditiap eksekusinya. Sedangkan durasi jedanya sendiri ditentukan oleh argument ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration::from_secs(1)")," yang artinya durasi ",(0,i.kt)("inlineCode",{parentName:"p"},"1 detik"),". Dengan ini durasi delay adalah 1 detik."),(0,i.kt)("p",null,"Jika ingin jeda durasi yang lebih lama, ubah saja angka ",(0,i.kt)("inlineCode",{parentName:"p"},"1")," pada ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration::from_secs(1)"),". Contoh: ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration::from_secs(5)")," berarti jeda 5 detik."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal path dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/path-item"},"Module System \u279c Pach & Item")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal keyword ",(0,i.kt)("inlineCode",{parentName:"li"},"use")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/use"},"Module System \u279c Use")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal fungsi dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal struct dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/struct"},"Struct")))),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/perulangan_while"},"github.com/novalagung/dasarpemrogramanrust-example/../perulangan_while")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-05-control-flow.html"},"https://doc.rust-lang.org/book/ch03-05-control-flow.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.while.html"},"https://doc.rust-lang.org/std/keyword.while.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.use.html"},"https://doc.rust-lang.org/std/keyword.use.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/while.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/while.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/stable/std/time/struct.Duration.html"},"https://doc.rust-lang.org/stable/std/time/struct.Duration.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/while-expr.html"},"https://doc.rust-lang.org/reference/expressions/while-expr.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/paths.html"},"https://doc.rust-lang.org/reference/paths.html"))))}k.isMDXComponent=!0},4735:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAACjCAIAAABjWwLpAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTM6NTE6NTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjE0OjMzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjE0OjMzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRmNTI4ZmIyLThmMzctNjc0Yi05NzliLTVjZjc0ZTYzZjAzYyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MWQ2Y2Q4ZS02OWNkLTM5NDEtODY0ZC00NzFmNmVjNzRkZTQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0MWQ2Y2Q4ZS02OWNkLTM5NDEtODY0ZC00NzFmNmVjNzRkZTQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQxZDZjZDhlLTY5Y2QtMzk0MS04NjRkLTQ3MWY2ZWM3NGRlNCIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNVQxMzo1MTo1OCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0ZjUyOGZiMi04ZjM3LTY3NGItOTc5Yi01Y2Y3NGU2M2YwM2MiIHN0RXZ0OndoZW49IjIwMjItMDktMjdUMTc6MTQ6MzMrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5hxaQAAAAahElEQVR4nO3dT2gb174H8J/sp8S5uugqyLWFCRPrGnTjkvI6wSXoeaGSjV4W3gwFgaEL77LX2iuvte8uC0NAULTJIngTqoUx4YU7hfY9F/HyZA8lqK5F9Pyq1omw9RYzI82MzhmdsaTjUfr9cOE28syc+aefjo5mvhNRFIUAAGDCZq57BQAA/hRQbQEAZEC1BQCQAdUWAEAGVFsAABlQbQEAZEC1BQCQAdUWAEAGVFsAABlQbQEAZEC1BQCQ4V+uewVG90lk8+8zH365+PbI/Hfkq4czN8z/PLt4duiYcj6yueKcEkQoOS2bihIRtWrlPX34DGq+kEkQEVGncVCppwPOPsJqztWZLaj5QibRaRxUqkZvUhmrdB3UfCF93tvSSc7U47Pnx9PQaKs3Ee5V8p5gvFnkVtsvP59dumn+5+VPr7r/HMtCu0REN271//3tqwtXzXVzTHnd3GVpkifTKOerUa0Y1ltKrKlMwlXEjECzyxBwiwT1a7hAERd6fwZcJpGS0zKxxsGeQc6Ti2jYCaYfNtJraYUM1xQTKHLshsje0Em/Ddw7pbdH5VRz/bAhsdp++fns0s1ekY18uUx0NI7lnnafnV6MeUoJrHdGuWoQqflCNq8aH0M3S4nHqFUP14boe+WJr5Caz6ba5ttXzRcyWq7Jffeq+UKGGo0OJce3TCIiJbeWosaBYxK7nig5LZvVcsSd3ag317KrKhmT3k+chpR0khq1RjLNqsTj4nzHjZfYCWbUZVXbu8szSzfp3Ztef7b73RERWd/urdfOLp4dRh4/nKGzy9vxGXp/+fb9zFKc6Ozi2a+RzZXI21+6S4szRETvL/e/7x77DBp4saacZy7TvUpEft1wR9fD+lhWctoava7PZc2PUPN0Z72orqairZp14PXDRjq7oBLxj5njU9nuAQy+xGio2V/FbKGQ7befL6TPD17TmvlX+33JaCaY5FxUaDpvQ0lv/4L7/XSgJ6LktGy1cuBerLVBQQYNxDqSar6Qof6f1XwhQ+WD83Si0zgwX9MPG+lsklc31Hz6/KBcpZyW8l0bUnLCyzQXvOqptX1GtZLMFzK9KqfmC94vINX6aiGdU/ShR3zwnLe3y73nXVP2X2Q2pKST0XZdr5Oz4+ucnToNTutqvrBw3oilUtFOo9ZMZvgdZCWdjHaadddfFPa7o+k89xwnImOVOCcY831kyKq2yVsRou4fv7tfdQ6kzkc2V2a/Wr5sE92+Sfs/XH7x2cx862L/j5n1RaJfiSiytNj96dXFPyny1cOZL5Yvjo+GDBo48Ka0lzkf2VyZ+XT+4vg08pW9SneXZ9YX6e0PvBEPJbdKr8tlg8x9vpZTjCoRRVPZdOOgXDZIzRcyeVXfazJePCHqnDftRRln7WwyrhCxz3U1X/B+Kjs/qJWcls3mVcPVkJLTsumcolcrBue7UjSVzbZq5bJuTkp6nbVM0d6O80zMFAoZ8qlZjJU/OO9k5pK8HeDU5E+ZyHi23RAfNHB0JJWcluV2JPWTVibT+2Q0u/KUXOi/kdV8NhUl4m2MvlchIhqeKp2cE14mEZG6kOg0D7i7r3neIZ8zzNyu4V1Lzjnf2/O9c15Xcmv2/hzWkJJORlt1nQy1nbX/4jgcpOYLaV7rZ0SJ1FytXFsoZDLm/3O2wqg311IpdxffYL872AeHuUqsE4z53tRJ3jUJ8ZuMFx98MkN0+T9HRER02n37nm4kiIg+tLrHvxNR9/TENX2va9wmupGI3B3Hijm62xT7K9E83bDbPf6t6zurUd2zD5BRb3aic9Y3w1bNOnD6SYticfaL+kkrmlpVzT+qeccQ2wCzk/Pa9d5XV1PRVt16yai+bnQSC+6GXKvE1mkc7Om9SZnLVH33gJNRrZTL5XKtRdSqlcvlcpnfPWQ0ZJy1rT/mC1pOMYtN/+PI2RBrysDbPrBOC4lWzVpho1pvRZNpTkHUD/s7RkknqXFob6aS0wqFQoZq5VqLYvGxxPSLLlOJx6h9xq+Uvb1GRKTvMY6Oftig3hnJXYzIOd87bdjnj7chJZ2Mtk50c2Zzvyu5dP9wDGu9Yx2BTv9IcNa9Uj5oUCpbKBTMMycIziox8N9Hsvq2Z+9paaDgMkuwgO4f7+n2qGvEcUofViK3/kL0u/VhcPY7d1rXFwuiFmuaKKtPFZ1TqbpXWyj0OoG1VmKB915JzkVZbyR2LQqg/7XK/ogffZnCbQ801DzvpOMKqQvUalvvYU71YE056voo8RglrKNhrWGDN61Rb66Z4z5KOknN1wZR0vFNgYiUnEbtk9GHBwMsc9gIjhKPEZ37TtLfLr/lDDvnm+cdmqPe6EWhkBkYlHI3ZPdsifr93vpVWx/GPNPNHmchn5zUFSmc95Gsatv8o0txq4pxRG7dJHovsrDIrZtEZ93j8a2ex+2V2c0VInfP10vNZ1Nkf73nflftsM5w82A4xtaVnMYvdPb56xF1fK8UHS0dZhLLFGzIOGtnF5LqXOz8sD63qirnMd4eYU05jnUSvhzMrhZK3Cq21DzvUKd5YM/O7ZcHEWyZnJPEpqSTzI9sl+GDtwLnvGM97RNczRe8X+D7DSnpZJSizg+6TppTbcXecSKM6uu05jd2NyLO+0jWSMLxUfcd0e2VyAPrhcjjZfru50uimb8vExHRPN0mevfz8EXdXY7cJnr360TW8+5y5AZd/vTq4tmri2evLl6c+k9unb9Kbi01WJrUfCbRadaZLzqPsZLTssnma+4pbtSbnUQm7/pSpp+0KJG2vg2ZQw1+PxI2zzv8r8Z+y5zIRz9/5eNxataN5nlsYXUu6lscPFOOukqsfew/dSyuppNt6wujUW92oqk1c5OUXNpxiM2hAJEvrp4pfZbJWqWzNn+gQc1nU1HH12A1XygUWBvb+yrvw/ecZ65n87zDbyg5F+00Dsq2g0YnmiTjrG0PQyg5zTnM5tu6ONenD/PdYe1Ma8ScfFaJsW2c95G8K8C6L15dPn44c+8h3SPzAgAi6u7/tbu+OLu5SET07s3Fi9PI4xXuIhxdzosXp+6LB+Kzmw/pwy8X3/7mfdG+pGFwSkYTx0fdTxftlSRHW4P0w0Y6aw8FNBqdlP1J2/tGan+BUpgvun4Br/iVNaNaoZyWtT/+O42DSlXfK1O+4Pgh1W6Is4TXaS1rTc3tw7GX6f31K9gdAezZWQ3ReSeTSjYOqmRQcy2b4n9+NIWnZLbeZK6Sex8PuSLDqNZXC5lUq1btvVChnL2Hfed1rlIqWyhkuVOLL5PI+vXOc22V86QTu/BJP2ykHVdoRVP2QbLWQPycd33ntw/xYENJz497Rr25ltJyzUqtZQ1DtGoHjfRabx5W60LcFyA7T+PBd0f/hU6j1uhk5ohI7w/99VcpwOlNRJEpeebufGRzZYZb+MbnwersvXj/kq8vP59dIvvKMBHM65YC3GwDcFXmd6SRr9KXdudWCG8RmzBZIwnTwv3DXeTWFX/HA5DOqL5ukD30cHX6XllOBZTWUGh8BDkJY/Xd947hDnLc8iCB56uOLXT38ktbz2nZIaFhXgewllOMP1cVmxbTMpIAADDdMJIAACADqi0AgAyotgAAMsz+7W9/u+51YJqPbH42+49o979a45hyPrL52eyd993/5t+GO9I6kJov/Nud/zs8/t8gy+cuKrd2//79+/f/MT+eJV6hfaGmxaccspRx7TqxZSo57d/vzf3nG+6tuYItCG+70BHtT3TnxojrJsXww6bmC/8aF92U8ZxLIXfN1yR4Qrm6b3+4/M5REMWTv0OUET4GE09VJqI/4/WO12IgXp3NvM1V6H7U678i1hlbzqUfNnyy1MZILCrTk7FA/ajP3oUvk77aJQxXgDGjaac0I/wjIJ69LSOlO6yEtz2M8eojGowtZwtyQdrVzyXRzHUrkKY3VyFDZwaR0WvYN2hzLMJQbb3Ek785aeLOO3qdF8z+NfLVyswN14v9JfSfV+ZNE+cbFnhsflay8qeDfIi6bkWz/9FkxZbTiBHjjGhkTlozMUKUvZ0H55MDBroezF3ntwcE7pISOxwWT/o1cyfrA9f88p60xkyRJyJmuM/VI9s56dfuoGtH2vyQwPj+1N69xG+IGVvODA4nGrgTeMhGiezPgZmDZa5b1IX+XDbjrJ3tpXRyt2gUYay24snfzCn7ceAetxfJGxz+cOaGWabnI5srs49/u3hBnoBzn7LLTBdmhVIz8qfHcfAGg8NpWMS4FfZc3mNHjLOzt1lpzVXGlI7Og5ovLJzY5ZqR0s3cdSMSPhxEjPRrdrpWfxRAyWnZVNtMcWU/ac17OJp2mSNXvHpzlMh2Tvo1M+TboIHAeEWvJllbxNpL3BD6wdhybnA4CcU4chLfB09vVgkNmLlur3A60aqXPRM5Nsxvi0YQhmsS4rObD83/9RLC2LzJ33w3FhmL8sx+dzlyg7pvzX7vKb0juv2JO+DcFztdmBlKzc+fHo03PHt4xLiVZR7shhbRtOYeNZ8heycwdkiAYGZxwofD/IMn/Zq3IQsJMnOuyag3O0P2nOdwsOPVR4ts5+GFfHsC4w32FoknqRM3tpy7Fb7hZL4CZMMHy3FXV1PO96A5c6GQSfQODJHPFl1dGPq2Qx4pFlT3P37pri86w8bYt94mb0WIaOmz2U3Hi1cNOLdwQqkZ+dMTIhKrGhV7Is1VqfkM1XpjYQFSuge5hgZSgmFYzvkFWvcLhm2edyhldsxYT7W6oklEtnNitr2B8aQwtkhJBzlGjJERn+Bw8n2y0XgEzHE3QyGdsWP2dzIlpxW0+EGlavhv0ZWFodqO2/HR5fERkfWU35lP5y+Y1bb5R5fi5LkK4svPR26eNcozmD89ISJx4BN9QIOr1poGdoiSE1yY/T4YJd1q8HC4ez7JuSg3jNw4a2dTdiHqCPwuJGT8ke3iMdusLVIoyNAk+9OJGxw+pmh139UJlOPuevyqm1FvrqXsg+OzRVcWhpGEiam3/B4sdnzU/UCRJffTzeqtLtHM4jwRRR77/lbGTBfmhlIP5E8H5M02ZhoeMe7KMheKGA9EyWn9MQQi4uwQ8WBmccEOh2ON0/3Ed+9ONkcn7Jzr8XRwxhHZzjxwQjHbzC3i7yVWQ/4jA4PB4cMemDaigDnuvntcXU1ZD0hzYEShX1kI+7bsjHDxKV0/bX34xcwdZ7bU/fbN5ebK7OZD69/v3ly8OLpMJ2aXVmY3V+jdm8t3KzMx3noy04UNXij1QP60OIOVbcxZJU7E+EDYs2e5A5cq9KKRTxjNuH7CdqZ0r6WivV+EyA5mZuwQ5q4bkfjhIOYOYexk85g5n+HivhzDue0B1pMTNS1uMP1aNGabvUU+Jy0jhH4gttw3ONz51DE29rkUYGeIZ64ruTVvx9a18oyraAa3aATIAAudcV+7jizzq/LsuTGldQdpcsKLv+IWBZgNd9A4fdQjCQCjcA+qCj1IMeTGs0WiseXmHWf8B+796YRwJAHsx0HJuYEXeByDE0Q04Rs7+zcdtCbVxPi2SOguMXU11R7bl/CPAkYSAABkwEgCAIAMqLYAADKg2gIAyPCn+pVs3pE4Mwbm7xqhegLs0AtufCcY9fKjP/PlPqwgK1/9X8V4uWKTWk3OIVbzhUzC8cNs4C0aqxC+uUYXvmp7d3lmfTHS++f4iqNlfLnj+p6ZrVTIk+ucuMawZ/2wkV4TSZybiMm07i5Lk9yroxw4TpAVvylPxDg7V+w6BdyiMeO9uaZa+Kqt6d2bixen9GB19t7i7OPfLl6cjmOhE8gdd0cUXz+j3lwblic6Ta0rjnxCNV8IFE8YYmGMGA9fNnzY3lwjC2u1Nf3z18t78RkiaxDALMH9AYHfWBHj4rnj7CkHY20vf3rVj2r0FYKwZ6NaXy1400AlxWxXjWGt8wPOdeaLrggR/bCRHhKVysjpHileffgxulp/WzSMxttQ0tv75o4MDPTTlZyWrVYO3IsdODuHf3UXeywNc0olp2VTZO8wNV9wRe0KLXO6hbvaPvhkhqj7x+9Ef+FNMhAxznyRnTvOnLIfRn53eWZ9kd7+IFhqKRxhz6SftDJp5/d5eTHbrNZZ206DAec6K/VcP3Ellhln7WwyrvDC+9R8odcP7jU+JF69t+O5+9NzjEivjxIHPhAK4FNfGCt/IJxe6JNzaB/ifkq3+KABMxteeEozx3AtpxiOEz3AMqddWK9JuL0yu/lw9t7Ny/1XrkTEQcyIcfHcce+U83SDuqcnRETHv/lFiAUhMeyZiPTDBqVW7Ugn2THb7tb52+4JOGe/qJ+0or2FqXm/uDAz3cl9m+jweHWBpGr3MRoxDpwdMc7Easg4a1t/zJvhVtyEQeaUgbd9YJ2ET0XOlPreQYNSqznHSRn09J5iYe3bvntjPbTmi+ULM6xWklP6sBK59Rei363nOJwFeig6h7ywZyKRp5NMMmbb2zpn212irIaicypVHbeatmq1VmKBd1t/co55z//I0areY6TmJxsQ7Gp7oKHmeScdV0hdoFbbKpScoAPWlKOuj3g2PH9KM1cs1bZDkEfLm58uYa22RESn3bd3aGkx8uBI/Lv8eNxemd1cIXL3fK9OZtizuRjW8KnXxGK2Xa2LbTuzIbPWOH68UXIav9BxPhzGH909mWUKNmSctbMLSXUudn5Yn1tVlfMYb4+wphzHOomfiuwp1Xw22aw1ks6H437Ug7UOYR1JMDmyvYmsMYEhId8jurscuUGXP726ePbq4tmrq10Lca1hzxb9xP5Gdh0x2/3Wh2+7FXDOfNG5XDPmjx8oxdqk4fHqLkLx6uOIAxfCX/l4nJp1o3keW1idi/pmeHmmHHWVfE4bT3Q3b0o1n0m06lW9nyI2/FT8eIS5b0t0fNT9YjFy+07k7vfdnz6he4uzm4vDQr6ZhBPKj4+6n/aeaUZE9rVoQVxv2LOl/2hpaTHbBrN13rYPNMRMPXf/Wl3xK2ueTbJiyznx6pwl8PenY9uYy2RFYosXYfbszNzx804mlWwcVMmg5lo2xf/8aApPycmGZ60S71QcwDrBzlbNqxB0sk8h8xk0osucesgAc3uwOnsv3r/k68vPZ5eI+xzJsRtvfPXk7rIQWU+/1pnXLSH1HD5y4e7byud+5m7k1k2i9/JaH2989eQuVxdZz/BdLA9wvVBt3b77/vLxQ8dIAv8B6ZMgNb56BNe5np67Kmyh21XS1nNadghgJAEAQIpwX5MAAPCxQLUFAJAB1RYAQAZUWwAAGVBtAQBkQLUFAJAB1RYAQAZUWwAAGVBtAQBkQLUFAJAB1RYAQIaxVNutUqVS2d1et/+9vr1bMZW2rjA7AMDHZyIZYPs7X+8TrW/vFhOTWLzT+vZuUTWTxevPteLTSbcHAHA1E8wAW9/eLSZeTrQCbpUqG2QW2a1SZWNBL329sz+55gAArky8b7u+vfuEvnmZKG6kiXo9yX7fcnjX0tEPbVt1kT/7VqmykfZf5vr2o3RbL5kTPK3oj4qZR+u0j3ILACEUaNw2phYftUqappX0dvrR9joR7e98bf576Mzr2xp9o2mapmklndQnAWdnyCRi7dpLs7hulYpqjGKJzJB5AACuR7BfyerPzW/q+y9r7aCVbX+naH/LF5n9aVHThEYhzJ/kNui59rxOC3fwWxsAhJLEJ+U4BhKIiOo+kwqLqcVi/bmmPTWXTyc/YhwBAEJJWrXdKhVV0kvazj6N63KFWqtN7VrJ7gBnErF2qzbyUgEAJkHq3Q0nP+8TEa1vP3H0cTm2SkMv191/WWvHrAFg8yczexQXACBsRuzbOkcHNiqVDao/14o11otPK/qj4kalskFEdV1vqwne7OJXjO3vfE3bu8VipVLsX+YAABBGeOYuAIAMyEkAAJAB1RYAQAZUWwAAGVBtAQBkQLUFAJAB1RYAQAakiQMAyDCRvu1IyV6BoVgDwBQYS07C06I2SmT4CLNvlSobpOttQtIiAITbNKeJ01bpUauk7dD2riq8GQAA12Ka08TpaRHJCAAwJYKNJDjSxJ+oiQxRgFq3v1O0pxaZfcTRCQCAcJnyNHEAgCkh7XpbO03cGkqQc7kCAEBYTHOaOADA9JjqNHHn7GqxUikiURwAwgpp4gAAMiAnAQBABlRbAAAZUG0BAGRAtQUAkAHVFgBABlRbAAAZkCYOACDDRHIS9ne+ttIUE5NYvIPj/oZgN0YAAMg11Wni69tPMrWStrNvxuHubtdwJxkAhNRUp4mbfWgiInr6Y31jI2AGJACAPFOdJg4AMDWC/UrmSBNvxxLBngW2v1O0v+aLzP60qGniA7FbpY10W69g3BYAwupjSBNf397dSNefaxizBYDwmvo08fXt3aJKegnXIwBAqE13mrhdanEpAgCE3VSniW9paoysIHEi6l/qAAAQNkgTBwCQATkJAAAyoNoCAMiAagsAIAOqLQCADKi2AAAyoNoCAMiANHEAABmmO018q1Qx8x8JaeIAEG4TvLthfXu3mHgpqQSub+8WMzXcSQYAYTXVaeIO+z+fFIMlQAIAyPSxpIlv3U+3ay/RsQWAsAo2butIE3+iBnwuzf5O0Z5aZHbBh5W5OscotgAQWtOeJt57NNn69m5l9w4GbgEgpKY+Tdx2lYf3AABIM91p4s7pNTVW/xGXgAFASE11mrhrbALX2wJAmCFNHABABuQkAADIgGoLACADqi0AgAyotgAAMqDaAgDIgGoLACAD0sQBAGSYSN92bMlegszqjnoNACE2llQawbyuCc2+vv1EPanX0wsjLAMAYMKmPk18ffuJSnrpx0TxkfCmAABIN+Vp4mat/QYxiwAQdsHGbR1p4oHjDfd3inZRFJn9aVHThnZstzTUWgCYDtOcJr5V2ljQS0XUWgCYAtKqrZ0mvrNPY3r4+db9NMWoWKkU7VeKlYqG3EUACCWJfVtPmviQvu3wX8lclzJslSqPWnhODgCE1lSniQMATA2kiQMAyICcBAAAGVBtAQBkQLUFAJAB1RYAQAZUWwAAGVBtAQBkQLUFAJAB1RYAQAZUWwAAGVBtAQBkQLUFAJAB1RYAQAZUWwAAGf4fy1jcLdY1NIcAAAAASUVORK5CYII="},8423:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAACsCAIAAABjBuuxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTU6MjQ6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjEzOjI0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjEzOjI0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIyZDhiYmNhLTZjOTct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"}}]); \ No newline at end of file +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6403],{3905:(a,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>m});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var d=t.createContext({}),p=function(a){var e=t.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},u=function(a){var e=p(a.components);return t.createElement(d.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},o=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,d=a.parentName,u=A(a,["components","mdxType","originalType","parentName"]),o=p(n),m=i,c=o["".concat(d,".").concat(m)]||o[m]||k[m]||l;return n?t.createElement(c,r(r({ref:e},u),{},{components:n})):t.createElement(c,r({ref:e},u))}));function m(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=o;var A={};for(var d in e)hasOwnProperty.call(e,d)&&(A[d]=e[d]);A.originalType=a,A.mdxType="string"==typeof a?a:i,r[1]=A;for(var p=2;p{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>A,toc:()=>p});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:10,title:"A.10. Perulangan \u279c while",sidebar_label:"A.10. Perulangan \u279c while"},r=void 0,A={unversionedId:"basic/perulangan-while",id:"basic/perulangan-while",title:"A.10. Perulangan \u279c while",description:"Di Rust ada beberapa cara untuk melakukan perulangan, salah satunya adalah dengan menggunakan keyword while, dan pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/perulangan-while.md",sourceDirName:"basic",slug:"/basic/perulangan-while",permalink:"/basic/perulangan-while",draft:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{sidebar_position:10,title:"A.10. Perulangan \u279c while",sidebar_label:"A.10. Perulangan \u279c while"},sidebar:"tutorialSidebar",previous:{title:"A.9. Seleksi Kondisi \u279c if, else if, else",permalink:"/basic/seleksi-kondisi-if"},next:{title:"A.11. Perulangan \u279c loop, break, continue, label",permalink:"/basic/perulangan-loop-break-continue-label"}},d={},p=[{value:"A.10.1. Keyword while",id:"a101-keyword-while",level:2},{value:"A.10.2. Nested while",id:"a102-nested-while",level:2},{value:"\u25c9 Macro print",id:"-macro-print",level:3},{value:"A.10.3. Keyword while let",id:"a103-keyword-while-let",level:2},{value:"A.10.4. Menambahkan delay dalam perulangan",id:"a104-menambahkan-delay-dalam-perulangan",level:2},{value:"\u25c9 Keyword use dan module dalam Rust",id:"-keyword-use-dan-module-dalam-rust",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:p};function k(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},u,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Di Rust ada beberapa cara untuk melakukan perulangan, salah satunya adalah dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"while"),", dan pada chapter ini kita akan mempelajarinya."),(0,i.kt)("p",null,"Perulangan sendiri merupakan teknik untuk mengulang-ulang eksekusi blok kode dengan kondisi tertentu. Perulangan akan terus menerus dieksekusi ketika kondisi perulangan nilainya ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", dan hanya akan berhenti kita nilainya ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("h2",{id:"a101-keyword-while"},"A.10.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"while")),(0,i.kt)("p",null,"Perulangan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," mengharuskan kondisi perulangan dituliskan di awal dengan notasi penulisan sebagai berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"while kondisi {\n \n}\n")),(0,i.kt)("p",null,"Contoh berikut adalah penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," untuk operasi perulangan yang isinya menampilkan angka ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," dengan kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," di bawah ",(0,i.kt)("inlineCode",{parentName:"p"},"max"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nwhile i < max {\n println!("nilai: {i}");\n i += 1;\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"keyword while",src:n(4735).Z,width:"463",height:"163"})),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," pada contoh di atas menjadi penentu kapan perulangan berhenti. Di dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," (yang mana akan dieksekusi setiap kondisi menghasilkan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"), nilai variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," di-increment, membuat variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," nilainya selalu bertambah 1 setiap kali perulangan. Perulangan akan berhenti ketika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," sudah tidak di bawah ",(0,i.kt)("inlineCode",{parentName:"p"},"max")," lagi."),(0,i.kt)("h2",{id:"a102-nested-while"},"A.10.2. Nested ",(0,i.kt)("inlineCode",{parentName:"h2"},"while")),(0,i.kt)("p",null,"Penerapan nested while (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," di dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"while"),") cukup mudah, tulis saja statement ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," di dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," sesuai kebutuhan. Contoh bisa dilihat pada kode berikut, yaitu penerapan teknik nested while untuk print karakter ",(0,i.kt)("inlineCode",{parentName:"p"},"*")," membuat bentuk segitiga."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut i = 0;\nlet max = 5;\n\nwhile i < max {\n let mut j = 0;\n let max_inner = i;\n\n while j <= max_inner {\n print!("* ");\n j += 1;\n }\n \n println!();\n i += 1;\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"nested while",src:n(8423).Z,width:"448",height:"172"})),(0,i.kt)("h3",{id:"-macro-print"},"\u25c9 Macro ",(0,i.kt)("inlineCode",{parentName:"h3"},"print")),(0,i.kt)("p",null,"Macro ",(0,i.kt)("inlineCode",{parentName:"p"},"print")," kegunaannya mirip dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),", hanya saja tanpa ",(0,i.kt)("em",{parentName:"p"},"newline")," atau baris baru. Jadi semua string yang di-print menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"print")," akan muncul menyamping ke kanan dan tidak di baris baru. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'print!("* ");\nprint!("* ");\nprint!("* ");\nprint!("* ");\n')),(0,i.kt)("p",null,"Akan menghasilkan output:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"* * * * \n")),(0,i.kt)("h2",{id:"a103-keyword-while-let"},"A.10.3. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"while let")),(0,i.kt)("p",null,"Kita akan bahas keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"while let")," pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"),"."),(0,i.kt)("h2",{id:"a104-menambahkan-delay-dalam-perulangan"},"A.10.4. Menambahkan delay dalam perulangan"),(0,i.kt)("p",null,"Eksekusi statement perulangan pada program sangatlah cepat. Bisa jadi dalam 1 detik ada ribuan (atau bahkan jauh lebih banyak) statement dalam perulangan yang dieksekusi. Di-tiap eksekusinya, delay bisa saja ditambahkan, misalnya 1 detik, dan pada contoh di bawah ini kita akan coba mengaplikasikannya."),(0,i.kt)("p",null,"Silakan tulis kode program berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::thread::sleep;\nuse std::time::Duration;\n\nfn main() {\n let mut i = 0;\n let max = 5;\n\n while i < max {\n println!("nilai: {i}");\n i += 1;\n\n sleep(Duration::from_secs(1));\n }\n}\n')),(0,i.kt)("p",null,"Ada beberapa keyword baru dipergunakan pada source code di atas. Untuk sekarang coba jalankan terlebih dahulu program yang baru dibuat, kemudian stop. Text ",(0,i.kt)("inlineCode",{parentName:"p"},"nilai: {i}")," akan muncul di console setiap satu detik, dan hanya akan berhenti ketika program di stop."),(0,i.kt)("p",null,"Selanjutnya kita akan beberapa sintaks baru di atas."),(0,i.kt)("h3",{id:"-keyword-use-dan-module-dalam-rust"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"use")," dan module dalam Rust"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," memiliki banyak kegunaan. Pada contoh ini ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," difungsikan untuk ",(0,i.kt)("em",{parentName:"p"},"import module"),", yang di bahasa Rust dikenal dengan istilah ",(0,i.kt)("strong",{parentName:"p"},"import paths"),"."),(0,i.kt)("p",null,"Notasi penulisan ",(0,i.kt)("em",{parentName:"p"},"module path")," di Rust dinotasikan dengan separator ",(0,i.kt)("inlineCode",{parentName:"p"},"::"),", contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"std::thread::sleep")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use std::thread::sleep")," artinya path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::thread::sleep")," digunakan dalam kode program. ",(0,i.kt)("inlineCode",{parentName:"p"},"sleep")," adalah sebuah fungsi yang gunanya untuk menambahkan jeda dengan durasi sesuai keinginan, contohnya, 1 detik, 30 menit, dst.")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use std::time::Duration")," artinya path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration")," digunakan dalam kode program. ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration")," merupakan sebuah struct yang isinya banyak hal untuk keperluan yang berhubungan dengan waktu atau ",(0,i.kt)("em",{parentName:"p"},"duration"),"."))),(0,i.kt)("p",null,"Pada contoh di atas, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"sleep")," dipanggil dalam blok kode perulangan agar ada jeda ditiap eksekusinya. Sedangkan durasi jedanya sendiri ditentukan oleh argument ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration::from_secs(1)")," yang artinya durasi ",(0,i.kt)("inlineCode",{parentName:"p"},"1 detik"),". Dengan ini durasi delay adalah 1 detik."),(0,i.kt)("p",null,"Jika ingin jeda durasi yang lebih lama, ubah saja angka ",(0,i.kt)("inlineCode",{parentName:"p"},"1")," pada ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration::from_secs(1)"),". Contoh: ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration::from_secs(5)")," berarti jeda 5 detik."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal path dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/path-item"},"Module System \u279c Pach & Item")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal keyword ",(0,i.kt)("inlineCode",{parentName:"li"},"use")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/use"},"Module System \u279c Use")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal fungsi dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya perihal struct dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/struct"},"Struct")))),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/perulangan_while"},"github.com/novalagung/dasarpemrogramanrust-example/../perulangan_while")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-05-control-flow.html"},"https://doc.rust-lang.org/book/ch03-05-control-flow.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.while.html"},"https://doc.rust-lang.org/std/keyword.while.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.use.html"},"https://doc.rust-lang.org/std/keyword.use.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/while.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/while.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/stable/std/time/struct.Duration.html"},"https://doc.rust-lang.org/stable/std/time/struct.Duration.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/while-expr.html"},"https://doc.rust-lang.org/reference/expressions/while-expr.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/paths.html"},"https://doc.rust-lang.org/reference/paths.html"))))}k.isMDXComponent=!0},4735:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAACjCAIAAABjWwLpAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTM6NTE6NTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjE0OjMzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjE0OjMzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRmNTI4ZmIyLThmMzct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"},8423:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAACsCAIAAABjBuuxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjVUMTU6MjQ6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjEzOjI0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjEzOjI0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIyZDhiYmNhLTZjOTct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"}}]); \ No newline at end of file diff --git a/assets/js/4c7e7ada.9f072125.js b/assets/js/4c7e7ada.9f072125.js new file mode 100644 index 00000000..bcd46f84 --- /dev/null +++ b/assets/js/4c7e7ada.9f072125.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[2706],{3905:(e,a,n)=>{n.d(a,{Zo:()=>s,kt:()=>k});var i=n(7294);function t(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function r(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);a&&(i=i.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,i)}return n}function l(e){for(var a=1;a=0||(t[n]=e[n]);return t}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}var u=i.createContext({}),d=function(e){var a=i.useContext(u),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},s=function(e){var a=d(e.components);return i.createElement(u.Provider,{value:a},e.children)},o={inlineCode:"code",wrapper:function(e){var a=e.children;return i.createElement(i.Fragment,{},a)}},p=i.forwardRef((function(e,a){var n=e.components,t=e.mdxType,r=e.originalType,u=e.parentName,s=m(e,["components","mdxType","originalType","parentName"]),p=d(n),k=t,b=p["".concat(u,".").concat(k)]||p[k]||o[k]||r;return n?i.createElement(b,l(l({ref:a},s),{},{components:n})):i.createElement(b,l({ref:a},s))}));function k(e,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var r=n.length,l=new Array(r);l[0]=p;var m={};for(var u in a)hasOwnProperty.call(a,u)&&(m[u]=a[u]);m.originalType=e,m.mdxType="string"==typeof e?e:t,l[1]=m;for(var d=2;d{n.r(a),n.d(a,{assets:()=>u,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>m,toc:()=>d});var i=n(7462),t=(n(7294),n(3905));const r={sidebar_position:20,title:"A.20. Module System \u279c Module",sidebar_label:"A.20. Module System \u279c Module"},l=void 0,m={unversionedId:"basic/module-basic",id:"basic/module-basic",title:"A.20. Module System \u279c Module",description:"Module adalah salah satu chapter yang cukup penting dalam pemrograman Rust. Pada bagian ini kita akan mempelajari dasarnya.",source:"@site/docs/basic/module-basic.md",sourceDirName:"basic",slug:"/basic/module-basic",permalink:"/basic/module-basic",draft:!1,tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_position:20,title:"A.20. Module System \u279c Module",sidebar_label:"A.20. Module System \u279c Module"},sidebar:"tutorialSidebar",previous:{title:"A.19. Module System \u279c Package & Crate",permalink:"/basic/package-crate"},next:{title:"A.21. Module System \u279c Inline Module",permalink:"/basic/module-inline"}},u={},d=[{value:"A.20.1. Rust module system",id:"a201-rust-module-system",level:2},{value:"A.20.2. Praktik #1 - nama_module.rs",id:"a202-praktik-1---nama_modulers",level:2},{value:"\u25c9 Summary praktik #1",id:"-summary-praktik-1",level:3},{value:"\u25c9 Naming convention module",id:"-naming-convention-module",level:3},{value:"\u25c9 Module item",id:"-module-item",level:3},{value:"A.20.3. Praktik #2 - nama_module/mod.rs",id:"a203-praktik-2---nama_modulemodrs",level:2},{value:"\u25c9 Summary praktik #2",id:"-summary-praktik-2",level:3},{value:"\u25c9 Konversi string ke numerik",id:"-konversi-string-ke-numerik",level:3},{value:"A.20.4. Submodules",id:"a204-submodules",level:2},{value:"\u25c9 Summary praktik #3",id:"-summary-praktik-3",level:3},{value:"A.20.5. Penerapan keyword use",id:"a205-penerapan-keyword-use",level:2},{value:"A.20.6. Module path attribute",id:"a206-module-path-attribute",level:2},{value:"\u25c9 Summary praktik #4",id:"-summary-praktik-4",level:3},{value:"A.20.7. Pembahasan lanjutan",id:"a207-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:d};function o(e){let{components:a,...r}=e;return(0,t.kt)("wrapper",(0,i.Z)({},s,r,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Module adalah salah satu chapter yang cukup penting dalam pemrograman Rust. Pada bagian ini kita akan mempelajari dasarnya."),(0,t.kt)("h2",{id:"a201-rust-module-system"},"A.20.1. Rust module system"),(0,t.kt)("p",null,"Setiap bahasa pemrograman memiliki caranya sendiri dalam hal pengelolahan struktur files dan folder dalam project. Project yang isinya ada sangat banyak hal diatur sedemikian rupa menjadi beberapa bagian dan/atau sub-bagian sesuai dengan fungsinya masing-masing."),(0,t.kt)("p",null,"Di Rust, module memiliki hirarki (biasa disebut dengan ",(0,t.kt)("em",{parentName:"p"},"module tree"),") yang ",(0,t.kt)("em",{parentName:"p"},"root"),"/akarnya adalah file entrypoint crate, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," untuk ",(0,t.kt)("em",{parentName:"p"},"binary crate")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs")," untuk ",(0,t.kt)("em",{parentName:"p"},"library crate"),". Kedua file ini biasa disebut dengan ",(0,t.kt)("em",{parentName:"p"},"crate root file"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Di sini pembahasan akan fokus pada penerapan module dalam ",(0,t.kt)("em",{parentName:"p"},"binary crate"),". Kita belum masuk ke pembahasan tentang ",(0,t.kt)("em",{parentName:"p"},"library crate"),".")),(0,t.kt)("p",null,"Rust memiliki 2 jenis modul, yaitu ",(0,t.kt)("em",{parentName:"p"},"normal module")," dan ",(0,t.kt)("em",{parentName:"p"},"inline module"),". Pembahasan dimulai dengan normal module terlebih dahulu."),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mod")," digunakan untuk mendefinisikan/mendaftarkan sebuah module. Nama module menjadi path di mana isi module atau ",(0,t.kt)("em",{parentName:"p"},"module item")," harus berada. Sebagai contoh:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"module yang didefinisikan dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", maka item-nya harus berada pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"module yang didefinisikan dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", maka item-nya harus berada pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io/mod.rs"))),(0,t.kt)("p",null,"Pendefinisian nama module sendiri berada pada file entrypoint ",(0,t.kt)("em",{parentName:"p"},"crate")," yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," (atau ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs")," untuk library crate). Jadi pendefinisian nama module dan isi/item-nya terpisah."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Nama module ditulis di ",(0,t.kt)("inlineCode",{parentName:"li"},"main.rs")," (atau ",(0,t.kt)("inlineCode",{parentName:"li"},"lib.rs")," untuk library crate)"),(0,t.kt)("li",{parentName:"ul"},"Item atau isi module ditulis dalam file ",(0,t.kt)("inlineCode",{parentName:"li"},"nama_module.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"li"},"nama_module/mod.rs"))),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Sebenarnya ada beberapa hal lainnya lagi yang masih relevan yang perlu dibahas di-awal, yaitu perihal sub-module. Akan tetapi agar tidak makin bingung, mari kita lanjut ke praktik terlebih dahulu.")),(0,t.kt)("h2",{id:"a202-praktik-1---nama_modulers"},"A.20.2. Praktik #1 - ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module.rs")),(0,t.kt)("p",null,"Mari buat program sederhana, yang isinya mencakup pembahasan tentang module. Pada program kecil ini, inputan user ditampung ke sebuah variabel, kemudian ditampilkan ke layar. Proses pembacaan inputan user akan di-split sebagai module."),(0,t.kt)("p",null,"Ok, langsung saja, buat package/project baru dengan nama bebas. Di sini penulis menggunakan nama package ",(0,t.kt)("inlineCode",{parentName:"p"},"module_1"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"cargo new module_1\n")),(0,t.kt)("p",null,"Setelah itu siapkan 1 buah file bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io.rs"),", letakan di dalam folder ",(0,t.kt)("inlineCode",{parentName:"p"},"src")," (1 level dengan file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"). File ini difungsikan sebagai tempat definisi ",(0,t.kt)("em",{parentName:"p"},"module item")," milik sebuah module bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," (io di sini kependekan dari ",(0,t.kt)("em",{parentName:"p"},"input output"),")."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"module_1\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2514\u2500\u2500\u2500 my_io.rs\n")),(0,t.kt)("p",null,"Lanjut, definisikan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," di file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io.rs"),", isinya kurang lebih adalah kode untuk membaca inputan user lalu mengembalikannya dalam bentuk ",(0,t.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_io.rs"',title:'"src/my_io.rs"'},'pub fn read_entry() -> String {\n let mut message = std::string::String::new();\n let stdin_reader = std::io::stdin(); \n let reader_res = stdin_reader.read_line(&mut message);\n\n if reader_res.is_err() {\n println!("error! {:?}", reader_res.err());\n }\n\n message.trim().to_string()\n}\n')),(0,t.kt)("p",null,"Ok, kita telah menyiapkan satu item milik module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," yaitu sebuah fungsi bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry"),". 1 hal yang sedikit berbeda pada definisi fungsi di atas adalah penambahan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," yang ditulis sebagai prefix definisi fungsi."),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," digunakan untuk menjadikan suatu item menjadi ",(0,t.kt)("strong",{parentName:"p"},"public"),", agar bisa diakses dari luar module."),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," ini berada dalam module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io"),". Jika tidak ada keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," di situ, maka fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," hanya bisa diakses dari dalam ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," saja, tidak bisa diakses dari luar module contohnya seperti dari ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),". Dengan menjadikan ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," sebagai fungsi yang public, maka fungsi tersebut bisa diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,t.kt)("p",null,"Isi module sudah siap, selanjutnya lanjut ke pendefinisian modul. Umumnya pada bahasa pemrograman, definisi module adalah ada dalam file di mana isi module berada, namun tidak untuk Rust."),(0,t.kt)("p",null,"Di Rust, definisi sebuah module (sekali lagi bukan item/isinya ya, tapi definisi dari module itu sendiri) dituliskan pada file terpisah, yaitu di file entrypoint crate, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs"),"."),(0,t.kt)("p",null,"Lanjut, sekarang buka file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," dan tulis definisi modul ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," menggunakan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"mod my_io"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"// definisi module my_io\nmod my_io;\n\n// fungsi main\nfn main() {\n // ...\n}\n")),(0,t.kt)("p",null,"Sekarang aplikasikan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," milik module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," di fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," untuk membaca inputan user."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod my_io;\n\nfn main() {\n println!("enter any number:");\n let message = my_io::read_entry();\n println!("your number: {}", message);\n}\n')),(0,t.kt)("p",null,"Jalankan program, masukan sebuah angka, lalu enter. Lihat hasilnya, program berjalan sesuai harapan."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust module",src:n(5152).Z,width:"762",height:"717"})),(0,t.kt)("p",null,"Cara pengaksesan item dari sebuah module yang kita definisikan sendiri adalah sama seperti pengaksesan item dari crate lainnya, yaitu menggunakan ",(0,t.kt)("em",{parentName:"p"},"path"),". Statement ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io::read_entry()")," artinya item ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," yang merupakan fungsi dalam module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," digunakan."),(0,t.kt)("h3",{id:"-summary-praktik-1"},"\u25c9 Summary praktik #1"),(0,t.kt)("p",null,"Pada praktik pertama ini kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," untuk meng-export atau menjadikan item menjadi public, agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"))),(0,t.kt)("h3",{id:"-naming-convention-module"},"\u25c9 ",(0,t.kt)("em",{parentName:"h3"},"Naming convention")," module"),(0,t.kt)("p",null,"Sesuai anjuran di ",(0,t.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", aturan penulisan nama module adalah menggunakan snake case, contohnya ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io"),"."),(0,t.kt)("h3",{id:"-module-item"},"\u25c9 Module item"),(0,t.kt)("p",null,"Module item adalah apapun yang didefinisikan di dalam sebuah module. Pada contoh praktik ke-1 di atas, module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," memiliki 1 buah item yaitu fungsi bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry"),"."),(0,t.kt)("p",null,"Selain fungsi, module item bisa dalam bentuk lainnya, contohnya: konstanta, submodule, struct, dan lainnya."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang macam-macam item dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/path-item"},"Module System \u279c Path & Item"))),(0,t.kt)("h2",{id:"a203-praktik-2---nama_modulemodrs"},"A.20.3. Praktik #2 - ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module/mod.rs")),(0,t.kt)("p",null,"Bagian ini merupakan kelanjutan dari praktik sebelumnya. Program sederhana yang sudah di-buat ditambahi beberapa hal. Data inputan user dikonversi ke bentuk angka untuk kemudian dicek apakah angka tersebut bilangan ganjil atau genap."),(0,t.kt)("p",null,"Fungsi untuk konversi string ke bentuk numerik dan juga untuk pengecekan bilangan ganjil genap, adalah dua buah item milik module bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," yang akan kita definisikan sebentar lagi."),(0,t.kt)("p",null,"Definisi item module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," menggunakan notasi penulisan file ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," (yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io.rs"),"). Pada module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," ini kita akan gunakan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs")," (menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),") untuk menampung definisi item module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"module_1\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 my_number\n \u2502 \u2514\u2500\u2500\u2500 mod.rs\n \u2502\u2500\u2500\u2500 main.rs\n \u2514\u2500\u2500\u2500 my_io.rs\n")),(0,t.kt)("p",null,"Ok, sekarang buat saja folder dan filenya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),". Lalu pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"mod.rs")," tulis 2 buah fungsi berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi untuk konversi string ke numerik ",(0,t.kt)("inlineCode",{parentName:"p"},"i32")),(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"pub fn string_to_number(text: String) -> i32 {\n return text.parse::().unwrap();\n}\n"))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi untuk pengecekan bilangan ganjil"),(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"// ...\n\npub fn is_odd_number(number: i32) -> bool {\n number % 2 == 1\n}\n")))),(0,t.kt)("p",null,"Kemudian tulis definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," dalam file entrypoint crate, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"// definisi module my_io\nmod my_io;\n\n// definisi module my_number\nmod my_number;\n\n// fungsi main\nfn main() {\n // ...\n}\n")),(0,t.kt)("p",null,"Terakhir, aplikasikan dua buah fungsi yang sudah didefinisikan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'fn main() {\n println!("enter any number:");\n let message = my_io::read_entry();\n println!("your number: {}", message);\n\n let number = my_number::string_to_number(message);\n let result = my_number::is_odd_number(number);\n println!("is odd number: {}", result);\n}\n')),(0,t.kt)("p",null,"Jalankan program, lihat hasilnya."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust module",src:n(7050).Z,width:"777",height:"872"})),(0,t.kt)("h3",{id:"-summary-praktik-2"},"\u25c9 Summary praktik #2"),(0,t.kt)("p",null,"Hingga praktik ke-2 ini, kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," untuk meng-export atau menjadikan item menjadi public, agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"),", ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::string_to_number"),", dan ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::is_odd_number"))),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Penerapan notasi penulisan isi module ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs")," bisa diterapkan dalam satu package")),(0,t.kt)("h3",{id:"-konversi-string-ke-numerik"},"\u25c9 Konversi string ke numerik"),(0,t.kt)("p",null,"Rust mengenal beberapa jenis konversi antar tipe data. Teknik konversi yang kita praktikkan pada chapter ini menggunakan method ",(0,t.kt)("inlineCode",{parentName:"p"},".parse()"),", cara ini bisa dilakukan untuk konversi tipe data dari custom types ke primitive. Contohnya seperti di atas, dari ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,t.kt)("p",null,"Penggunaannya cukup mudah, akses saja method ",(0,t.kt)("inlineCode",{parentName:"p"},".parse()")," kemudian sisipkan tipe data sebagai parameter generic. Lalu chain dengan method ",(0,t.kt)("inlineCode",{parentName:"p"},"unwrap")," (yang method tersebut merupakan item milik tipe data ",(0,t.kt)("em",{parentName:"p"},"generic result type")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"Result"),")."),(0,t.kt)("p",null,"Contoh lain untuk konversi dari tipe primitif lainnya bisa dilihat berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let data_number = "24".parse::().unwrap();\nlet data_bool = "true".parse::().unwrap();\nlet data_float = "3.14".parse::().unwrap();\n')),(0,t.kt)("p",null,"Method ",(0,t.kt)("inlineCode",{parentName:"p"},"parse")," menghasilkan data bertipe ",(0,t.kt)("em",{parentName:"p"},"generic result type")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"Result"),". Tipe ini memiliki method bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"unwrap")," yang berguna untuk mengambil nilai."),(0,t.kt)("blockquote",null,(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai casting dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/type-alias-casting"},"Type Alias & Casting")," dan ",(0,t.kt)("a",{parentName:"li",href:"#/wip/trait-conversion-from-into"},"Trait \u279c Conversion (From & Into)")),(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai generic dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai result type dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")))),(0,t.kt)("h2",{id:"a204-submodules"},"A.20.4. Submodules"),(0,t.kt)("p",null,"Sampai bagian ini kita telah belajar tentang module beserta 2 macam cara penerapannya."),(0,t.kt)("p",null,"Sebuah module bisa saja memiliki module di bawahnya (biasa disebut submodule), dan hal ini adalah konsep yang umum dalam bahasa pemrograman. Di Rust, aturan dalam pembuatan submodule masih sama seperti module, perbedaannya adalah tempat di mana submodule didefinisikan. Jika pada root module definisi ada pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs"),", maka pada submodule definisi ada pada file di mana ",(0,t.kt)("em",{parentName:"p"},"parent module")," berada."),(0,t.kt)("p",null,"Sebagai contoh jika pada program sebelumnya kita tambahkan module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," yang sudah dibuat, jika ada submodule dengan nama ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility"),", maka definisi module berada di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs")," dan itemnya di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility/mod.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion_utility\n \u2514\u2500\u2500\u2500 mod.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("p",null,"Atau definisi module tetap di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs")," namun itemnya di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion_utility.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Penerapan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," biasanya dalam case ketika module tersebut tidak memiliki submodule."),(0,t.kt)("p",{parentName:"blockquote"},"Untuk module yang memiliki submodule, parent module harus menerapkan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs"),", hal ini karena pendefinisian submodule berada pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"mod.rs")," dalam parent module tersebut.")),(0,t.kt)("p",null,"Lalu bagaimana jika sebuah submodule memiliki submodule yang memiliki submodule ... dst, aturannya tetap sama seperti aturan submodule."),(0,t.kt)("p",null,"Mari lanjut praktik agar tidak bingung. Kita akan modifikasi program sebelumnya. Item ",(0,t.kt)("inlineCode",{parentName:"p"},"string_to_number")," yang sebelumnya adalah item milik ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," kita pindah ke sebuah module baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility")," yang merupakan submodule dari ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number"),". Silakan buat file baru ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility/mod.rs"),", kemudian isi dengan fungsi berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/conversion_utility/mod.rs"',title:'"src/my_number/conversion_utility/mod.rs"'},"pub fn string_to_number(text: String) -> i32 {\n return text.parse::().unwrap();\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"string_to_number")," yang sebelumnya ada di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs")," silakan dihapus."),(0,t.kt)("p",null,"Kemudian pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),", tambahkan definisi submodule ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility"),". Isi file tersebut kurang lebih menjadi seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"pub mod conversion_utility;\n\npub fn is_odd_number(number: i32) -> bool {\n number % 2 == 1\n}\n")),(0,t.kt)("p",null,"O iya, karena submodule merupakan sebuah item milik module, maka harus ditambahkan juga keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", agar submodule bisa diakses dari luar scope-nya. Contoh penerapannya bisa dilihat di atas."),(0,t.kt)("p",null,"Terakhir, pada ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),", ubah pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"string_to_number")," dari ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"let number = my_number::string_to_number(message);\n")),(0,t.kt)("p",null,"... menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"let number = my_number::conversion_utility::string_to_number(message);\n")),(0,t.kt)("p",null,"Kurang lebih strukturnya menjadi seperti berikut:"),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust submodule",src:n(3749).Z,width:"940",height:"955"})),(0,t.kt)("p",null,"Jalankan program untuk mengetest hasilnya."),(0,t.kt)("h3",{id:"-summary-praktik-3"},"\u25c9 Summary praktik #3"),(0,t.kt)("p",null,"Hingga pembahasan pada praktik submodule, kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan submodule dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion_utility"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion.rs")," yang di-import menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"path")," attribute."),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada fungsi agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada submodule agar bisa diakses dari luar parent module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"),", ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::conversion_utility::string_to_number"),", dan ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::is_odd_number"))),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Penerapan notasi penulisan isi module ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs")," bisa diterapkan dalam satu package")),(0,t.kt)("h2",{id:"a205-penerapan-keyword-use"},"A.20.5. Penerapan keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"use")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"use")," bisa digunakan untuk meng-import module atau item tertentu, dan dengannya pengaksesan item menjadi lebih pendek. Contohnya:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"my_number::conversion_utility::string_to_number(message);\n")),(0,t.kt)("p",null,"... bisa dituliskan menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"use my_number::conversion_utility::string_to_number;\nstring_to_number(message);\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"use")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/use"},"Module System \u279c Use"))),(0,t.kt)("h2",{id:"a206-module-path-attribute"},"A.20.6. Module ",(0,t.kt)("inlineCode",{parentName:"h2"},"path")," attribute"),(0,t.kt)("p",null,"Selain menggunakan dua teknik definisi module item di atas yang fokusnya ada pada penamaan file, ada juga cara lain pendefinisian module item, yaitu dengan memanfaatkan ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute."),(0,t.kt)("p",null,"Mari kita praktikkan, silakan ubah struktur package yang sudah dibuat dari ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion_utility.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("p",null,"... menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("p",null,"Yang telah kita lakukan adalah me-rename file ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility.rs")," menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion.rs"),". Efeknya akan muncul error dalam pengaksesan module item, karena submodule ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility")," isi/item-nya harus berada pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility/mod.rs"),". Sedangkan file ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion.rs")," tidak memenuhi kriteria tersebut."),(0,t.kt)("p",null,"Sekarang buka isi file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),", lalu ubah statement pendefinisian submodule dari ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"pub mod conversion_utility;\n")),(0,t.kt)("p",null,"... menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},'#[path = "conversion.rs"]\npub mod conversion_utility;\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust module",src:n(6827).Z,width:"690",height:"365"})),(0,t.kt)("p",null,"Lalu run, dan program akan jalan normal tanpa error."),(0,t.kt)("p",null,"Statement ",(0,t.kt)("inlineCode",{parentName:"p"},'#[path = "conversion.rs"]')," di atas merupakan contoh penerapan dari Rust path attributes. Dengannya kita bisa menempatkan isi sebuah module pada file yang namanya bebas (pada contoh di atas, file bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion.rs"),")."),(0,t.kt)("h3",{id:"-summary-praktik-4"},"\u25c9 Summary praktik #4"),(0,t.kt)("p",null,"Hingga pembahasan pada praktik module ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute, kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan submodule dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion_utility"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion_utility/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada fungsi agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada submodule agar bisa diakses dari luar parent module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"),", ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::conversion_utility::string_to_number"),", dan ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::is_odd_number"))),(0,t.kt)("h2",{id:"a207-pembahasan-lanjutan"},"A.20.7. Pembahasan lanjutan"),(0,t.kt)("p",null,"Pembahasan topik module dilanjutkan pada beberapa chapter lain. Pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/module-inline"},"Module System \u279c Inline Module")," kita akan bahas secara mendetail mengenai apa itu inline module dan perbedaannya dibanding normal module. Lalu nantinya di cahpter ",(0,t.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy")," akan dibahas secara lengkap mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," dan kontrol privasi lainnya di pemrograman Rust."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/module"},"github.com/novalagung/dasarpemrogramanrust-example/../module")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html"},"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.pub.html"},"https://doc.rust-lang.org/std/keyword.pub.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.mod.html"},"https://doc.rust-lang.org/std/keyword.mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/mod.html"},"https://doc.rust-lang.org/rust-by-example/mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"},"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"))))}o.isMDXComponent=!0},5152:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-1-0eea2521d2399e73e455b90f5c2f97fa.png"},7050:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-2-d8f6f3862036da93c4b7920e144a3a3f.png"},3749:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-3-b8f34c47b905cadb9001a866ebb80809.png"},6827:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-4-e83e7a2e8d7d6d4d11ec121d6dc184d0.png"}}]); \ No newline at end of file diff --git a/assets/js/4c7e7ada.f4643a6f.js b/assets/js/4c7e7ada.f4643a6f.js deleted file mode 100644 index b45a3da2..00000000 --- a/assets/js/4c7e7ada.f4643a6f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[2706],{3905:(e,a,n)=>{n.d(a,{Zo:()=>s,kt:()=>k});var i=n(7294);function t(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function r(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);a&&(i=i.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,i)}return n}function l(e){for(var a=1;a=0||(t[n]=e[n]);return t}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}var u=i.createContext({}),d=function(e){var a=i.useContext(u),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},s=function(e){var a=d(e.components);return i.createElement(u.Provider,{value:a},e.children)},o={inlineCode:"code",wrapper:function(e){var a=e.children;return i.createElement(i.Fragment,{},a)}},p=i.forwardRef((function(e,a){var n=e.components,t=e.mdxType,r=e.originalType,u=e.parentName,s=m(e,["components","mdxType","originalType","parentName"]),p=d(n),k=t,b=p["".concat(u,".").concat(k)]||p[k]||o[k]||r;return n?i.createElement(b,l(l({ref:a},s),{},{components:n})):i.createElement(b,l({ref:a},s))}));function k(e,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var r=n.length,l=new Array(r);l[0]=p;var m={};for(var u in a)hasOwnProperty.call(a,u)&&(m[u]=a[u]);m.originalType=e,m.mdxType="string"==typeof e?e:t,l[1]=m;for(var d=2;d{n.r(a),n.d(a,{assets:()=>u,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>m,toc:()=>d});var i=n(7462),t=(n(7294),n(3905));const r={sidebar_position:20,title:"A.20. Module System \u279c Module",sidebar_label:"A.20. Module System \u279c Module"},l=void 0,m={unversionedId:"basic/module-basic",id:"basic/module-basic",title:"A.20. Module System \u279c Module",description:"Module adalah salah satu chapter yang cukup penting dalam pemrograman Rust. Pada bagian ini kita akan mempelajari dasarnya.",source:"@site/docs/basic/module-basic.md",sourceDirName:"basic",slug:"/basic/module-basic",permalink:"/basic/module-basic",draft:!1,tags:[],version:"current",sidebarPosition:20,frontMatter:{sidebar_position:20,title:"A.20. Module System \u279c Module",sidebar_label:"A.20. Module System \u279c Module"},sidebar:"tutorialSidebar",previous:{title:"A.19. Module System \u279c Package & Crate",permalink:"/basic/package-crate"},next:{title:"A.21. Module System \u279c Inline Module",permalink:"/basic/module-inline"}},u={},d=[{value:"A.20.1. Rust module system",id:"a201-rust-module-system",level:2},{value:"A.20.2. Praktik #1 - nama_module.rs",id:"a202-praktik-1---nama_modulers",level:2},{value:"\u25c9 Summary praktik #1",id:"-summary-praktik-1",level:3},{value:"\u25c9 Naming convention module",id:"-naming-convention-module",level:3},{value:"\u25c9 Module item",id:"-module-item",level:3},{value:"A.20.3. Praktik #2 - nama_module/mod.rs",id:"a203-praktik-2---nama_modulemodrs",level:2},{value:"\u25c9 Summary praktik #2",id:"-summary-praktik-2",level:3},{value:"\u25c9 Konversi string ke numerik",id:"-konversi-string-ke-numerik",level:3},{value:"A.20.4. Submodules",id:"a204-submodules",level:2},{value:"\u25c9 Summary praktik #3",id:"-summary-praktik-3",level:3},{value:"A.20.5. Penerapan keyword use",id:"a205-penerapan-keyword-use",level:2},{value:"A.20.6. Module path attribute",id:"a206-module-path-attribute",level:2},{value:"\u25c9 Summary praktik #4",id:"-summary-praktik-4",level:3},{value:"A.20.7. Pembahasan lanjutan",id:"a207-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:d};function o(e){let{components:a,...r}=e;return(0,t.kt)("wrapper",(0,i.Z)({},s,r,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Module adalah salah satu chapter yang cukup penting dalam pemrograman Rust. Pada bagian ini kita akan mempelajari dasarnya."),(0,t.kt)("h2",{id:"a201-rust-module-system"},"A.20.1. Rust module system"),(0,t.kt)("p",null,"Setiap bahasa pemrograman memiliki caranya sendiri dalam hal pengelolahan struktur files dan folder dalam project. Project yang isinya ada sangat banyak hal diatur sedemikian rupa menjadi beberapa bagian dan/atau sub-bagian sesuai dengan fungsinya masing-masing."),(0,t.kt)("p",null,"Di Rust, module memiliki hirarki (biasa disebut dengan ",(0,t.kt)("em",{parentName:"p"},"module tree"),") yang ",(0,t.kt)("em",{parentName:"p"},"root"),"/akarnya adalah file entrypoint crate, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," untuk ",(0,t.kt)("em",{parentName:"p"},"binary crate")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs")," untuk ",(0,t.kt)("em",{parentName:"p"},"library crate"),". Kedua file ini biasa disebut dengan ",(0,t.kt)("em",{parentName:"p"},"crate root file"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Di sini pembahasan akan fokus pada penerapan module dalam ",(0,t.kt)("em",{parentName:"p"},"binary crate"),". Kita belum masuk ke pembahasan tentang ",(0,t.kt)("em",{parentName:"p"},"library crate"),".")),(0,t.kt)("p",null,"Rust memiliki 2 jenis modul, yaitu ",(0,t.kt)("em",{parentName:"p"},"normal module")," dan ",(0,t.kt)("em",{parentName:"p"},"inline module"),". Pembahasan dimulai dengan normal module terlebih dahulu."),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mod")," digunakan untuk mendefinisikan/mendaftarkan sebuah module. Nama module menjadi path dimana isi module atau ",(0,t.kt)("em",{parentName:"p"},"module item")," harus berada. Sebagai contoh:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"module yang didefinisikan dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", maka item-nya harus berada pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"module yang didefinisikan dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", maka item-nya harus berada pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io/mod.rs"))),(0,t.kt)("p",null,"Pendefinisian nama module sendiri berada pada file entrypoint ",(0,t.kt)("em",{parentName:"p"},"crate")," yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," (atau ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs")," untuk library crate). Jadi pendefinisian nama module dan isi/item-nya terpisah."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Nama module ditulis di ",(0,t.kt)("inlineCode",{parentName:"li"},"main.rs")," (atau ",(0,t.kt)("inlineCode",{parentName:"li"},"lib.rs")," untuk library crate)"),(0,t.kt)("li",{parentName:"ul"},"Item atau isi module ditulis dalam file ",(0,t.kt)("inlineCode",{parentName:"li"},"nama_module.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"li"},"nama_module/mod.rs"))),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Sebenarnya ada beberapa hal lainnya lagi yang masih relevan yang perlu dibahas di-awal, yaitu perihal sub-module. Akan tetapi agar tidak makin bingung, mari kita lanjut ke praktik terlebih dahulu.")),(0,t.kt)("h2",{id:"a202-praktik-1---nama_modulers"},"A.20.2. Praktik #1 - ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module.rs")),(0,t.kt)("p",null,"Mari buat program sederhana, yang isinya mencakup pembahasan tentang module. Pada program kecil ini, inputan user ditampung ke sebuah variabel, kemudian ditampilkan ke layar. Proses pembacaan inputan user akan di-split sebagai module."),(0,t.kt)("p",null,"Ok, langsung saja, buat package/project baru dengan nama bebas. Di sini penulis menggunakan nama package ",(0,t.kt)("inlineCode",{parentName:"p"},"module_1"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"cargo new module_1\n")),(0,t.kt)("p",null,"Setelah itu siapkan 1 buah file bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io.rs"),", letakan di dalam folder ",(0,t.kt)("inlineCode",{parentName:"p"},"src")," (1 level dengan file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"). File ini difungsikan sebagai tempat definisi ",(0,t.kt)("em",{parentName:"p"},"module item")," milik sebuah module bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," (io di sini kependekan dari ",(0,t.kt)("em",{parentName:"p"},"input output"),")."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"module_1\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2514\u2500\u2500\u2500 my_io.rs\n")),(0,t.kt)("p",null,"Lanjut, definisikan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," di file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io.rs"),", isinya kurang lebih adalah kode untuk membaca inputan user lalu mengembalikannya dalam bentuk ",(0,t.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_io.rs"',title:'"src/my_io.rs"'},'pub fn read_entry() -> String {\n let mut message = std::string::String::new();\n let stdin_reader = std::io::stdin(); \n let reader_res = stdin_reader.read_line(&mut message);\n\n if reader_res.is_err() {\n println!("error! {:?}", reader_res.err());\n }\n\n message.trim().to_string()\n}\n')),(0,t.kt)("p",null,"Ok, kita telah menyiapkan satu item milik module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," yaitu sebuah fungsi bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry"),". 1 hal yang sedikit berbeda pada definisi fungsi di atas adalah penambahan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," yang ditulis sebagai prefix definisi fungsi."),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," digunakan untuk menjadikan suatu item menjadi ",(0,t.kt)("strong",{parentName:"p"},"public"),", agar bisa diakses dari luar module."),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," ini berada dalam module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io"),". Jika tidak ada keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," disitu, maka fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," hanya bisa diakses dari dalam ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," saja, tidak bisa diakses dari luar module contohnya seperti dari ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),". Dengan menjadikan ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," sebagai fungsi yang public, maka fungsi tersebut bisa diakses dari ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,t.kt)("p",null,"Isi module sudah siap, selanjutnya lanjut ke pendefinisian modul. Umumnya pada bahasa pemrograman, definisi module adalah ada dalam file dimana isi module berada, namun tidak untuk Rust."),(0,t.kt)("p",null,"Di Rust, definisi sebuah module (sekali lagi bukan item/isinya ya, tapi definisi dari module itu sendiri) dituliskan pada file terpisah, yaitu di file entrypoint crate, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs"),"."),(0,t.kt)("p",null,"Lanjut, sekarang buka file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," dan tulis definisi modul ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," menggunakan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"mod my_io"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"// definisi module my_io\nmod my_io;\n\n// fungsi main\nfn main() {\n // ...\n}\n")),(0,t.kt)("p",null,"Sekarang aplikasikan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," milik module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," di fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," untuk membaca inputan user."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod my_io;\n\nfn main() {\n println!("enter any number:");\n let message = my_io::read_entry();\n println!("your number: {}", message);\n}\n')),(0,t.kt)("p",null,"Jalankan program, masukan sebuah angka, lalu enter. Lihat hasilnya, program berjalan sesuai harapan."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust module",src:n(5152).Z,width:"762",height:"717"})),(0,t.kt)("p",null,"Cara pengaksesan item dari sebuah module yang kita definisikan sendiri adalah sama seperti pengaksesan item dari crate lainnya, yaitu menggunakan ",(0,t.kt)("em",{parentName:"p"},"path"),". Statement ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io::read_entry()")," artinya item ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry")," yang merupakan fungsi dalam module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," digunakan."),(0,t.kt)("h3",{id:"-summary-praktik-1"},"\u25c9 Summary praktik #1"),(0,t.kt)("p",null,"Pada praktik pertama ini kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," untuk meng-export atau menjadikan item menjadi public, agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"))),(0,t.kt)("h3",{id:"-naming-convention-module"},"\u25c9 ",(0,t.kt)("em",{parentName:"h3"},"Naming convention")," module"),(0,t.kt)("p",null,"Sesuai anjuran di ",(0,t.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", aturan penulisan nama module adalah menggunakan snake case, contohnya ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io"),"."),(0,t.kt)("h3",{id:"-module-item"},"\u25c9 Module item"),(0,t.kt)("p",null,"Module item adalah apapun yang didefinisikan di dalam sebuah module. Pada contoh praktik ke-1 di atas, module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," memiliki 1 buah item yaitu fungsi bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"read_entry"),"."),(0,t.kt)("p",null,"Selain fungsi, module item bisa dalam bentuk lainnya, contohnya: konstanta, submodule, struct, dan lainnya."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang macam-macam item dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/path-item"},"Module System \u279c Path & Item"))),(0,t.kt)("h2",{id:"a203-praktik-2---nama_modulemodrs"},"A.20.3. Praktik #2 - ",(0,t.kt)("inlineCode",{parentName:"h2"},"nama_module/mod.rs")),(0,t.kt)("p",null,"Bagian ini merupakan kelanjutan dari praktik sebelumnya. Program sederhana yang sudah di-buat ditambahi beberapa hal. Data inputan user dikonversi ke bentuk angka untuk kemudian dicek apakah angka tersebut bilangan ganjil atau genap."),(0,t.kt)("p",null,"Fungsi untuk konversi string ke bentuk numerik dan juga untuk pengecekan bilangan ganjil genap, adalah dua buah item milik module bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," yang akan kita definisikan sebentar lagi."),(0,t.kt)("p",null,"Definisi item module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io")," menggunakan notasi penulisan file ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," (yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"my_io.rs"),"). Pada module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," ini kita akan gunakan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs")," (menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),") untuk menampung definisi item module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"module_1\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 my_number\n \u2502 \u2514\u2500\u2500\u2500 mod.rs\n \u2502\u2500\u2500\u2500 main.rs\n \u2514\u2500\u2500\u2500 my_io.rs\n")),(0,t.kt)("p",null,"Ok, sekarang buat saja folder dan filenya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),". Lalu pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"mod.rs")," tulis 2 buah fungsi berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi untuk konversi string ke numerik ",(0,t.kt)("inlineCode",{parentName:"p"},"i32")),(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"pub fn string_to_number(text: String) -> i32 {\n return text.parse::().unwrap();\n}\n"))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Fungsi untuk pengecekan bilangan ganjil"),(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"// ...\n\npub fn is_odd_number(number: i32) -> bool {\n number % 2 == 1\n}\n")))),(0,t.kt)("p",null,"Kemudian tulis definisi module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," dalam file entrypoint crate, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"// definisi module my_io\nmod my_io;\n\n// definisi module my_number\nmod my_number;\n\n// fungsi main\nfn main() {\n // ...\n}\n")),(0,t.kt)("p",null,"Terakhir, aplikasikan dua buah fungsi yang sudah didefinisikan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'fn main() {\n println!("enter any number:");\n let message = my_io::read_entry();\n println!("your number: {}", message);\n\n let number = my_number::string_to_number(message);\n let result = my_number::is_odd_number(number);\n println!("is odd number: {}", result);\n}\n')),(0,t.kt)("p",null,"Jalankan program, lihat hasilnya."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust module",src:n(7050).Z,width:"777",height:"872"})),(0,t.kt)("h3",{id:"-summary-praktik-2"},"\u25c9 Summary praktik #2"),(0,t.kt)("p",null,"Hingga praktik ke-2 ini, kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," untuk meng-export atau menjadikan item menjadi public, agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"),", ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::string_to_number"),", dan ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::is_odd_number"))),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Penerapan notasi penulisan isi module ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs")," bisa diterapkan dalam satu package")),(0,t.kt)("h3",{id:"-konversi-string-ke-numerik"},"\u25c9 Konversi string ke numerik"),(0,t.kt)("p",null,"Rust mengenal beberapa jenis konversi antar tipe data. Teknik konversi yang kita praktikkan pada chapter ini menggunakan method ",(0,t.kt)("inlineCode",{parentName:"p"},".parse()"),", cara ini bisa dilakukan untuk konversi tipe data dari custom types ke primitive. Contohnya seperti di atas, dari ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,t.kt)("p",null,"Penggunaannya cukup mudah, akses saja method ",(0,t.kt)("inlineCode",{parentName:"p"},".parse()")," kemudian sisipkan tipe data sebagai parameter generic. Lalu chain dengan method ",(0,t.kt)("inlineCode",{parentName:"p"},"unwrap")," (yang method tersebut merupakan item milik tipe data ",(0,t.kt)("em",{parentName:"p"},"generic result type")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"Result"),")."),(0,t.kt)("p",null,"Contoh lain untuk konversi dari tipe primitif lainnya bisa dilihat berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let data_number = "24".parse::().unwrap();\nlet data_bool = "true".parse::().unwrap();\nlet data_float = "3.14".parse::().unwrap();\n')),(0,t.kt)("p",null,"Method ",(0,t.kt)("inlineCode",{parentName:"p"},"parse")," menghasilkan data bertipe ",(0,t.kt)("em",{parentName:"p"},"generic result type")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"Result"),". Tipe ini memiliki method bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"unwrap")," yang berguna untuk mengambil nilai."),(0,t.kt)("blockquote",null,(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai casting dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/type-alias-casting"},"Type Alias & Casting")," dan ",(0,t.kt)("a",{parentName:"li",href:"#/wip/trait-conversion-from-into"},"Trait \u279c Conversion (From & Into)")),(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai generic dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai result type dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")))),(0,t.kt)("h2",{id:"a204-submodules"},"A.20.4. Submodules"),(0,t.kt)("p",null,"Sampai bagian ini kita telah belajar tentang module beserta 2 macam cara penerapannya."),(0,t.kt)("p",null,"Sebuah module bisa saja memiliki module dibawahnya (biasa disebut submodule), dan hal ini adalah konsep yang umum dalam bahasa pemrograman. Di Rust, aturan dalam pembuatan submodule masih sama seperti module, perbedaannya adalah tempat dimana submodule didefinisikan. Jika pada root module definisi ada pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"lib.rs"),", maka pada submodule definisi ada pada file dimana ",(0,t.kt)("em",{parentName:"p"},"parent module")," berada."),(0,t.kt)("p",null,"Sebagai contoh jika pada program sebelumnya kita tambahkan module ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," yang sudah dibuat, jika ada submodule dengan nama ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility"),", maka definisi module berada di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs")," dan itemnya di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility/mod.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion_utility\n \u2514\u2500\u2500\u2500 mod.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("p",null,"Atau definisi module tetap di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs")," namun itemnya di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion_utility.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Penerapan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," biasanya dalam case ketika module tersebut tidak memiliki submodule."),(0,t.kt)("p",{parentName:"blockquote"},"Untuk module yang memiliki submodule, parent module harus menerapkan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs"),", hal ini karena pendefinisian submodule berada pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"mod.rs")," dalam parent module tersebut.")),(0,t.kt)("p",null,"Lalu bagaimana jika sebuah submodule memiliki submodule yang memiliki submodule ... dst, aturannya tetap sama seperti aturan submodule."),(0,t.kt)("p",null,"Mari lanjut praktik agar tidak bingung. Kita akan modifikasi program sebelumnya. Item ",(0,t.kt)("inlineCode",{parentName:"p"},"string_to_number")," yang sebelumnya adalah item milik ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number")," kita pindah ke sebuah module baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility")," yang merupakan submodule dari ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number"),". Silakan buat file baru ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility/mod.rs"),", kemudian isi dengan fungsi berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/conversion_utility/mod.rs"',title:'"src/my_number/conversion_utility/mod.rs"'},"pub fn string_to_number(text: String) -> i32 {\n return text.parse::().unwrap();\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"string_to_number")," yang sebelumnya ada di ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs")," silakan dihapus."),(0,t.kt)("p",null,"Kemudian pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),", tambahkan definisi submodule ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility"),". Isi file tersebut kurang lebih menjadi seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"pub mod conversion_utility;\n\npub fn is_odd_number(number: i32) -> bool {\n number % 2 == 1\n}\n")),(0,t.kt)("p",null,"O iya, karena submodule merupakan sebuah item milik module, maka harus ditambahkan juga keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub"),", agar submodule bisa diakses dari luar scope-nya. Contoh penerapannya bisa dilihat di atas."),(0,t.kt)("p",null,"Terakhir, pada ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),", ubah pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"string_to_number")," dari ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"let number = my_number::string_to_number(message);\n")),(0,t.kt)("p",null,"... menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"let number = my_number::conversion_utility::string_to_number(message);\n")),(0,t.kt)("p",null,"Kurang lebih strukturnya menjadi seperti berikut:"),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust submodule",src:n(3749).Z,width:"940",height:"955"})),(0,t.kt)("p",null,"Jalankan program untuk mengetest hasilnya."),(0,t.kt)("h3",{id:"-summary-praktik-3"},"\u25c9 Summary praktik #3"),(0,t.kt)("p",null,"Hingga pembahasan pada praktik submodule, kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan submodule dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion_utility"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion.rs")," yang di-import menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"path")," attribute."),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada fungsi agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada submodule agar bisa diakses dari luar parent module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"),", ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::conversion_utility::string_to_number"),", dan ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::is_odd_number"))),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Penerapan notasi penulisan isi module ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module.rs")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_module/mod.rs")," bisa diterapkan dalam satu package")),(0,t.kt)("h2",{id:"a205-penerapan-keyword-use"},"A.20.5. Penerapan keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"use")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"use")," bisa digunakan untuk meng-import module atau item tertentu, dan dengannya pengaksesan item menjadi lebih pendek. Contohnya:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"my_number::conversion_utility::string_to_number(message);\n")),(0,t.kt)("p",null,"... bisa dituliskan menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"use my_number::conversion_utility::string_to_number;\nstring_to_number(message);\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"use")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/use"},"Module System \u279c Use"))),(0,t.kt)("h2",{id:"a206-module-path-attribute"},"A.20.6. Module ",(0,t.kt)("inlineCode",{parentName:"h2"},"path")," attribute"),(0,t.kt)("p",null,"Selain menggunakan dua teknik definisi module item di atas yang fokusnya ada pada penamaan file, ada juga cara lain pendefinisian module item, yaitu dengan memanfaatkan ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute."),(0,t.kt)("p",null,"Mari kita praktikkan, silakan ubah struktur package yang sudah dibuat dari ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion_utility.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("p",null,"... menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 my_io.rs\n \u2514\u2500\u2500\u2500 my_number\n \u2502\u2500\u2500\u2500 mod.rs // <----- definisi submodule conversion_utility\n \u2514\u2500\u2500\u2500 conversion.rs // <----- definisi item/isi conversion_utility\n")),(0,t.kt)("p",null,"Yang telah kita lakukan adalah me-rename file ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion_utility.rs")," menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion.rs"),". Efeknya akan muncul error dalam pengaksesan module item, karena submodule ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility")," isi/item-nya harus berada pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility.rs")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/conversion_utility/mod.rs"),". Sedangkan file ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion.rs")," tidak memenuhi kriteria tersebut."),(0,t.kt)("p",null,"Sekarang buka isi file ",(0,t.kt)("inlineCode",{parentName:"p"},"my_number/mod.rs"),", lalu ubah statement pendefinisian submodule dari ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},"pub mod conversion_utility;\n")),(0,t.kt)("p",null,"... menjadi ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/my_number/mod.rs"',title:'"src/my_number/mod.rs"'},'#[path = "conversion.rs"]\npub mod conversion_utility;\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Rust module",src:n(6827).Z,width:"690",height:"365"})),(0,t.kt)("p",null,"Lalu run, dan program akan jalan normal tanpa error."),(0,t.kt)("p",null,"Statement ",(0,t.kt)("inlineCode",{parentName:"p"},'#[path = "conversion.rs"]')," di atas merupakan contoh penerapan dari Rust path attributes. Dengannya kita bisa menempatkan isi sebuah module pada file yang namanya bebas (pada contoh di atas, file bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"conversion.rs"),")."),(0,t.kt)("h3",{id:"-summary-praktik-4"},"\u25c9 Summary praktik #4"),(0,t.kt)("p",null,"Hingga pembahasan pada praktik module ",(0,t.kt)("inlineCode",{parentName:"p"},"path")," attribute, kita telah belajar penerapan module dengan mengaplikasikan beberapa hal berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Penggunaan normal module dalam binary crate"),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan module dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Pembuatan submodule dengan nama ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion_utility"),", dengan isi/item ditulis pada file ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number/conversion_utility/mod.rs")),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada fungsi agar bisa diakses dari luar module"),(0,t.kt)("li",{parentName:"ul"},"Penggunaan keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"pub")," pada submodule agar bisa diakses dari luar parent module"),(0,t.kt)("li",{parentName:"ul"},"Pengaksesan item milik module, yaitu: ",(0,t.kt)("inlineCode",{parentName:"li"},"my_io::read_entry"),", ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::conversion_utility::string_to_number"),", dan ",(0,t.kt)("inlineCode",{parentName:"li"},"my_number::is_odd_number"))),(0,t.kt)("h2",{id:"a207-pembahasan-lanjutan"},"A.20.7. Pembahasan lanjutan"),(0,t.kt)("p",null,"Pembahasan topik module dilanjutkan pada beberapa chapter lain. Pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/module-inline"},"Module System \u279c Inline Module")," kita akan bahas secara mendetail mengenai apa itu inline module dan perbedaannya dibanding normal module. Lalu nantinya di cahpter ",(0,t.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy")," akan dibahas secara lengkap mengenai keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"pub")," dan kontrol privasi lainnya di pemrograman Rust."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/module"},"github.com/novalagung/dasarpemrogramanrust-example/../module")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html"},"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.pub.html"},"https://doc.rust-lang.org/std/keyword.pub.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.mod.html"},"https://doc.rust-lang.org/std/keyword.mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/mod.html"},"https://doc.rust-lang.org/rust-by-example/mod.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"},"https://stackoverflow.com/questions/69275034/what-is-the-difference-between-use-and-pub-use"))))}o.isMDXComponent=!0},5152:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-1-0eea2521d2399e73e455b90f5c2f97fa.png"},7050:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-2-d8f6f3862036da93c4b7920e144a3a3f.png"},3749:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-3-b8f34c47b905cadb9001a866ebb80809.png"},6827:(e,a,n)=>{n.d(a,{Z:()=>i});const i=n.p+"assets/images/module-4-e83e7a2e8d7d6d4d11ec121d6dc184d0.png"}}]); \ No newline at end of file diff --git a/assets/js/5925ce9f.9da92efc.js b/assets/js/5925ce9f.9da92efc.js new file mode 100644 index 00000000..32310f57 --- /dev/null +++ b/assets/js/5925ce9f.9da92efc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9831],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>g});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var d=t.createContext({}),s=function(a){var e=t.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},m=function(a){var e=s(a.components);return t.createElement(d.Provider,{value:e},a.children)},u={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},k=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,d=a.parentName,m=p(a,["components","mdxType","originalType","parentName"]),k=s(n),g=i,o=k["".concat(d,".").concat(g)]||k[g]||u[g]||r;return n?t.createElement(o,l(l({ref:e},m),{},{components:n})):t.createElement(o,l({ref:e},m))}));function g(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=k;var p={};for(var d in e)hasOwnProperty.call(e,d)&&(p[d]=e[d]);p.originalType=a,p.mdxType="string"==typeof a?a:i,l[1]=p;for(var s=2;s{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>p,toc:()=>s});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:37,title:"A.37. Generics",sidebar_label:"A.37. Generics"},l=void 0,p={unversionedId:"basic/generics",id:"basic/generics",title:"A.37. Generics",description:"Chapter ini membahas tentang generics.",source:"@site/docs/basic/generics.md",sourceDirName:"basic",slug:"/basic/generics",permalink:"/basic/generics",draft:!1,tags:[],version:"current",sidebarPosition:37,frontMatter:{sidebar_position:37,title:"A.37. Generics",sidebar_label:"A.37. Generics"},sidebar:"tutorialSidebar",previous:{title:"A.36. Traits",permalink:"/basic/traits"},next:{title:"A.38. Tipe Data \u279c Option",permalink:"/basic/option-type"}},d={},s=[{value:"A.37.1. Generics basic",id:"a371-generics-basic",level:2},{value:"A.37.2. Mengasosiasikan traits ke parameter generic",id:"a372-mengasosiasikan-traits-ke-parameter-generic",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"\u25c9 Contoh ke-3",id:"-contoh-ke-3",level:3},{value:"A.37.3. Multi traits pada parameter generic",id:"a373-multi-traits-pada-parameter-generic",level:2},{value:"A.37.4. Keyword where",id:"a374-keyword-where",level:2},{value:"A.37.5. Generics struct",id:"a375-generics-struct",level:2},{value:"A.37.6. Generics method",id:"a376-generics-method",level:2},{value:"A.37.7. Method khusus untuk spesifik tipe parameter generic tertentu",id:"a377-method-khusus-untuk-spesifik-tipe-parameter-generic-tertentu",level:2},{value:"A.37.8. Generics enum",id:"a378-generics-enum",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:s};function u(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang generics."),(0,i.kt)("p",null,"Generics sendiri merupakan salah satu fitur yang ada pada beberapa bahasa pemrograman (termasuk Rust), yang digunakan untuk menambahkan fleksibilitas dalam pemanfaatan tipe data pada suatu block kode. Dengan adanya generics, kita bisa menentukan tipe data yang digunakan pada parameter maupun return value sbuah block fungsi, method dan lainnya."),(0,i.kt)("p",null,"Generics dinotasikan dengan ",(0,i.kt)("inlineCode",{parentName:"p"},""),". Kita sempat sedikit memanfaatkan generic pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector")," di mana dalam pendefinisian tipe data harus dituliskan juga tipe data item (via generics parameter), contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec<&str>"),", dll. Kita juga sempat sedikit belajar tentang topik generic pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),"."),(0,i.kt)("h2",{id:"a371-generics-basic"},"A.37.1. Generics basic"),(0,i.kt)("p",null,"Mari mulai pembahasan dengan sebauh contoh definisi fungsi yang memiliki generics."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something(arg1: i32, arg2: T) {\n // ...\n}\n")),(0,i.kt)("p",null,"Pada contoh di atas, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something")," didefinisikan dengan 2 buah parameter argument dan 1 buah parameter generics. Parameter argument pertama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"arg1")," bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", kemudian diikuti parameter ke-2 bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah parameter generic fungsi."),(0,i.kt)("p",null,"Dalam pemanggilan fungsi tersebut, ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," generics dan tipe data argument ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," harus sama. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n do_something::(24, false);\n}\n")),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something")," dipanggil dengan disisipi argument ",(0,i.kt)("inlineCode",{parentName:"p"},"24")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),". Parameter ke-2 fungsi tersebut tipe data-nya jelas ",(0,i.kt)("inlineCode",{parentName:"p"},"bool")," karena pada argument-nya nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"false")," digunakan, oleh karena itu tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"bool")," disisipkan pada parameter generics saat pemanggilan fungsi; dengan notasi penulisan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"::"),", posisi penulisannya di antara nama fungsi dan tanda kurung pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"("),"."),(0,i.kt)("p",null,"Apa yang terjadi jika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diisi dengan tipe data argument ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," berbeda? program error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(7757).Z,width:"690",height:"169"})),(0,i.kt)("p",null,"Ok sampai sini semoga jelas."),(0,i.kt)("p",null,"Khusus untuk fungsi yang generic parameter-nya dipergunakan sebagai tipe data parameter, maka boleh untuk tidak ditentukan tipe data-nya saat pemanggilan fungsi. Contohnya bisa dilihat pada kode berikut, dua statements ini adalah ekuivalen."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"do_something::(24, false);\n// T adalah bool, karena ditulis secara eksplisit\n\ndo_something(24, false);\n// T adalah bool, karena diketahui dari tipe data argument.\n// nilai `false` pasti tipe data-nya bool\n")),(0,i.kt)("p",null,"Tipe data generic boleh tidak ditulis karena nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," bisa diketahui dari argument pemanggilan fungsi. Sedangkan jika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," tidak digunakan sebagai tipe data parameter, maka wajib untuk di-isi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," saat pemanggilan fungsi."),(0,i.kt)("p",null,"O iya, jumlah parameter generics tidak ada batasan. Bisa saja ada lebih dari satu parameter generic yang didefinisikan, contohnya bisa dilihat pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something_v2")," ini yang memiliki 2 buah parameter generic, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"R")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v2(arg1: R, arg2: T) {\n // ...\n}\n")),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"R")," digunakan sebagai tipe parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg1")," dan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," pada parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2"),"."),(0,i.kt)("h2",{id:"a372-mengasosiasikan-traits-ke-parameter-generic"},"A.37.2. Mengasosiasikan traits ke parameter generic"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something")," yang telah dipraktikkan, susah untuk diisi dengan apapun. Memang parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg1")," tipe-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", dan harusnya mudah untuk bermain-main dengan parameter tersebut. Yang agak repot adalah parameter ke-2, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," yang bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something(arg1: i32, arg2: T) {\n // ...\n}\n")),(0,i.kt)("p",null,"Parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," hampir tidak bisa diapa-apakan."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Misal mau di-print, tidak bisa, karena tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," tidak implement trait ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},(0,i.kt)("inlineCode",{parentName:"a"},"std::fmt::Debug")),"."),(0,i.kt)("li",{parentName:"ul"},"Misal diisi nilai numerik kemudian dijadikan operand operasi aritmatika, juga tidak bisa karena tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," tidak implement trait ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.Add.html"},(0,i.kt)("inlineCode",{parentName:"a"},"std::ops::Add")),", dan trait operasi bilangan lainnya."),(0,i.kt)("li",{parentName:"ul"},"Misal diisi dengan nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"bool"),", tidak bisa digunakan pada seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"li"},"if")," karena tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," tidak implement trait ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html"},(0,i.kt)("inlineCode",{parentName:"a"},"std::cmp::PartialOrd")),", dan trait operasi logika lainnya.")),(0,i.kt)("p",null,"Repot kan? Tapi tenang, tidak usah khawatir, ada soluasi agar tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," bisa dimanfaatkan, yaitu dengan mengasosiasikan trait ke tipe data generic (sesuai kebutuhan)."),(0,i.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,i.kt)("p",null,"Contoh pengaplikasiannya bisa dilihat pada kode berikut. Ada sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"print_x_times")," yang tugasnya adalah menampilkan data ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," sejumlah ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," kali, yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah parameter generics."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n print_x_times("Hello guys", 10);\n}\n\nfn print_x_times(data: T, x: i32) {\n for _ in 0..x {\n println!("{:?}", data);\n }\n}\n')),(0,i.kt)("p",null,"Parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diasosiasikan dengan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug"),", dengan ini maka kita akan bisa print parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"data")," yang tipe data-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("p",null,"Untuk mengetes hasilnya, jalankan program. Bisa dilihat text ",(0,i.kt)("inlineCode",{parentName:"p"},"Hello guys")," muncul 10x."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(4541).Z,width:"315",height:"248"})),(0,i.kt)("p",null,"Cara untuk mengasosiasikan trait ke parameter generic adalah dengan menuliskannya dalam notasi berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn nama_fungsi(arg1 ...) {\n // ...\n}\n")),(0,i.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,i.kt)("p",null,"Pada contoh ke-2 ini, dideklarasikan sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"find_largest_number")," yang tugasnya adalah mencari nilai maksimum dari sebuah tipe slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_largest_number(list: &[T]) -> &T {\n let mut largest = &list[0];\n\n for item in list {\n if item > largest {\n largest = item;\n }\n }\n\n largest\n}\n")),(0,i.kt)("p",null,"Seperti yang sudah dibahas pada bagian sebelumnya, bahwa tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," tidak akan bisa diapa-apakan kalau tidak diasosiasikan dengan trait. Maka pada contoh ini, tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diasosiasikan dengan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd"),". Benefitnya, semua data dengan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," bisa dipergunakan dalam operasi perbandingan."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tanpa adanya trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd"),", maka statement ",(0,i.kt)("inlineCode",{parentName:"p"},"if item > largest { ... }")," menghasilkan error.")),(0,i.kt)("p",null,"Ok, sekarang panggil fungsi tersebut 2x, yang pertama diisi dengan data slice dari sebuah array, dan yang kedua data slice dari sebuah vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let data_arr = [0, 1, 2, 3];\n let largest_number1 = find_largest_number(&data_arr);\n println!("largest_number1: {:?}", largest_number1);\n \n let data_vec = vec![4, 5, 6, 7];\n let largest_number2 = find_largest_number(&data_vec);\n println!("largest_number2: {:?}", largest_number2);\n}\n')),(0,i.kt)("p",null,"Hasilnya sesuai harapan."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(7811).Z,width:"461",height:"113"})),(0,i.kt)("h3",{id:"-contoh-ke-3"},"\u25c9 Contoh ke-3"),(0,i.kt)("p",null,"Trait yang bisa diasosiasikan dengan parameter generics adalah semua jenis traits (tanpa terkecuali), termasuk custom trait yang kita buat sendiri."),(0,i.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Ada custom trait bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"MyTrait")," dideklarasikan, kemudian diasosiasikan dengan parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," milik fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something_v3"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"trait MyTrait {\n // methods declaration\n}\n\nfn do_something_v3(arg1: T) {\n // do something\n}\n")),(0,i.kt)("h2",{id:"a373-multi-traits-pada-parameter-generic"},"A.37.3. Multi traits pada parameter generic"),(0,i.kt)("p",null,"Bagaimana jika ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," perlu untuk diasosiasikan dengan banyak traits (lebih dari satu), apakah bisa? Bisa. Cara penulisannya kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// fn nama_fungsi(arg1 ...)\n\nfn print_largest_number(list: &[T]) {\n let largest = find_largest_number::(list);\n println!("largest number: {:?}", largest);\n}\n')),(0,i.kt)("p",null,"Fungsi di atas adalah fungsi baru, namanya ",(0,i.kt)("inlineCode",{parentName:"p"},"print_largest_number"),", tugasnya adalah mencari nilai maksimum kemudian menampilkannya."),(0,i.kt)("p",null,"Proses pencarian nilai maksimum dilakukan dengan memanfaatkan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"find_largest_number")," yang sebelumnya sudah dibuat. Fungsi tersebut memerlukan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd")," untuk diasosiasikan dengan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("p",null,"Setelah nilai maksimum diketemukan, nilainya di-print ke stdout menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Nilai maksimum ditampung pada variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"largest"),", tipe data-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),". Agar bisa di-print maka perlu diasosiasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("p",null,"Bisa dilihat cara penulisan asosiasi multi trait ke parameter generic seperti apa. Cukup tulis saja dengan separator tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"+"),"."),(0,i.kt)("h2",{id:"a374-keyword-where"},"A.37.4. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"where")),(0,i.kt)("p",null,"Selain notasi penulisan yang sudah dipelajari di atas ada lagi alternatif lainnya, yaitu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"where"),". Kurang lebih seperti berikut penerapannya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn print_largest_number(list: &[T]) {\n let largest = find_largest_number::(list);\n println!("largest number: {:?}", largest);\n}\n\n// ... adalah ekuivalen dengan ...\n\nfn print_largest_number(list: &[T]) \nwhere\n T: std::cmp::PartialOrd + std::fmt::Debug,\n{\n let largest = find_largest_number::(list);\n println!("largest number: {:?}", largest);\n}\n')),(0,i.kt)("p",null,"Silakan gunakan sesuai preferensi dan kesepakatan tim. Kalau penulis lebih suka cara ke-2, karena terasa lebih rapi untuk penulisan fungsi yang ada banyak parameter generic beserta asosiasi traits-nya. Contohnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something(arg1: T, arg2: U, arg3: V) \nwhere\n T: some::traits:TraitA,\n U: some::traits:TraitB + some::traits:TraitC + some::traits:TraitD,\n V: some::traits:TraitA + some::traits:TraitD,\n{\n // do something\n}\n")),(0,i.kt)("h2",{id:"a375-generics-struct"},"A.37.5. Generics struct"),(0,i.kt)("p",null,"Selain diterapkan di fungsi, generics bisa juga diterapkan di struct. Cara penulisannya, tambahkan notasi parameter generic di antara nama struct dan block struct."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct Point {\n x: T,\n y: T,\n z: U\n}\n\nfn main() {\n let num_one: Point = Point { x: 502, y: 120, z: 4.5 };\n let num_two: Point = Point { x: 1.2, y: 4.3, z: 534 };\n}\n")),(0,i.kt)("p",null,"Pada contoh di atas, struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," memiliki 2 parameter generic. Kemudian struct tersebut digunakan untuk membuat dua variabel berbeda:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"num_one"),", bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"Point"),". Tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"x")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"y")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"i32")," sedangkan tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"z")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"f64"),"."),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"num_two"),", bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"Point"),". Tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"x")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"y")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"f64")," sedangkan tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"z")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"i32"),".")),(0,i.kt)("h2",{id:"a376-generics-method"},"A.37.6. Generics method"),(0,i.kt)("p",null,"Generic bisa diterapkan pada method. Notasi penulisannya kurang lebih sama seperti pada penulisan method, hanya saja pada syntax ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," perlu diikuti block parameter generics. Perbandingannya kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// method biasa\nimpl Square {\n fn x(&self) -> &i32 {\n &self.x\n }\n}\n\n// method dengan generic\nimpl Square {\n fn x(&self) -> &T {\n &self.x\n }\n}\n")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di syntax bagian ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),", penulisan parameter generics di keduanya harus sama persis. Misal pada struct ada 3 buah parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," maka pada syntax ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," juga harus sama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Jika tidak sama akan muncul error.")),(0,i.kt)("p",null,"Ok, sekarang mari kita praktikkan. Struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," yang sudah dibuat, kita siapkan method-nya. Ada 3 buah method yang akan dibuat dan kesemuanya adalah method ",(0,i.kt)("em",{parentName:"p"},"getter")," untuk masing-masing property struct (yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"y"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"z"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct Point {\n x: T,\n y: T,\n z: U\n}\n\nimpl Point {\n\n fn get_x(&self) -> &T {\n &self.x\n }\n\n fn get_y(&self) -> &T {\n &self.y\n }\n\n fn get_z(&self) -> &U {\n &self.z\n }\n}\n")),(0,i.kt)("p",null,"Bisa dilihat pada kode di atas, ada method ",(0,i.kt)("inlineCode",{parentName:"p"},"get_x")," untuk mengambil nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),". Nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yang tipe tersebut juga dipakai sebagai tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),"."),(0,i.kt)("p",null,"Kemudian coba gunakan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," untuk membuat satu atau dua variabel, lalu akses method-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let num_one: Point = Point { x: 502, y: 120, z: 4.5 };\n println!("{} {} {}", num_one.get_x(), num_one.get_y(), num_one.get_z());\n // 502 120 4.5\n\n let num_two: Point = Point { x: 1.2, y: 4.3, z: 534 };\n println!("{} {} {}", num_two.get_x(), num_two.get_y(), num_two.get_z());\n // 1.2 4.3 534\n}\n')),(0,i.kt)("p",null,"Hasilnya ketika di-run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(5243).Z,width:"319",height:"110"})),(0,i.kt)("h2",{id:"a377-method-khusus-untuk-spesifik-tipe-parameter-generic-tertentu"},"A.37.7. Method khusus untuk spesifik tipe parameter generic tertentu"),(0,i.kt)("p",null,"Pada contoh di atas, struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," bisa digunakan dalam banyak kombinasi tipe data, misalnya: ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),", dan lainya."),(0,i.kt)("p",null,"Di luar itu, bisa lho mendefinisikan method hanya untuk tipe parameter generic. Misalnya, method hanya bisa diakses ketika ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"U")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),". Caranya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Point {\n\n fn get_x(&self) -> &i32 {\n &self.x\n }\n\n fn get_y(&self) -> &i32 {\n &self.y\n }\n\n fn get_z(&self) -> &f64 {\n &self.z\n }\n}\n")),(0,i.kt)("p",null,"Block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," tidak diterapkan dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Point"),", melainkan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Point"),". Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diganti dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"U")," diganti ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),". Dengan penulisan yang seperti ini, maka method dalam block kode hanya bisa diakses ketika data memiliki tipe data sesuai dengan yang dideklarasikan di block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," (yang pada contoh di atas adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),")."),(0,i.kt)("p",null,"Bisa dilihat pada gambar berikut, sekarang statement pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"num_two")," menjadi error, karena method-method tersebut hanya tersedia untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," sedangkan ",(0,i.kt)("inlineCode",{parentName:"p"},"num_two")," bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(6714).Z,width:"851",height:"501"})),(0,i.kt)("p",null,"Jika ada keperluan untuk mendeklarasikan method lainnya khusus untuk tipe lainnya, cukup tulis lagi block ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," diikuti dengan tipe yang diinginkan. Misalnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Point {\n // method untuk tipe data Point\n}\n\nimpl Point {\n // method untuk tipe data Point\n}\n\nimpl Point {\n // method untuk tipe data Point\n}\n\n// ...\n")),(0,i.kt)("h2",{id:"a378-generics-enum"},"A.37.8. Generics enum"),(0,i.kt)("p",null,"Generic juga bisa diterapkan pada tipe enum. Caranya tulis saja deklarasi parameter generic setelah nama enum, lalu gunakan parameter generic-nya sesuai kebutuhan."),(0,i.kt)("p",null,"Contohnya pada kode berikut ini, enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Kendaraan")," memiliki parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yang tipe tersebut dipakai pada value enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Gledekan(T)"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'enum Kendaraan {\n Skateboard,\n SepedaPancal,\n Gledekan(T),\n}\n\nlet kendaraan1 = Kendaraan::<&str>::Skateboard;\nlet kendaraan2 = Kendaraan::<&str>::SepedaPancal;\nlet kendaraan3 = Kendaraan::<&str>::Gledekan("Artco");\n')),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/generics"},"github.com/novalagung/dasarpemrogramanrust-example/../generics")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch10-01-syntax.html"},"https://doc.rust-lang.org/book/ch10-01-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.Add.html"},"https://doc.rust-lang.org/std/ops/trait.Add.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html"},"https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html"))))}u.isMDXComponent=!0},7757:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArIAAACpCAIAAABYlUmmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMTE6MTI6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE2OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE2OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjczMzE5YzgxLTE2YmYtOWE0My05OGM5LTc0ZWEwNzA3Y2EwMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MzMxOWM4MS0xNmJmLTlhNDMtOThjOS03NGVhMDcwN2NhMDAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3MzMxOWM4MS0xNmJmLTlhNDMtOThjOS03NGVhMDcwN2NhMDAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjczMzE5YzgxLTE2YmYtOWE0My05OGM5LTc0ZWEwNzA3Y2EwMCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMVQxMToxMjozNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvRIHT8AAB0RSURBVHja7Z3djxzFuYd9zRUSF7lAsnIRkwP4S5ZtLKLEGOETHZ/gQCQIR7KMP9gNEYrgJrAbycH27nqPgQuQnGMsL7YMsY6DPJaxhQVKpA0bEbFhMEhnBVJiLuA/AP6APVVd3dVvfXRP93zt7Mzz00/WbE9PdVXPuN+n3qrqXrMWIYQQQijRGk4BQgghhMAChBBCCIEFCCGEEAILEEIIIQQWIIQQQggsQAghhBBYgBBCCCGwACGEEEJgAUIIIYTAAoQQQgiBBQghhBACCxBCCCEEFqwi7UYIIYQGSWDBCmPBunV3YYwxxoNgsAAswBhjjMECsABjjDEGC8ACjDHGGCwACzDGGGOwACzAGGOMwQKwAGOMMQYLwAKMMcYYLBg2LJi5tmS0eGGM3yvGGGOwYISxYOb60uL5p9SLw+cXl67PtP5GD764e/G1TfyyMcYYgwVDhwVPXfj70rUTd6VY8PcLh8ECjDHGYMHIZgtSGjihRxIMH2T+9Y8Xr+41/suL93hbUr+1/aDeedPbV3ef3nPP6bfM9h8f5XePMcYYLFjFcwuuzbjbTaSvmC1QO2sgePvX6rWGgxQjMMYYY7BgNWGBZoLF69cWzXzDsQuLGR/oSB+N7kVYYHdmlAFjjDFYsBqxwE4zzIcS8ukFe7b/5WpkUKAAC+KpBYwxxhgsWC1YYJchmNd6kWL2p8sBggzAAowxxmDB0GYL7KyCZNZhBAuSmYYiYeD9CRZgjDEGC4bovgWZrs3kZOAsOvBD/tHXoisR+K1jjDEGC1b7SgSMMcYYLAALMMYYY7AALMAYY4zBArAAY4wxBgvAAn6IGGOMwQIEFmCMMQYLEFiAMcYYLEBgAcYYY7AAgQUYY4zBAtQaC7Zt244xxhgPgsECsgUYY4wx2QKwAGOMMQYLwAKMMcYYLAALMMYYY7AALMAYY4zBArAAY4wxBgvAAowxxhgsAAswxhhjsGDksODQ3AfNZrNxbEV/QAfn5puXj7f12eOXm/NzB/hPiDHGYAEaaCzQJV8+NhBY0EH5GGOMwQIGEcACjDHGYMEwYoEKnI05FRebzQ/mjie5gSyOHms0jT44c9D/SNN9q7iQdeuO5XunWQexJStm7pAtX7ybFmLCtt0uYCKviSzhrgNnPmj6hcRt2+i2SB9LgIL9U9VEHShWE1Ft53SF5wpjjMECsGCgsSCJeUmAVHFOhTcnxKrtbjzzdygv5FjDxk431sazBXqfIHweTIHjUPo63UGXkNVEVyArzXvdVrZAN8QOneQFyprIfUStnGbGzhXGGIMFYMFAY0ESOLPwXwULYvmD0kIiRcWwQPfyI1HcCdt6nyQYqxeiGnYfN8a3PYggqieqXVC42lkcxdawgHIwxhgsAAuGBwuyeYgyi15SyPHLQYq+EAucPnorLAjz/93EgnyjaoutZ1C4eet4MCpiWxGeK4wxBgvAgqHCAmcIP4uL0UKSoGjjaKVsQR0siFWsW1iQHUhPmzjWovAKR8nPFcYYgwVgwVBigdNdLsQCJ20givKm9eV96+KOu4sOusD4UEW6wyFv8mPpxMMIjuhWfDAvDyFrIgcIKgwWyBkPGGMMFoAFqw0L/PUC+aKDcAVBMVvkqf75ublG0Sx9EXrzrLu3EiGWUXAq48xtTLe4o/7Fjq8j0JV3Pm6mHEZXFjinK61t9FxhjDFYABZw34LV6CBTwh0OMMYYLAALRtORtD9YgDHGYAFYMIpAEE37gwUYYwwWgAUYY4wxWAAWYIwxxmABWIAxxhiDBWABxhhjDBaABRhjjDFYABZgjDHGYAFYsDpddjNmubzQv5lxd9YWJo82aAblOw9c7tohenWz5NanwtybMrJP7578VPlO1SvrZ5555vnnXyjf59927Nk89ubmpy9tOjT3w407wrc2PDbd8kDr//PZjfteXXf3phrVu3uT+og6rnKVQ9Rz5cLVu2Y31QS7UZ0HdTb09rE31UlY8e8x/CL6VsO7d/6X/Gar/yQG51yVWP3v2LdvH1gAFrQdBtoJLa2xwMbpIHJ365YD8Uc6FTyjof5p6fVtkqudisjzKfIPVvsWKj6qysWRfpGBungdOXJk27bttT4yNTW9a9eDVYKluphufPJ/+okF7ZBEzwpXbZRYYEOvOieDiQV9q+HAYkH0K6tbw0ceeVT9H1H/ggVgwaBhQbuxsBMs6IprxtEeYkHE7qMuqpyBfjSnT1igaEBd72RPyPQv7eVSXe6Vy7GgpzG+6LLe05ixSrGgyP3HgsFxt34/Ff9ngQUDjgXiCUDuU4iy4JHsYB8i3DhmE90iQscK8bPipkD/IUyyk12QQi95RlGtWCieohRJjDs1zx/yFHTfe4cFuuQgjgYnMKhDzliqmaq2sWZGH+ZUn8myb989J+KhUOm3I8+qU5kUSrLTWzs1Yi46v/zlEydOzJ48edKk9NU1SG20MVum+k04P5nIXK1UV8Z81krmAFQhdrsqp2T4oDxyh1gQza57KQc77iALNx+UzFGU5A8v6/agMjduAoCyeatFydHCky32g+otrzfZORaowtOaizNm62yrrctUdXv092rLvXtf0GfStPTuTRueeEntY4YG5IBO4RcRrWE0IZQ1Py2qwriDrLn3zYY1kW2X307+bdpPFTfTDmZ5qazwHMot3v61frTG3n9GsGBVYoHo+elLtg26ydVfX8qdWCVH7kXGu2UhlbIF4jEE8qCyb9pJtqAZqa18vnP+fGR59LAJvcACQSHhIyuzo4tximIssM2UX4T/us3ESXwGgP8w7tJsQUp4pjJVsw4uFthAbjOWJVigXsjoXt6nURsVMYQp0MiVriAMt8wW+PEyKSfM0FosUG+Vdy7zQXHrLEpJtlCv7eXbXOvNQcvhprDwHmOBjotBrDXBzzTB7mBzNiaUmlBt4mWOCEl92qth/kH5jWdB0fwZFh42R9bcO+FeTdRu9+59PvrB9LX8zchmihqa02LJSb0220uSWCXZgoo/2lpTcMCCQcYCdU0XMc+9jicxeM656Ds72ABTVIgMuq2xQB1O7JwFG3fP7gwiZLHW752nNfeq7cfRPmYLHMaSzS/BgkhGIf6ttcMElxsZprjfcvxLKcICmZSqOcogI7eN1uVYEE1phlhgCokyhEKQY8eOObjQJSyQ1/0QC1RHsGrCOaiPDAxe/16iRqXBjj5nC6LnNthoDmHLtOFWYoGtYctgHK2hSUXYk5MX4sbFFuMCbdUkrI+EjxzmCr4Ij/bsQU0KIZofqo4FRT/aWuMIYMEAY0GY7HUu08EVPwgw+t2iQkom0EWwwBkpyDPMvcCCrEw/wOdYIKu9wlggD72CWGAPnQ8lOBWIrVAowIJOJnlErzglWGDeMoMCsrsflhPOHiibSNUlLCjqrNu8btXh3hgWODHYxYJ6o8j9xQIfaGJHbAMLvEhWpYYyD+/k/4PKtDx7tbDAGSwQuR+ZLZB5iygWyG9EHtSOUFSnk4o/Wvn/RWG0MzkXLFhtWFA09S8fj3f62WGAKSykOL1cgAUFi+J6kC1IWuGF4exPL1vg5zxWLluQ/9l3LJCfSgEuLMQfcBkALJCXqhMnZu0+RdmCKBZEsgVun7uTbEERFujL/Y8eLerb1c0WyD8HHAviQderQ/ZnT7MFhamUXmKBHO6R9ZETDvISqmULooHc+wHXyhaUYwHZgtU+iBCu5QtClDe8HRl0LyykeMlZZHyhYCJCvqeZfNcxFohY6yzDyw8kqx1OA6yFBYX3AKg25dA5J/G5F2YuYSkWeLNAmm1mC9yvPlaI/KnE00U9xAKT/zeTD0Is8JIB0ZVUqgR/CWIxMZiupL1cVlyJEA4k23Hf6NyC6Ch7xcS7vO57cxi7ggVmiwlX3Z1bIENjdKPt/VfBguhJrlTDokH0Wlgg8v/mN9MSC5w5ibHJHC35TA4WxLMv1dCh1o+WuQVDuhJBzrnLL+hmh2xE2Z9b3mKxgJxM58SDvKjoSoSmP8+xmeauO5hyGFvLIEZACqptmxkMc1RcpFcZZVqtRPCHNtKNx1tlC0QhqibuHI62zuH83DFLBs5PIrZqI7YSoevLn+z6AvXus88+a65KchmCt7LAXLzClQh2Y7gSITxudLK3N6/bRi9v7p69qsq3oisRTIEtAnmrlQjeVPxOsUC0Xb11794XTPOLmil7um1M3Y+sRMhKKMeC8rNdqYbRcmpigT2oCc8bnnhJlVBUE7l9/aO/j2YLioYzZNpG/jijSzl88ArWXNT90bISYVTvWzDAK9EH1JH7AuHV55KZB3gQXTNyr7LmtJraMvh3BAELwILRdOEYPF6NjtzlEIMF/brPkhwIKFlQsLIekLscPjz50vi2CvttGzt5xmri4bZD7MMTZyZ/7m76+eQZIf/dlh8HCzBeJa4yaIrBgh7dHlHm8wezaQPyTISHJ6tFeoUFJ8cMP2wbf6n92BzHgvzouj7ZgYYRCzDGGOPO3BcsSFQSjwUWOK+7jQWmSpMPgwUYD6/D+8ViPMr+4eb7BxQLStL4brbg5Ph9fpC2r5MXhUmIClgg9rlvPBu6SEHBKTwd/sjr47y2YxMT42IHsABjjDHZgjpYYBIHXhwVcwvyt4qwIIviqnC/nBpYoJjAznvI9hGF69cJqcSwQPOE5AOwAGOMMVjQg2xBFozLswWFEFANC5Io7k5FNLkB5+MpN8SwwClzG9kCjDHGYEGP5hbkY/89wQLd0U/KD3BhbWUscGc/gAUYY4zBgl6tREgGFJL97QtTThewIJlMICYWRMYg7M42b5EnMOxHLFt0aRBh27btGGOM8SB4UO5bIPrfFgJssmFyspNsQdGcBvGWJYDJiUn/9gl2ZuJLk5NZYiCfDNGNKYfr12/AGGOMB8FDdZfDlVhhWLbiESzAGGMMFowQFoiRDrAAY4wxWDCKWCCmUlYbJQELMMYYgwUILMAYYwwWILAAY4wxWIDAAowxxmAB6j4WbJxY3vK43PLK5tlvN+/asOHpb++baLT/rT/+5X2nllNXLkcddOvTr1TZ2GaVZhc35M1cdordtbg1f7el9cdtA9MTaJts2uscrq7Hzs03m1emxZbpxvy5p7r533K60Vw4Nx5566mzCwtnxwo/OHOlqTR/7uTZBbeG/fNT2aFLqhp9q0XTMMZDhQWPXH987vPEH2/b0Y9Ye/CtN27devu92Tqfmbl9+aM7prK/ps7f9s35O2se9Y5vvliz/MVtHx7sUrZARS8ZtutFxw1VilXkUTGu9xILUtzJmznx5ZZTX26MNNzds0pp2o0tp8wWTQwGFALkqoUFCwvzzcZM77CgLOgWx05dsShMrBQfgAUYgwVRTe2c+3znI33tgtfGAh3RvXD+vX99seZfM9WPeeeHH62pTRItBhEaMjp2s2tuacMjjxXBAs0BDVmmCthO2O4QCwRO5RWu3PB49J05t5CjAFgAFmAMFlTXjgt75q6vH+hEfkFE16xw+6WqhSiMqJcnqDK3QETHPNqJYJwnzJPdREQUefKNE26YjGGBPtDTi1tPpckD9WeadXcCaiM7XAorEgvsR9ItSTDe+PS3WSEKceLDFi5bqCYkhctKpnFdjA4EGFE5W2DfcpCrNhaMb5i+0szCmMACk8bXikbo6Ub67pVzaRSUsdy+VrtdmTYfGT+3kH1kWsROnat3DpEMbZgDnx3LdssHI2xu3yswKyrbEA5J5G1xhjZU83W+JGivrKGoqn/EhbPTWYXlxjFbuG0L12iMhw4L9AiChwVTO9UWjQvJyMIrF9aVfHz25VvvT1785O1bt964ODv52a23b30ymQXfQ++pP43fP7TW3/jGxcNO/uCztx6cfT/d30kkuMMHUpferZ4A6AkW5NEx0uWNBDmLEQoFtqbvBvEvj7hOUl1gRB537TwG/eJUziV2o8UIH192eZBh6mAjdMEUirxuotql2YIYFti5BdnOSWXyqQZVEw/lnXIbJjMs0DFShvPstYjcOUmkMa8cC/xJBmnsVAeK5CfyovIQq/ZUJY1nuY1xkeQwb0kEKZmy4E8XCD4V7BP2/qNME85FSIFj8PIfGIMFnWLBuvGPsykFmX83ZYcVMlZoNcSgsCCJ4klEf3lWR/003s++//KsQAF3yCDfTQ4rKDJIX+dsURr7i4mhT1iQRUfZpc5eZ/1vGQLTsNrYkvTUdRR0U/TelEPZ1xdxXWJEpALBRmeWXxp9o6n7WDCWWBB/HccC/6CCdYLsiCCekprUxAIRWZNYqwKbmHAgw1tkrOGpKtmCLNY6kXV+oRkfs4hhQdrzFhWW0uUkaYbCAuWegipmrmTl+/vEsMDmSJqx2YhpY8UJceronkOM8dBmC/K5h+t/9/me8SfLsCAJ4QoLkqDux/t0r/TdUiywGYXDk5/dskihRxAK5xBUH0eoN+JQY4FiEh2dUC2wIEyDJxt3LW5ROyRAEHSm48PqHWNBEGLbwQIPdJaDTEnFbIGzTwfTFFoO4esY1piphgWyp14NC6Id7ub8wkK8fx/HAme4IeCM9XKownnLNM2ruTmEPVBknwALRMIjknWIYgEZAozBgvawIEkkWLeLBeVTC6vkAHQJlZMK9e9boDu733qT8mwfPZzxt3Hi2y0TX9qh9K2zATq0wILiQQQR5sNBBL/MylhQPA0wG3HoDAuiNe98boEI9gsLlQcRMlCwgwhijoL+iJstyLcEgwgRMqg2iNAsCrreuIA7L0EMPSxcUZ4u2sfHAnEepq/k2QJbYHQQYaVWV2KMVzMW6NCeDxwMcbbA9KFl5BNRVnSv7dpFkTOP3+GgFRY4+XkZ2ie+3BqZh/hKkNJPwm1lLHCmPT7u12qrSXvIFrW43UI8IRE5S52sRBh3sgJOkCuZciim+52zkdtunL/SCKcc5ml/N3+QbHcT7AEWCAjIY60YR8h68/F0vW2L5gC57ELsGe4TDiLY+YONKyJboPaXwxNOCkGOI7Sa94AxBgsEFjhpg3axYMDnFoyC287nt+8O7lvQh6WGGGMMFtQfRLDLCtQOF222wB1ZsOsRSrBAx/6Cjv7Kr0QYEXd028GBPxxYgDEGC1aVBve+BXhYDRZgjMGCAVaX7nJYZ3+wAGOMMVgwsBrAZyJgjDHGYMFICSzAGGMMFqAcCxBCCKHBUa+w4IEHHiDqIzSA+v49WwfcfEcIDbjAAtRvPbQSGuLWgQUIIbAAgQVgAViAEAILEFgAFoAFCKFRxYIHL37iPVh5gJXdtzEm/YTo4nf7pB/84c29fxrrtJR9Rx5avLpX+9V76nzuwL9//M/HpsCC3mPBnsuvTfxtbOf3dz72t9cmLv+ivfitC7mp/ZuzO/Pt+8d+c9Ns/+2eCoXsPDtt9syqlGHBicc+v7GDyy9CYMHwYEGsYiOCBTkc1MGCHdf/+dz1Ez0InK9/+t3y8vJX79XEgv0T/3vz0ruJTx0Nanv0pH6r0c7X1bWGnU4alqi8dZWw4BeHbr526EUbsL0/y+DAwYIcDjrDgrX3Xrj53Md/vJcrMEJgwYhiwYpp/xuLS9eO9wMLpt6xBwo0deO5vHfYXST47tNPv6qNBbuO/vXs0f2WALLXqQ6eunn2VOPsimKBatp3n55OXr6n2pe9roQFOhgnNCCC+spgwdYXf2towFZpq0OKhy8c4BqMEFhQQUnfOrONvvqpSMHG8sid7Z8/PylWiDrcyxeT7Z+9dSj5lH1IoygkeyBT/iSnzPnDnD6ZnM3Ktw9+zI9oH+mUHXQ2eYr0LTeRIGvofer4taWlpXf82Hvg/OLS0uIb+8NT4O1vsOCeP5khgKv3H7E7jt2fjgtc3fvnIz9wYn+23eOJSLZg//kPl5Y+PB/Www4fOIFTR7ugN6w2fvfp67aj/PWN7I0b+d5aOkyqyJl88EYUC258rQu+0XoQQUGAkzD4VUPnCXaf6QQLRG1tE3SjVH2yt1QznarKtr3uNcVrYJIgyUEhwIKYy7DAjhekHfp2sCDJTFQZXxCVffKPh8OhhOPvqN9sIV8ihEYRC3QkzmKq6JTrJyhm0V2/dh6vHLnYyycryg59pJCEQtTOyUMa1eGyhzomBJAWImtVnC2wUVweKF4fgz5mH/06LU08V1of3U0/1MGCSJDWWLB49aE/JIHkyKvZ5ICHtvw525i8zghAs0KGDvp1tk8RFhTV0L/6p6HOxkvNB1n8Tlkh+fN0kgs4nQVOs39CDC4EdBULdPLg5K/Wru0EC258bY8r6payjmmR2J43Pwn3OQn1Bwt0Pz6jAc0H7lyEilggP5iPF7SccujxIliAEFgQk5OKt9HXi8p55C7DAjcwFxeSPdM58qxnUUK8YkU1z58TXYwF+Q62OXo3W0jAFpUVv7a6gwhZ1M/5wIn3emeZOVC7+YmE+NwCPWyxtHj+gBxBcEaRY2EvmjDX4S/IB5iBg9dbYkHFKYc6N/DXid354EKKCJ1lCxw6SWvrAo3dnhNPrG3pDsHG2isRNAdMuE6wQPXypx/bXxbvW2OB/lMUoo8l/yxZicA4AkJgQSdYIMNwSyyQ2f5I7qEKFtgMv3XvsUAmQkSuoqamNBW0wgKdGEixIBbv/YkI9bBAHD2YXBbLnAssiIRA0Y0WKYTOsUDH/iQ3kP+ZoUBHWPDeV5FBgXQQIdq2PFvgtV682zkWxLIFIS60hwXyU9WxQP820omoCCGwoJNsgd/vL5VO0Sc7FxVSggVFnfWeYYHDIi93MNuyYBDByRa8uWVfkC3I/vSyBX7yoMYgQiRb4EY7N1sQ6xlLhmg59F4RCxImkJMNdarg3ZuevdmIFbCgICtQhAUOQ7ht8wYLeoUFxSG8vWyBnzwgW4AQWNCRvMH1bNDdGRSol13PaaCgkKJBhGS+YUF/PdKV7wYWlGdBujLlMAjzct6AmGeQzDeUcwvEFMU4FujDRaYcRuYWyH5xEvJLsaAooHYwtyBgghg0uNmC5GQuvTNVBQvkmEg5FtiBkmgWIc4EXZ1bUD4VoNrcAucGCeEEhfpzC2ITVxFCo4oFYiq+CpAqTMZWIrSYb+guQ3Did6yQIizwy3EDdr5cQq5ECLDArUlemSrZAj9hUBcL1oYLFKMrDuRKBDlwIFYi2PmGTiHypkbFCxT11V90Cr25+skKwxrZgjzQurl6b31/KRboaYZOViCfXlCIBWZopug8S+jJa6vaVitbkLftht82cVp6txLhpnOfAzm4YOAguQ9BdMRBrEQomW9YYSVCkuVy5qYghEYeC0ZZXrag/ekFg6XO7lvgBdTI9IK+3OUwwa/W2YL6t14QNBOddDikNz8uGEEoyDkhhMCCUZQ3+8HOilj96uQuh3IFY7VZeN3GAtOFbc0E9VvnjoBEll8OKRZE73JopsrCBAiBBZ30rb07C3U8U2+l5Q4iDAkTmM52B89EcAcRajPBQD8TwR1EqMsEXtM2b9huou/kjp9887Of/WP3Twdti6knz0RACCxAqN3AyaOSKjdNhV4ViVUM/r+f/sdPNt333z96YNC28PtHCCxACPVJJhIrqxhsuumDtoXvCKEhxAKEEEIIgQUIIYQQAgsQQgghBBYghBBCCCxooanzty1/sWb5ozumOIUIIYTQiGOB0aV313xz/k5OIkIIIQQWrF07c/vyu9/jJCKEEEJgAViAEEIIgQVgAUIIIQQW+Dp4xzdf3H6Js4gQQgiBBRkZrCFngBBCCI08FszczhpFhBBCCCzIsIA8AUIIIQQWgAUIIYQQWAAWIIQQQmBBIO5yiBBCCIEF2TMRWJ2IEEIIgQUIIYQQAgsQQgghBBYghBBCCCxACCGEEFiAEEIIIbAAIYQQQmABQgghhMAChBBCCCGwACGEEEJgAUIIIYTAAoQQQgiBBQghhBACCxBCCCEEFiCEEEIILEAIIYQQWIAQQgghsAAhhBBCYAFCCCGEwAKEEEIIgQUIIYQQAgsQQggh1Ev9P6C6Ufmqlk+SAAAAAElFTkSuQmCC"},4541:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATsAAAD4CAIAAAActdY+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMjM6NDU6MzgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE1OjE3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE1OjE3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmExY2ZmNzZjLTIzOTEtZGI0My04MmUwLWVhNTc4YmI4OTQwZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphMWNmZjc2Yy0yMzkxLWRiNDMtODJlMC1lYTU3OGJiODk0MGUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphMWNmZjc2Yy0yMzkxLWRiNDMtODJlMC1lYTU3OGJiODk0MGUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmExY2ZmNzZjLTIzOTEtZGI0My04MmUwLWVhNTc4YmI4OTQwZSIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMVQyMzo0NTozOCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvjFD/IAAA0bSURBVHja7Z27btxGFIb9JJKMAEYMqHFqxa0qR2lSuJABFUZKGQEMeCsX2+kV8gh+ivR+qCyHu+Rczly4vM3hfh8MWKJ4W5LfnplZ/stXVwCgh1ccAgCMBQCMBcBYDgEAxgIAxgJgLIcAAGMBAGMBMJZDAICxpexe3r3s33yYcxMPn78e+Pyw4qs0u/Dl8W6ZnT8sc9zW3eOX2LLn75JZtFmyWfs6x3XynT9MXfUCUWbsy9unuTez3sU19gobuvPNzN2WMLZ0553DhrGwFN6FlzB25EbMWvtirusIyTuv5dXkjX3ev3vZ/SJOMRWy/Xesk82fDq3cD2/2Zvr++aadbf/85jTz7fOH05zusrE53Q01/3ZPffE59zC37c2Odi3tGr9aLdHDlMOfupm76z+c83jKuz+0k/v5PHWs7Z9egbXO80TzL7r28vR3Xtql2Mu8pOM5z/tbFcYar26edifTWj/NPMbY233TNb0xTjbz7CzNdi/O2rp5bDO9OY/vAqcNte8CI41tzq91CbQ/9hP7YmVvo69g0pyna8ZMzxS7U9ts2gsmqBLOAbL2Odyc/DIv7HjqUDZv7NOuFebGLq27J3kAyRh4rI0fnm/bn21LvaEmwdhgzp1lqf3zyI7Q6dx0F4M7/GAuf+8snn4R5rzzLptQiFynaXS3MLzg3CmusokdHH7lbuR4qmgY54014r19OjZ02x+Mk09v7ZaqZaw/kjTS2L7Imy3uJhinss6m9+7vtuzkK0ya8y55vlPqSC27ke2GAiunNXYjx1NFkS0YeWo8efv8fLt//uUgz27X/Gq3hIMaO4Ox3fuC2z4fN9ronk75dMWuMOHEFl9h2QtDauRNUmOjDcuRxm7keG6kxho5D13Tprgd6u1+f3sQye5SmiI8l7HthuS6enY/Nn4xBZPFS1lucBVfYdkG25mfNYj92KCxOoOxGzmeW+nHXtmfmrYtYaNc07891b1TX3eAsd7wbz8xmLPfkFdmR448BSObXkuua9tJl3I4p3iFBQ0+W6BgQ1/HDRUHzUNhJyO7NGWN1Xo8NzNWvDJu37UbzRrdjfXeotV9sDhlcZ5is+qP53Y+j12XtsndGWvq7Whjw1FTPTep1eis/uPJPU+TVlmnVTxaV6EVtxVd1ysWyo8n9xUDAMYCAMYCYCwAXIyxv11/++v1P+8nmtPM8/dvs+3DlAM9/fjNOuOW5bnTcYnfGQ5d2Ton+ch1yGsvOqP9TCX7tpqx1//89fpb/+/m06+OLd/uS73KzKnM2GVUjWwIY6d/XyveXOm+rWvs/fzbwdg1N7RFY4sZtjWdxlqF996W5+bT++vj9D+uf4/N2VVde87W2Pen+Y+LO2vozbQXTxubuwEwSIiWvOcmbwy278IVQ+FhpluYM8zJ9AHUcH2fH483gj70N4RGAvG5ewcjM+eMHXBLcP50yBH/2I2Twp2Xw74MQDjdQu5+CzXW/dPRous/hYLpraT51ddMXtxasJto19VMjbXPRaeZFMt2TlpJxqTM2DAUbl/Z3U1H0UR7rBA52zNX1+E36/9+oehrsW5GiObUc7sx1Nji0yEeENlYMaMvvXbhdETeFsVzpMzY/p8xKm7s0VJfJMFYd1Xy4r+/v7F6ztd/m5X8eW8tmzRWDrHJsWz3ZvfMtVdurD9R+oKJRNqu1Fgnp1pirH0QpER7Kv93rrHFp0PM1cZD9qNjT+kWln8EN1Zjy4xtVZRaxe7iRk733/3Vpz9GGRuJZfcz54UdZ2xwTSWC3zMZ61giJtqLjRXKVGze4tMhupYPAAZvGucbG/f+Uo3tMPr1bd1kjbUXGWeseMD72HZJ626aGitVj9lrrHdzrnhAFquxBXn65BfZSBn9aWusFI28YGPbYhszVlywX6RtJyf6sV4fx+ojSYfcuPrw+CV/OkRjrV5Xot9lf82C022zO5XOtyZJHpxvrHC9iQdEPHQj+7Hlp0OM+EsHOanPmcbK50i3se5Q7dEZUbn4nP5Ib0x4d+Z2hrYym18baRNjxdbQoFU8Y6Ogp7GbMz6Z6FbZjtem0udWVYjHxIVWpziEbLW07f8TgXhpsFjaAfnQjRsrLj0dkQMiHGQxoz/wywDSY8XJb+eo0ViY//NJJd+qUCErZPQxFmMxdsyZWDqjj7FKr5Mp7yvG2CnOxewZfSX3FQPAGWAsAMYCAMYCwIUYOyA9V0IFz30Xdik9XDVrDK2C+N40kd36r5CajHXuCp5SsCEp+WKkIf81A6652xHmDY6W3IR5ScbGrpAtGtveftTerD84iV57oZtzQxnrZo5680nSBbaKbWO92Kp0l2IQcy/Pvstzhjc/usG97Ptp7k4990Z87+njhY85j28ofZfjvFHvyNZVP7g92LqZ0L1E69ZTMbh/acaaGmviNan7it2cenn2PR5zb5viYrjnrNJ39/g5vP1efPp48WPOEwXTn7xs1Du+dYUPbpePfLdON7oonqOLMVase6KxRRPjxsp1+1erCE9grHi5hE8fL3/M+YC43MpRb9UPbo8eebOVRzcUlXjXupQaG4RsljDWzGNV+PImcWZAKGjBRp+zWPCY87SxQZ5s0ah3uITWB7fHj7xvfWrOi2oV9/nyZY318ndjjZVLgnjZFT/mPPNW3v9p8ai3t2OKH9yeOfIP/XvV4iNutRor1VsraD6DsWaLZ9RV/0THOpLtm3HM2AGPOc91mPq1Lx31drau68Htfr4+snR3RPull374ZrVjxa1jpjfbfS1THzQfWHiLUvKnd4RRZTYxtNv3frI1NvmY8+g46lViWHfeqLe8dU0Pbhe+ESPYuvvFBNbnv4O+z3VLxq6L13dtmuX9lxvPzrQR6vnGP0r2U/raRKUPbq8QjLUV7Y019XZBY7U85rx8P/U/uB1ja8dtFS+oq9AqrvfiLt9P5Q9ux1gAwFgAjAUAjAUAjAXAWADAWADAWACMBQCMBQCMBcBYAMBYAFjI2O8/fv7879+PVx///e/nzx/fB27DLGWwFhUnrsy4lwlQsbHNFOua9n6NeRvMIk7EWIBxxnZiHa7p5pLeqLHhywTYSD82amzf2vVULDO2WdGRjDPWnGZub2XHX0r2k3IKF2usNblRwpauwFh7kUzL1FPP/CgZ6+5o90tdtR1gEWM9fpiprsaWsnljvXeBlFX2rJ3norH21H6H6KkCNfaH09IMWrZFxmaLsvU3q8a2i8nGOr1Tb5dLWt8AmzY2WrgG19jkaJZd4+2GtGCs1aWVVncaIAa4OGOTjc2Cfqwtj98Nzq/LXqQV2qneB8TVJTcEsGFjgzHYvnvpdni/Rya6tTPZzfRHiq3uafv79+h7gb+T9GfhAoxdF6/G5sskH7ACxq6IW+GzA78F93cAYOzczha0a4+zUV8BYwEAYwEAYwEwFgBqNZZEO4BuY0m0A9RrLIl2AN39WBLtABswlkQ7QLXGkmgH0FxjSbQDqDOWRDuAFmNJtAMoMpZEO0Ctxq4LiXbAWE2QaAeM1ecsiXbAWADAWADAWACMBQD9xpJoB9BtLIl2gHqNJdEOoLsfS6IdYAPGkmgHqNZYEu0AmmssiXYAdcaSaAfQYiyJdgBFxpJoB6jV2HUh0Q4YqwkS7YCx+pwl0Q4YCwAYCwAYC4CxAKDfWBLtALqNJdEOUK+xJNoBdPdjSbQDbMBYEu0A1RpLoh1Ac40l0Q6gzlgS7QBajCXRDqDIWBLtALUauy4k2gFjNUGiHTBWn7Mk2gFjAQBjAQBjATAWAPQbS6IdQLexJNoB6jWWRDuA7n4siXaADRhLoh2gWmNJtANorrEk2gHUGUuiHUCLsSTaARQZS6IdoFZj14VEO2CsJki0A8bqc5ZEO2AsAGAsAGAsAMYCgH5jSbQD6DaWRDtAvcaSaAfQ3Y8l0Q6wAWNJtANUayyJdgDNNZZEO4A6Y0m0A2gxlkQ7gCJjSbQD1GrsupBoB4zVBIl2wFh9zpJoB4wFAIwFAIwFwFgA0G8siXYA3caSaAeo11gS7QC6+7Ek2gE2YCyJdoBqjSXRDqC5xpJoB1BnLIl2AC3GkmgHUGQsiXaAWo1dFxLtgLGaINEOGKvPWRLtgLEAgLEAgLEAGAsA+o0l0Q6g21gS7QD1GkuiHUB3P5ZEO8AGjCXRDlCtsSTaATTXWBLtAOqMJdEOoMVYEu0Aiowl0Q5Qq7HrQqIdMFYTJNoBY/U5S6IdMBYAMBYAMBYAYwFAv7Ek2gF0G0uiHaBeY0m0A+jux5JoB9iAsSTaAao1lkQ7gOYaS6IdQJ2xJNoBtBhLoh1AkbEk2gFqNXZdSLQDxmqCRDtgrD5nSbQDxgIAxgIAxgJgLADoN5ZEO4BuY0m0A9RrLIl2AN39WBLtABswlkQ7QLXGkmgH0FxjSbQDqDOWRDuAFmNJtAMoMpZEO0Ctxq4LiXbAWE2QaAeM1ecsiXbAWADAWADAWACMBQCMBQCMBcBYAMBYAMBYAIwFAIwFgGn4H/SZkYOSji3nAAAAAElFTkSuQmCC"},7811:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc0AAABxCAIAAAA4WG/wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMjM6NTc6NTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE0OjExKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE0OjExKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM5NGVjOGRmLTgxOWItY2E0Yy1hNGU1LTI5YjgwOTNiMzZhZCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozOTRlYzhkZi04MTliLWNhNGMtYTRlNS0yOWI4MDkzYjM2YWQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozOTRlYzhkZi04MTliLWNhNGMtYTRlNS0yOWI4MDkzYjM2YWQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM5NGVjOGRmLTgxOWItY2E0Yy1hNGU1LTI5YjgwOTNiMzZhZCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMVQyMzo1Nzo1MSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pv9UT9UAAA5ESURBVHja7Z27buQ2FIbzJLaDAIss4CapN9tutXGaFC68gAsjpRcBAuxULqbzK/gR/BTu/VCZoW68nENSEnWb+T4ssJ4ZSiIp6tfRofTrpwsAAJiSn+gCAAB0FgAAnQUAAHQWAACdBQBAZwEAAJ0FAEBnAQDQWQAAQGcBANBZAABYmc7unn973n/4OuUmbh7+O/Bws2ArTRW+332ap/KHZeptfbr7ri07vEpm0eOSx7Uv06/FK3/4dtEBMnFnDeuqDexNdLaHzj5/vJ96M8tJQoGR1Kvyx8LtltDZ3Mo73XZaohlbxPSCwwKdgM7CxvDkIqKzIzdi1rr6SKlX5TfRmsI6GwreyYb1q9fZx/1vz7tfxG9MNFr9q2PS40/7D1+/ftib7/ePV1Wx/eOHpvD149empLusVtLd0PHf7t46Gw88OKorcu88bp3f6wF3+ObwU1u4HYZhyXpAtz9UX3flvBFsbb9pgR1dDBrv/iFViYpfealKWjPPqT+zzkozNdMpaTYShp7h/vQC9J5BakyQg9/azvLrqbRI7pA+QzHV8ys7RRTQWaOGV/e7Rh8rVTVljM5e748p1yujpMcyO0scd8/O2toytp56JWvtbjZUafdIne1O3dYFpHU+bwNDextdtCiVbAZCO/oigWVz9dr7MO93oDgd5EUr7ubkZp5Zf6aXmK2Zn+4e7ORP27ZQC9V1ujo+svHBr/UXYj3DFsUHWM5QFHt+muu1hXT2flfJ3JUdxu7ugzSrkUKjm3Uc+vXxuvrb1lZv4kvQ2aDkztJW+++RKSE7cDD70p0MMcPT25XNB6HkJ+9gD8dOKhk4Ot0Zjjr3G1doIxXsP3xPpD9TkjR3M8PvpGxHsPVgt2fobEbTnXSLUN5OyXgtig+wjKEo9vzS0y5lddbI5cf7OhVQ/WGU9P6jfS1v6aw/rzVSZ7uA2mxxV2DWzDsnKhdm2gGjzB5EhmpM8KSL0pExesYALquzJ9KfqYbP2EyvsKaz4tb762z6Eqa6mj+s7Ih1zpDqKW1xpM5KPV/gkFnVPNhR3T4+Pl7vH385SN5ud/xo5wqCeHYCnW3V3M1gjApovbSSfJBpB4xwOGbrQlLHpMvgIvGseuk9UmdPpD+TkjRXM9UYV87Ap85CqbbnTIAZYb15MKnThxsju1o9J9BZqecLHDKr0lkTwO73x0DyENvu99cH+bNTpSbgnUpnqw3JMezg/Kx+bEQv2qSz6xBdSF7vDLzLSJ+syEqKDdfZE+nPnHB2nmZ6Sdf/1L0or9NLZqZD1YzeOersncnGHsofYlr/ct6qZ3mdTY/I1d2YN+S+ru4u1ypXYITymLdtYswmh9tDZ71bCLovg5LdhryQduQ8mHDXYDhLq40PYT5XG17SHLHzg3D9OSzp5Mcl4qSzWKWS8exW+zOj2XM107mH4E6YJlLuN3AmPesy9RV/Ri4knRqy0qLhnRZ3vePZHkNR6vkSh8yqdHZJ3JxsO7c2Oj3rnU9P4z7phVpyEv2Zvr4+2WGziXG9sZ7fmM5WSYlWZ01sO1pnw5n3k7k/e5EhuP3+zOq2Ex426z8Hbq3nt/c8mJs3GC2ywgXgaR0tSzzYtPH+zPU3OOVhs36l3VTP89wtAAA6CwCAzgIAADoLAIDOyvx++ePvn//9XKikKfPP75PVoeS0U5fsX+aulXwn0DKeoVPM2EXXWcR4pE/bs/ZoV2gbM2vp3dbLNx3/2Sm5/Pfvn390/66+/epo3I8vuWqYKLkxnZ1nvCkbQmfLn42yN5dry7joCMm9cbDP7YVjxpLoCZk4mYlei8V7dVU6+2X67aCzS27oFHW2lwjkb20TOttDP2eoqnUei/sbOH3bLGW3pbzF+ap11gpyv9iSd/Xt82X9/Z+Xf2gl2wjXLlnp7OemfL24s4ZOT+3F4zqbeqQ1sCbN2ZtRgwL7acWUEXLnceKX1OyiBcfl6on26tHmm+4RZ8WbOfU07EAL6h7WBOndIRufa8/ICo969rNIF3a34EaeqbNZPt8xp+2LTJNyfUOqG6IcUmacOEZZzrtDIzpQnHrX9VJtQst4h28gnnV/qrXv8i8hOPVWcvzoi6O8uLVg+6UdwybiWdFHWXJcdnZmjq9Uns6GRsj2MGufl1F9vrVYIzjvNwOy/j8YrNHUXAkL6t4PakV3h9gh+gP1gbG01HZhdyhSJe6jsfFsptP2px4m5equkbYeqXRuPD/Qct6ujd1gNWvQnUZqDxx71c3HUpc8K83PGh3UdbbWVl/+BJ11VyUv/sfnKysjfPmPWclfX6xlozor+87JLs7ueTI9fZCps/6X0ssSIgZ5uTrrGKTm6KzdCUUsqDN0Nnt3iL61vYylNV2QT6Xxqxm/BwvkDaJO27km5foIEWoYfwR20Kscsi2NnKDdjwP0DK2jzU6k352KCwjtNuPZPJ2tBFTKG7iLG0l1/325+PbnKJ3VXh1qv0gpwwd0uM4GShCxw55IZ52jdpwFtRASamWzd4d4RPc1lh6ls7paD9fZPk7bOSblus7Kaa+I03ZmbDhcZ/0cVTSetUJ939WsSiYF6ZUx+eWT1tkWI5pdNiAaz9qLjNNZcTd3Fpo5179l4lkpUps8nvVu5iljQT00ns2w346+YyZmLF0mnpVMLPvrbL7Tdr5JeY94VqvJHPGsNzQSJ223pGQYHHdbR2ellVSBraaz4oLdIlUmIZKfFX2U1QsOswtv7r6nz+yizjrnXjWfaI8JJ1yxT9LfxXf7FdHZ3GvKfhbUefnZ/N0hGp9Lndwj75its/I+6qezwWLZTts9TMrVfk/eyzGgRcN11vbBFSbFvOHu7hb1MBswB7s9nXWn+2ulE4VSL+nfLaDJtFu4KlBFwebjUWoj9xvIPsraTHqXhR9+VVjN+cc8ua14JeIAHV5tao7Lks5GvJkTU+EDLKjzx3ru7lA6ROjkDGPppEV6/H6D6CsY4h2i3B4Qd9rONymXN6TF4KqLVt5LEMZZzndrEF6b5k1zScF84s6ZEXlanrtdL6VvOVzze5fXzQLG0hPvrDItWtf9s2sGnUVnIWNPzG0sPfHOKtWi8s+DobMw/9Fd8jFAdLbEvpjceGAmf4NiLSrsb4DOAgAAOgsAgM4CAKCzAACAzo6jh89hDt1DA6shOTkxqWHgCm7iWZdd9ApHCKCzBsedoKQs9vEOz0a6NWZJe9DUTf/TGrPmPFZ8TjqrjRBAZ9ehs9WjWZXVS29/7rUHlVNuKKGVExtgcw8ZwOZ01rOFlZ67Dcy/8x3B5ZLh47yuxWIydlm5DfOEBtjK1rNapFs7C09Gil0n2UX725ceM81+KtTajGt56m+fUw1sL541lloxfwPXvTvfEVw3/66SFaKh16Awc04b5vDreQ2w9a0nWiRbO6s24UHXyRG1ZLeUH3XLPd+u03tlirSPAJ1dsc6KMaaos1lf6jorx8i/WgFvAZ0VD/JpbJhjIejFAgbYuS3SNyS0XfYBVD7JjqhZQqv2vNnKnWuEFjnXADq73ng2MNaaQ2dNGSuazk8axI6y+WyYA7GZ3QA7XCKnRfKGlLYnXEZllZdzCTE91Hve1+pYSUBnV5436Fy359VZzylxrM7OacMc/DS7AfaF+NKmdIs0nZVfjJOnszkvY9MlMdHzN90Zhvk/2LDOSrGtZb89gc6aLQ6IYf3Dczkb5kCK5jbAdrbeo0WpwHmIziZTBFFnaG3ptke7pbl7C7ars7Uymixt+zqvzn67Z5Cb5R3e6PiokHZRG+ZQcGYywJa3nt0iLass1EpNuSReay6lLULHasEs2lrctWu37tft9aZ0QGfPGS8ne0xctHNx01PWWHq62ZicekqvtmUqHtBZ8N7DWMW2M+rsAsbSE9dzKy0CQGfnxM0bzCiyQt5gvZKUX8+ttAgAnQUAQGcBAACdBQBAZwEA0FkAAEBnAQDQWQAAdBYAANBZAAB0FgAAnQUAAHQWAOAsdPb25e294vXpdHvm2MpTbh8ArD+eXVCHnl7f315ut6Czh5q+D6urWfIMTmcA6Cw6O05jX18OaxlZ19vxqwCAE9HZLp3QykIliO0PTXE7VmtLW4t3q7W+NN/an1PB3qHsYc3ttqpyTq3rD4ciRg+PNXmq/29+9BaX6yk18+nVNEsSSbPOHhI+y2kFANavs7cvr40WdNpSq5Qp1n5r4rxW9Oo/uy+txbWQMk94bmvJvLXXqejsu/f/m7t4Vz2xnmIz9WC0p84iswDobOSno6K82fL76iiVo73WuhplsXR4oM76kqrpbFOJ9n+/fabWWj3DZj4VuOg/j+lGAHS2h856l/SNzgYiY4mnE2W+C7kEK8Vgr2cBna1OEko9I/UpkVwlQQuAzl5caCGdKEB2drb+NT3n5Kx/mXj27UWr58Q6yy1mAOhse139ZAW2ms7KmqFlCGS9yhMvVWetnOt7ns66gXdQz546O2AeDJkFOC+dDS6e2/mf5vNLdjxrJQSc1QrZBO3ehtj9BqHOWotWNxdEdTaopFhPPT0itTNPZ53FEVmAM41ny1wDk3sEAHS2MO5FcDJfAACAzg5S2pLXxF4egottADh7nQUAQGcBAACdBQBAZwEA4AKf73grmUsDgCXjWfxns09H/dejGz4AADqLzraL2144o+rLg7cA6GwQg+HzHdNJfL4B0NlBOovPt+jzPV5nyRMDoLOxn/D5Hp02IJgFQGeltAE+31Jrh3YyMguAzoZBGz7flsiOkUkmwADQWXy+dZ3VRTY3P0swC3C2OovPd47Pd+Ai1s/nG8tIAOLZQmEwMRsAoLOlwecbANDZOZQWn28AQGcBAACdBQBAZwEA0Fm6AAAAnQUAQGcBAACdBQBAZwEA0FkAAEBnAQDQWQAAdBYAAArxP/4zZrK4il29AAAAAElFTkSuQmCC"},5243:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAT8AAABuCAIAAADeYYMaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTJUMDI6MzA6MjQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjEzOjE2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjEzOjE2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ1MTZkNGU0LWY1Zjkt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"},6714:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/generics-5-9f575c9b47e95f4301f0e9db22059d17.png"}}]); \ No newline at end of file diff --git a/assets/js/5925ce9f.d25861ea.js b/assets/js/5925ce9f.d25861ea.js deleted file mode 100644 index ad65a9ff..00000000 --- a/assets/js/5925ce9f.d25861ea.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9831],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>g});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var p=t.createContext({}),s=function(a){var e=t.useContext(p),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},m=function(a){var e=s(a.components);return t.createElement(p.Provider,{value:e},a.children)},u={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},k=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,m=d(a,["components","mdxType","originalType","parentName"]),k=s(n),g=i,o=k["".concat(p,".").concat(g)]||k[g]||u[g]||r;return n?t.createElement(o,l(l({ref:e},m),{},{components:n})):t.createElement(o,l({ref:e},m))}));function g(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=k;var d={};for(var p in e)hasOwnProperty.call(e,p)&&(d[p]=e[p]);d.originalType=a,d.mdxType="string"==typeof a?a:i,l[1]=d;for(var s=2;s{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>s});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:37,title:"A.37. Generics",sidebar_label:"A.37. Generics"},l=void 0,d={unversionedId:"basic/generics",id:"basic/generics",title:"A.37. Generics",description:"Chapter ini membahas tentang generics.",source:"@site/docs/basic/generics.md",sourceDirName:"basic",slug:"/basic/generics",permalink:"/basic/generics",draft:!1,tags:[],version:"current",sidebarPosition:37,frontMatter:{sidebar_position:37,title:"A.37. Generics",sidebar_label:"A.37. Generics"},sidebar:"tutorialSidebar",previous:{title:"A.36. Traits",permalink:"/basic/traits"},next:{title:"A.38. Tipe Data \u279c Option",permalink:"/basic/option-type"}},p={},s=[{value:"A.37.1. Generics basic",id:"a371-generics-basic",level:2},{value:"A.37.2. Mengasosiasikan traits ke parameter generic",id:"a372-mengasosiasikan-traits-ke-parameter-generic",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"\u25c9 Contoh ke-3",id:"-contoh-ke-3",level:3},{value:"A.37.3. Multi traits pada parameter generic",id:"a373-multi-traits-pada-parameter-generic",level:2},{value:"A.37.4. Keyword where",id:"a374-keyword-where",level:2},{value:"A.37.5. Generics struct",id:"a375-generics-struct",level:2},{value:"A.37.6. Generics method",id:"a376-generics-method",level:2},{value:"A.37.7. Method khusus untuk spesifik tipe parameter generic tertentu",id:"a377-method-khusus-untuk-spesifik-tipe-parameter-generic-tertentu",level:2},{value:"A.37.8. Generics enum",id:"a378-generics-enum",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:s};function u(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang generics."),(0,i.kt)("p",null,"Generics sendiri merupakan salah satu fitur yang ada pada beberapa bahasa pemrograman (termasuk Rust), yang digunakan untuk menambahkan fleksibilitas dalam pemanfaatan tipe data pada suatu block kode. Dengan adanya generics, kita bisa menentukan tipe data yang digunakan pada parameter maupun return value sbuah block fungsi, method dan lainnya."),(0,i.kt)("p",null,"Generics dinotasikan dengan ",(0,i.kt)("inlineCode",{parentName:"p"},""),". Kita sempat sedikit memanfaatkan generic pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector")," dimana dalam pendefinisian tipe data harus dituliskan juga tipe data item (via generics parameter), contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec<&str>"),", dll. Kita juga sempat sedikit belajar tentang topik generic pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),"."),(0,i.kt)("h2",{id:"a371-generics-basic"},"A.37.1. Generics basic"),(0,i.kt)("p",null,"Mari mulai pembahasan dengan sebauh contoh definisi fungsi yang memiliki generics."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something(arg1: i32, arg2: T) {\n // ...\n}\n")),(0,i.kt)("p",null,"Pada contoh di atas, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something")," didefinisikan dengan 2 buah parameter argument dan 1 buah parameter generics. Parameter argument pertama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"arg1")," bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", kemudian diikuti parameter ke-2 bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah parameter generic fungsi."),(0,i.kt)("p",null,"Dalam pemanggilan fungsi tersebut, ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," generics dan tipe data argument ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," harus sama. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n do_something::(24, false);\n}\n")),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something")," dipanggil dengan disisipi argument ",(0,i.kt)("inlineCode",{parentName:"p"},"24")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),". Parameter ke-2 fungsi tersebut tipe data-nya jelas ",(0,i.kt)("inlineCode",{parentName:"p"},"bool")," karena pada argument-nya nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"false")," digunakan, oleh karena itu tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"bool")," disisipkan pada parameter generics saat pemanggilan fungsi; dengan notasi penulisan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"::"),", posisi penulisannya di antara nama fungsi dan tanda kurung pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"("),"."),(0,i.kt)("p",null,"Apa yang terjadi jika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diisi dengan tipe data argument ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," berbeda? program error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(7757).Z,width:"690",height:"169"})),(0,i.kt)("p",null,"Ok sampai sini semoga jelas."),(0,i.kt)("p",null,"Khusus untuk fungsi yang generic parameter-nya dipergunakan sebagai tipe data parameter, maka boleh untuk tidak ditentukan tipe data-nya saat pemanggilan fungsi. Contohnya bisa dilihat pada kode berikut, dua statements ini adalah ekuivalen."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"do_something::(24, false);\n// T adalah bool, karena ditulis secara eksplisit\n\ndo_something(24, false);\n// T adalah bool, karena diketahui dari tipe data argument.\n// nilai `false` pasti tipe data-nya bool\n")),(0,i.kt)("p",null,"Tipe data generic boleh tidak ditulis karena nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," bisa diketahui dari argument pemanggilan fungsi. Sedangkan jika nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," tidak digunakan sebagai tipe data parameter, maka wajib untuk di-isi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," saat pemanggilan fungsi."),(0,i.kt)("p",null,"O iya, jumlah parameter generics tidak ada batasan. Bisa saja ada lebih dari satu parameter generic yang didefinisikan, contohnya bisa dilihat pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something_v2")," ini yang memiliki 2 buah parameter generic, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"R")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v2(arg1: R, arg2: T) {\n // ...\n}\n")),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"R")," digunakan sebagai tipe parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg1")," dan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," pada parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2"),"."),(0,i.kt)("h2",{id:"a372-mengasosiasikan-traits-ke-parameter-generic"},"A.37.2. Mengasosiasikan traits ke parameter generic"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something")," yang telah dipraktikkan, susah untuk diisi dengan apapun. Memang parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg1")," tipe-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", dan harusnya mudah untuk bermain-main dengan parameter tersebut. Yang agak repot adalah parameter ke-2, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," yang bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something(arg1: i32, arg2: T) {\n // ...\n}\n")),(0,i.kt)("p",null,"Parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"arg2")," hampir tidak bisa diapa-apakan."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Misal mau di-print, tidak bisa, karena tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," tidak implement trait ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},(0,i.kt)("inlineCode",{parentName:"a"},"std::fmt::Debug")),"."),(0,i.kt)("li",{parentName:"ul"},"Misal diisi nilai numerik kemudian dijadikan operand operasi aritmatika, juga tidak bisa karena tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," tidak implement trait ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.Add.html"},(0,i.kt)("inlineCode",{parentName:"a"},"std::ops::Add")),", dan trait operasi bilangan lainnya."),(0,i.kt)("li",{parentName:"ul"},"Misal diisi dengan nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"bool"),", tidak bisa digunakan pada seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"li"},"if")," karena tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," tidak implement trait ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html"},(0,i.kt)("inlineCode",{parentName:"a"},"std::cmp::PartialOrd")),", dan trait operasi logika lainnya.")),(0,i.kt)("p",null,"Repot kan? Tapi tenang, tidak usah khawatir, ada soluasi agar tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," bisa dimanfaatkan, yaitu dengan mengasosiasikan trait ke tipe data generic (sesuai kebutuhan)."),(0,i.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,i.kt)("p",null,"Contoh pengaplikasiannya bisa dilihat pada kode berikut. Ada sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"print_x_times")," yang tugasnya adalah menampilkan data ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," sejumlah ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," kali, dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah parameter generics."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n print_x_times("Hello guys", 10);\n}\n\nfn print_x_times(data: T, x: i32) {\n for _ in 0..x {\n println!("{:?}", data);\n }\n}\n')),(0,i.kt)("p",null,"Parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diasosiasikan dengan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug"),", dengan ini maka kita akan bisa print parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"data")," yang tipe data-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("p",null,"Untuk mengetes hasilnya, jalankan program. Bisa dilihat text ",(0,i.kt)("inlineCode",{parentName:"p"},"Hello guys")," muncul 10x."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(4541).Z,width:"315",height:"248"})),(0,i.kt)("p",null,"Cara untuk mengasosiasikan trait ke parameter generic adalah dengan menuliskannya dalam notasi berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn nama_fungsi(arg1 ...) {\n // ...\n}\n")),(0,i.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,i.kt)("p",null,"Pada contoh ke-2 ini, dideklarasikan sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"find_largest_number")," yang tugasnya adalah mencari nilai maksimum dari sebuah tipe slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_largest_number(list: &[T]) -> &T {\n let mut largest = &list[0];\n\n for item in list {\n if item > largest {\n largest = item;\n }\n }\n\n largest\n}\n")),(0,i.kt)("p",null,"Seperti yang sudah dibahas pada bagian sebelumnya, bahwa tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," tidak akan bisa diapa-apakan kalau tidak diasosiasikan dengan trait. Maka pada contoh ini, tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diasosiasikan dengan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd"),". Benefitnya, semua data dengan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," bisa dipergunakan dalam operasi perbandingan."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tanpa adanya trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd"),", maka statement ",(0,i.kt)("inlineCode",{parentName:"p"},"if item > largest { ... }")," menghasilkan error.")),(0,i.kt)("p",null,"Ok, sekarang panggil fungsi tersebut 2x, yang pertama diisi dengan data slice dari sebuah array, dan yang kedua data slice dari sebuah vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let data_arr = [0, 1, 2, 3];\n let largest_number1 = find_largest_number(&data_arr);\n println!("largest_number1: {:?}", largest_number1);\n \n let data_vec = vec![4, 5, 6, 7];\n let largest_number2 = find_largest_number(&data_vec);\n println!("largest_number2: {:?}", largest_number2);\n}\n')),(0,i.kt)("p",null,"Hasilnya sesuai harapan."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(7811).Z,width:"461",height:"113"})),(0,i.kt)("h3",{id:"-contoh-ke-3"},"\u25c9 Contoh ke-3"),(0,i.kt)("p",null,"Trait yang bisa diasosiasikan dengan parameter generics adalah semua jenis traits (tanpa terkecuali), termasuk custom trait yang kita buat sendiri."),(0,i.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Ada custom trait bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"MyTrait")," dideklarasikan, kemudian diasosiasikan dengan parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," milik fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"do_something_v3"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"trait MyTrait {\n // methods declaration\n}\n\nfn do_something_v3(arg1: T) {\n // do something\n}\n")),(0,i.kt)("h2",{id:"a373-multi-traits-pada-parameter-generic"},"A.37.3. Multi traits pada parameter generic"),(0,i.kt)("p",null,"Bagaimana jika ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," perlu untuk diasosiasikan dengan banyak traits (lebih dari satu), apakah bisa? Bisa. Cara penulisannya kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// fn nama_fungsi(arg1 ...)\n\nfn print_largest_number(list: &[T]) {\n let largest = find_largest_number::(list);\n println!("largest number: {:?}", largest);\n}\n')),(0,i.kt)("p",null,"Fungsi di atas adalah fungsi baru, namanya ",(0,i.kt)("inlineCode",{parentName:"p"},"print_largest_number"),", tugasnya adalah mencari nilai maksimum kemudian menampilkannya."),(0,i.kt)("p",null,"Proses pencarian nilai maksimum dilakukan dengan memanfaatkan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"find_largest_number")," yang sebelumnya sudah dibuat. Fungsi tersebut memerlukan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd")," untuk diasosiasikan dengan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("p",null,"Setelah nilai maksimum diketemukan, nilainya di-print ke stdout menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Nilai maksimum ditampung pada variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"largest"),", tipe data-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),". Agar bisa di-print maka perlu diasosiasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("p",null,"Bisa dilihat cara penulisan asosiasi multi trait ke parameter generic seperti apa. Cukup tulis saja dengan separator tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"+"),"."),(0,i.kt)("h2",{id:"a374-keyword-where"},"A.37.4. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"where")),(0,i.kt)("p",null,"Selain notasi penulisan yang sudah dipelajari di atas ada lagi alternatif lainnya, yaitu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"where"),". Kurang lebih seperti berikut penerapannya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn print_largest_number(list: &[T]) {\n let largest = find_largest_number::(list);\n println!("largest number: {:?}", largest);\n}\n\n// ... adalah ekuivalen dengan ...\n\nfn print_largest_number(list: &[T]) \nwhere\n T: std::cmp::PartialOrd + std::fmt::Debug,\n{\n let largest = find_largest_number::(list);\n println!("largest number: {:?}", largest);\n}\n')),(0,i.kt)("p",null,"Silakan gunakan sesuai preferensi dan kesepakatan tim. Kalau penulis lebih suka cara ke-2, karena terasa lebih rapi untuk penulisan fungsi yang ada banyak parameter generic beserta asosiasi traits-nya. Contohnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something(arg1: T, arg2: U, arg3: V) \nwhere\n T: some::traits:TraitA,\n U: some::traits:TraitB + some::traits:TraitC + some::traits:TraitD,\n V: some::traits:TraitA + some::traits:TraitD,\n{\n // do something\n}\n")),(0,i.kt)("h2",{id:"a375-generics-struct"},"A.37.5. Generics struct"),(0,i.kt)("p",null,"Selain diterapkan di fungsi, generics bisa juga diterapkan di struct. Cara penulisannya, tambahkan notasi parameter generic di antara nama struct dan block struct."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct Point {\n x: T,\n y: T,\n z: U\n}\n\nfn main() {\n let num_one: Point = Point { x: 502, y: 120, z: 4.5 };\n let num_two: Point = Point { x: 1.2, y: 4.3, z: 534 };\n}\n")),(0,i.kt)("p",null,"Pada contoh di atas, struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," memiliki 2 parameter generic. Kemudian struct tersebut digunakan untuk membuat dua variabel berbeda:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"num_one"),", bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"Point"),". Tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"x")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"y")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"i32")," sedangkan tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"z")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"f64"),"."),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"num_two"),", bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"Point"),". Tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"x")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"y")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"f64")," sedangkan tipe data property ",(0,i.kt)("inlineCode",{parentName:"li"},"z")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"i32"),".")),(0,i.kt)("h2",{id:"a376-generics-method"},"A.37.6. Generics method"),(0,i.kt)("p",null,"Generic bisa diterapkan pada method. Notasi penulisannya kurang lebih sama seperti pada penulisan method, hanya saja pada syntax ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," perlu diikuti block parameter generics. Perbandingannya kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// method biasa\nimpl Square {\n fn x(&self) -> &i32 {\n &self.x\n }\n}\n\n// method dengan generic\nimpl Square {\n fn x(&self) -> &T {\n &self.x\n }\n}\n")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di syntax bagian ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),", penulisan parameter generics di keduanya harus sama persis. Misal pada struct ada 3 buah parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," maka pada syntax ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," juga harus sama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Jika tidak sama akan muncul error.")),(0,i.kt)("p",null,"Ok, sekarang mari kita praktikkan. Struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," yang sudah dibuat, kita siapkan method-nya. Ada 3 buah method yang akan dibuat dan kesemuanya adalah method ",(0,i.kt)("em",{parentName:"p"},"getter")," untuk masing-masing property struct (yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"y"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"z"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct Point {\n x: T,\n y: T,\n z: U\n}\n\nimpl Point {\n\n fn get_x(&self) -> &T {\n &self.x\n }\n\n fn get_y(&self) -> &T {\n &self.y\n }\n\n fn get_z(&self) -> &U {\n &self.z\n }\n}\n")),(0,i.kt)("p",null,"Bisa dilihat pada kode di atas, ada method ",(0,i.kt)("inlineCode",{parentName:"p"},"get_x")," untuk mengambil nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),". Nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dimana tipe tersebut juga dipakai sebagai tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),"."),(0,i.kt)("p",null,"Kemudian coba gunakan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," untuk membuat satu atau dua variabel, lalu akses method-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let num_one: Point = Point { x: 502, y: 120, z: 4.5 };\n println!("{} {} {}", num_one.get_x(), num_one.get_y(), num_one.get_z());\n // 502 120 4.5\n\n let num_two: Point = Point { x: 1.2, y: 4.3, z: 534 };\n println!("{} {} {}", num_two.get_x(), num_two.get_y(), num_two.get_z());\n // 1.2 4.3 534\n}\n')),(0,i.kt)("p",null,"Hasilnya ketika di-run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(5243).Z,width:"319",height:"110"})),(0,i.kt)("h2",{id:"a377-method-khusus-untuk-spesifik-tipe-parameter-generic-tertentu"},"A.37.7. Method khusus untuk spesifik tipe parameter generic tertentu"),(0,i.kt)("p",null,"Pada contoh di atas, struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," bisa digunakan dalam banyak kombinasi tipe data, misalnya: ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),", dan lainya."),(0,i.kt)("p",null,"Di luar itu, bisa lho mendefinisikan method hanya untuk tipe parameter generic. Misalnya, method hanya bisa diakses ketika ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"U")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),". Caranya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Point {\n\n fn get_x(&self) -> &i32 {\n &self.x\n }\n\n fn get_y(&self) -> &i32 {\n &self.y\n }\n\n fn get_z(&self) -> &f64 {\n &self.z\n }\n}\n")),(0,i.kt)("p",null,"Block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," tidak diterapkan dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Point"),", melainkan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Point"),". Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diganti dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"U")," diganti ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),". Dengan penulisan yang seperti ini, maka method dalam block kode hanya bisa diakses ketika data memiliki tipe data sesuai dengan yang dideklarasikan di block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," (yang pada contoh di atas adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),")."),(0,i.kt)("p",null,"Bisa dilihat pada gambar berikut, sekarang statement pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"num_two")," menjadi error, karena method-method tersebut hanya tersedia untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Point")," sedangkan ",(0,i.kt)("inlineCode",{parentName:"p"},"num_two")," bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Point"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Generics",src:n(6714).Z,width:"851",height:"501"})),(0,i.kt)("p",null,"Jika ada keperluan untuk mendeklarasikan method lainnya khusus untuk tipe lainnya, cukup tulis lagi block ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," diikuti dengan tipe yang diinginkan. Misalnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl Point {\n // method untuk tipe data Point\n}\n\nimpl Point {\n // method untuk tipe data Point\n}\n\nimpl Point {\n // method untuk tipe data Point\n}\n\n// ...\n")),(0,i.kt)("h2",{id:"a378-generics-enum"},"A.37.8. Generics enum"),(0,i.kt)("p",null,"Generic juga bisa diterapkan pada tipe enum. Caranya tulis saja deklarasi parameter generic setelah nama enum, lalu gunakan parameter generic-nya sesuai kebutuhan."),(0,i.kt)("p",null,"Contohnya pada kode berikut ini, enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Kendaraan")," memiliki parameter generic ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yang tipe tersebut dipakai pada value enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Gledekan(T)"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'enum Kendaraan {\n Skateboard,\n SepedaPancal,\n Gledekan(T),\n}\n\nlet kendaraan1 = Kendaraan::<&str>::Skateboard;\nlet kendaraan2 = Kendaraan::<&str>::SepedaPancal;\nlet kendaraan3 = Kendaraan::<&str>::Gledekan("Artco");\n')),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/generics"},"github.com/novalagung/dasarpemrogramanrust-example/../generics")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch10-01-syntax.html"},"https://doc.rust-lang.org/book/ch10-01-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.Add.html"},"https://doc.rust-lang.org/std/ops/trait.Add.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html"},"https://doc.rust-lang.org/std/cmp/trait.PartialOrd.html"))))}u.isMDXComponent=!0},7757:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArIAAACpCAIAAABYlUmmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMTE6MTI6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE2OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE2OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjczMzE5YzgxLTE2YmYtOWE0My05OGM5LTc0ZWEwNzA3Y2EwMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MzMxOWM4MS0xNmJmLTlhNDMtOThjOS03NGVhMDcwN2NhMDAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3MzMxOWM4MS0xNmJmLTlhNDMtOThjOS03NGVhMDcwN2NhMDAiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjczMzE5YzgxLTE2YmYtOWE0My05OGM5LTc0ZWEwNzA3Y2EwMCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMVQxMToxMjozNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvRIHT8AAB0RSURBVHja7Z3djxzFuYd9zRUSF7lAsnIRkwP4S5ZtLKLEGOETHZ/gQCQIR7KMP9gNEYrgJrAbycH27nqPgQuQnGMsL7YMsY6DPJaxhQVKpA0bEbFhMEhnBVJiLuA/AP6APVVd3dVvfXRP93zt7Mzz00/WbE9PdVXPuN+n3qrqXrMWIYQQQijRGk4BQgghhMAChBBCCIEFCCGEEAILEEIIIQQWIIQQQggsQAghhBBYgBBCCCGwACGEEEJgAUIIIYTAAoQQQgiBBQghhBACCxBCCCEEFqwi7UYIIYQGSWDBCmPBunV3YYwxxoNgsAAswBhjjMECsABjjDEGC8ACjDHGGCwACzDGGGOwACzAGGOMwQKwAGOMMQYLwAKMMcYYLBg2LJi5tmS0eGGM3yvGGGOwYISxYOb60uL5p9SLw+cXl67PtP5GD764e/G1TfyyMcYYgwVDhwVPXfj70rUTd6VY8PcLh8ECjDHGYMHIZgtSGjihRxIMH2T+9Y8Xr+41/suL93hbUr+1/aDeedPbV3ef3nPP6bfM9h8f5XePMcYYLFjFcwuuzbjbTaSvmC1QO2sgePvX6rWGgxQjMMYYY7BgNWGBZoLF69cWzXzDsQuLGR/oSB+N7kVYYHdmlAFjjDFYsBqxwE4zzIcS8ukFe7b/5WpkUKAAC+KpBYwxxhgsWC1YYJchmNd6kWL2p8sBggzAAowxxmDB0GYL7KyCZNZhBAuSmYYiYeD9CRZgjDEGC4bovgWZrs3kZOAsOvBD/tHXoisR+K1jjDEGC1b7SgSMMcYYLAALMMYYY7AALMAYY4zBArAAY4wxBgvAAn6IGGOMwQIEFmCMMQYLEFiAMcYYLEBgAcYYY7AAgQUYY4zBAtQaC7Zt244xxhgPgsECsgUYY4wx2QKwAGOMMQYLwAKMMcYYLAALMMYYY7AALMAYY4zBArAAY4wxBgvAAowxxhgsAAswxhhjsGDksODQ3AfNZrNxbEV/QAfn5puXj7f12eOXm/NzB/hPiDHGYAEaaCzQJV8+NhBY0EH5GGOMwQIGEcACjDHGYMEwYoEKnI05FRebzQ/mjie5gSyOHms0jT44c9D/SNN9q7iQdeuO5XunWQexJStm7pAtX7ybFmLCtt0uYCKviSzhrgNnPmj6hcRt2+i2SB9LgIL9U9VEHShWE1Ft53SF5wpjjMECsGCgsSCJeUmAVHFOhTcnxKrtbjzzdygv5FjDxk431sazBXqfIHweTIHjUPo63UGXkNVEVyArzXvdVrZAN8QOneQFyprIfUStnGbGzhXGGIMFYMFAY0ESOLPwXwULYvmD0kIiRcWwQPfyI1HcCdt6nyQYqxeiGnYfN8a3PYggqieqXVC42lkcxdawgHIwxhgsAAuGBwuyeYgyi15SyPHLQYq+EAucPnorLAjz/93EgnyjaoutZ1C4eet4MCpiWxGeK4wxBgvAgqHCAmcIP4uL0UKSoGjjaKVsQR0siFWsW1iQHUhPmzjWovAKR8nPFcYYgwVgwVBigdNdLsQCJ20givKm9eV96+KOu4sOusD4UEW6wyFv8mPpxMMIjuhWfDAvDyFrIgcIKgwWyBkPGGMMFoAFqw0L/PUC+aKDcAVBMVvkqf75ublG0Sx9EXrzrLu3EiGWUXAq48xtTLe4o/7Fjq8j0JV3Pm6mHEZXFjinK61t9FxhjDFYABZw34LV6CBTwh0OMMYYLAALRtORtD9YgDHGYAFYMIpAEE37gwUYYwwWgAUYY4wxWAAWYIwxxmABWIAxxhiDBWABxhhjDBaABRhjjDFYABZgjDHGYAFYsDpddjNmubzQv5lxd9YWJo82aAblOw9c7tohenWz5NanwtybMrJP7578VPlO1SvrZ5555vnnXyjf59927Nk89ubmpy9tOjT3w407wrc2PDbd8kDr//PZjfteXXf3phrVu3uT+og6rnKVQ9Rz5cLVu2Y31QS7UZ0HdTb09rE31UlY8e8x/CL6VsO7d/6X/Gar/yQG51yVWP3v2LdvH1gAFrQdBtoJLa2xwMbpIHJ365YD8Uc6FTyjof5p6fVtkqudisjzKfIPVvsWKj6qysWRfpGBungdOXJk27bttT4yNTW9a9eDVYKluphufPJ/+okF7ZBEzwpXbZRYYEOvOieDiQV9q+HAYkH0K6tbw0ceeVT9H1H/ggVgwaBhQbuxsBMs6IprxtEeYkHE7qMuqpyBfjSnT1igaEBd72RPyPQv7eVSXe6Vy7GgpzG+6LLe05ixSrGgyP3HgsFxt34/Ff9ngQUDjgXiCUDuU4iy4JHsYB8i3DhmE90iQscK8bPipkD/IUyyk12QQi95RlGtWCieohRJjDs1zx/yFHTfe4cFuuQgjgYnMKhDzliqmaq2sWZGH+ZUn8myb989J+KhUOm3I8+qU5kUSrLTWzs1Yi46v/zlEydOzJ48edKk9NU1SG20MVum+k04P5nIXK1UV8Z81krmAFQhdrsqp2T4oDxyh1gQza57KQc77iALNx+UzFGU5A8v6/agMjduAoCyeatFydHCky32g+otrzfZORaowtOaizNm62yrrctUdXv092rLvXtf0GfStPTuTRueeEntY4YG5IBO4RcRrWE0IZQ1Py2qwriDrLn3zYY1kW2X307+bdpPFTfTDmZ5qazwHMot3v61frTG3n9GsGBVYoHo+elLtg26ydVfX8qdWCVH7kXGu2UhlbIF4jEE8qCyb9pJtqAZqa18vnP+fGR59LAJvcACQSHhIyuzo4tximIssM2UX4T/us3ESXwGgP8w7tJsQUp4pjJVsw4uFthAbjOWJVigXsjoXt6nURsVMYQp0MiVriAMt8wW+PEyKSfM0FosUG+Vdy7zQXHrLEpJtlCv7eXbXOvNQcvhprDwHmOBjotBrDXBzzTB7mBzNiaUmlBt4mWOCEl92qth/kH5jWdB0fwZFh42R9bcO+FeTdRu9+59PvrB9LX8zchmihqa02LJSb0220uSWCXZgoo/2lpTcMCCQcYCdU0XMc+9jicxeM656Ds72ABTVIgMuq2xQB1O7JwFG3fP7gwiZLHW752nNfeq7cfRPmYLHMaSzS/BgkhGIf6ttcMElxsZprjfcvxLKcICmZSqOcogI7eN1uVYEE1phlhgCokyhEKQY8eOObjQJSyQ1/0QC1RHsGrCOaiPDAxe/16iRqXBjj5nC6LnNthoDmHLtOFWYoGtYctgHK2hSUXYk5MX4sbFFuMCbdUkrI+EjxzmCr4Ij/bsQU0KIZofqo4FRT/aWuMIYMEAY0GY7HUu08EVPwgw+t2iQkom0EWwwBkpyDPMvcCCrEw/wOdYIKu9wlggD72CWGAPnQ8lOBWIrVAowIJOJnlErzglWGDeMoMCsrsflhPOHiibSNUlLCjqrNu8btXh3hgWODHYxYJ6o8j9xQIfaGJHbAMLvEhWpYYyD+/k/4PKtDx7tbDAGSwQuR+ZLZB5iygWyG9EHtSOUFSnk4o/Wvn/RWG0MzkXLFhtWFA09S8fj3f62WGAKSykOL1cgAUFi+J6kC1IWuGF4exPL1vg5zxWLluQ/9l3LJCfSgEuLMQfcBkALJCXqhMnZu0+RdmCKBZEsgVun7uTbEERFujL/Y8eLerb1c0WyD8HHAviQderQ/ZnT7MFhamUXmKBHO6R9ZETDvISqmULooHc+wHXyhaUYwHZgtU+iBCu5QtClDe8HRl0LyykeMlZZHyhYCJCvqeZfNcxFohY6yzDyw8kqx1OA6yFBYX3AKg25dA5J/G5F2YuYSkWeLNAmm1mC9yvPlaI/KnE00U9xAKT/zeTD0Is8JIB0ZVUqgR/CWIxMZiupL1cVlyJEA4k23Hf6NyC6Ch7xcS7vO57cxi7ggVmiwlX3Z1bIENjdKPt/VfBguhJrlTDokH0Wlgg8v/mN9MSC5w5ibHJHC35TA4WxLMv1dCh1o+WuQVDuhJBzrnLL+hmh2xE2Z9b3mKxgJxM58SDvKjoSoSmP8+xmeauO5hyGFvLIEZACqptmxkMc1RcpFcZZVqtRPCHNtKNx1tlC0QhqibuHI62zuH83DFLBs5PIrZqI7YSoevLn+z6AvXus88+a65KchmCt7LAXLzClQh2Y7gSITxudLK3N6/bRi9v7p69qsq3oisRTIEtAnmrlQjeVPxOsUC0Xb11794XTPOLmil7um1M3Y+sRMhKKMeC8rNdqYbRcmpigT2oCc8bnnhJlVBUE7l9/aO/j2YLioYzZNpG/jijSzl88ArWXNT90bISYVTvWzDAK9EH1JH7AuHV55KZB3gQXTNyr7LmtJraMvh3BAELwILRdOEYPF6NjtzlEIMF/brPkhwIKFlQsLIekLscPjz50vi2CvttGzt5xmri4bZD7MMTZyZ/7m76+eQZIf/dlh8HCzBeJa4yaIrBgh7dHlHm8wezaQPyTISHJ6tFeoUFJ8cMP2wbf6n92BzHgvzouj7ZgYYRCzDGGOPO3BcsSFQSjwUWOK+7jQWmSpMPgwUYD6/D+8ViPMr+4eb7BxQLStL4brbg5Ph9fpC2r5MXhUmIClgg9rlvPBu6SEHBKTwd/sjr47y2YxMT42IHsABjjDHZgjpYYBIHXhwVcwvyt4qwIIviqnC/nBpYoJjAznvI9hGF69cJqcSwQPOE5AOwAGOMMVjQg2xBFozLswWFEFANC5Io7k5FNLkB5+MpN8SwwClzG9kCjDHGYEGP5hbkY/89wQLd0U/KD3BhbWUscGc/gAUYY4zBgl6tREgGFJL97QtTThewIJlMICYWRMYg7M42b5EnMOxHLFt0aRBh27btGGOM8SB4UO5bIPrfFgJssmFyspNsQdGcBvGWJYDJiUn/9gl2ZuJLk5NZYiCfDNGNKYfr12/AGGOMB8FDdZfDlVhhWLbiESzAGGMMFowQFoiRDrAAY4wxWDCKWCCmUlYbJQELMMYYgwUILMAYYwwWILAAY4wxWIDAAowxxmAB6j4WbJxY3vK43PLK5tlvN+/asOHpb++baLT/rT/+5X2nllNXLkcddOvTr1TZ2GaVZhc35M1cdordtbg1f7el9cdtA9MTaJts2uscrq7Hzs03m1emxZbpxvy5p7r533K60Vw4Nx5566mzCwtnxwo/OHOlqTR/7uTZBbeG/fNT2aFLqhp9q0XTMMZDhQWPXH987vPEH2/b0Y9Ye/CtN27devu92Tqfmbl9+aM7prK/ps7f9s35O2se9Y5vvliz/MVtHx7sUrZARS8ZtutFxw1VilXkUTGu9xILUtzJmznx5ZZTX26MNNzds0pp2o0tp8wWTQwGFALkqoUFCwvzzcZM77CgLOgWx05dsShMrBQfgAUYgwVRTe2c+3znI33tgtfGAh3RvXD+vX99seZfM9WPeeeHH62pTRItBhEaMjp2s2tuacMjjxXBAs0BDVmmCthO2O4QCwRO5RWu3PB49J05t5CjAFgAFmAMFlTXjgt75q6vH+hEfkFE16xw+6WqhSiMqJcnqDK3QETHPNqJYJwnzJPdREQUefKNE26YjGGBPtDTi1tPpckD9WeadXcCaiM7XAorEgvsR9ItSTDe+PS3WSEKceLDFi5bqCYkhctKpnFdjA4EGFE5W2DfcpCrNhaMb5i+0szCmMACk8bXikbo6Ub67pVzaRSUsdy+VrtdmTYfGT+3kH1kWsROnat3DpEMbZgDnx3LdssHI2xu3yswKyrbEA5J5G1xhjZU83W+JGivrKGoqn/EhbPTWYXlxjFbuG0L12iMhw4L9AiChwVTO9UWjQvJyMIrF9aVfHz25VvvT1785O1bt964ODv52a23b30ymQXfQ++pP43fP7TW3/jGxcNO/uCztx6cfT/d30kkuMMHUpferZ4A6AkW5NEx0uWNBDmLEQoFtqbvBvEvj7hOUl1gRB537TwG/eJUziV2o8UIH192eZBh6mAjdMEUirxuotql2YIYFti5BdnOSWXyqQZVEw/lnXIbJjMs0DFShvPstYjcOUmkMa8cC/xJBmnsVAeK5CfyovIQq/ZUJY1nuY1xkeQwb0kEKZmy4E8XCD4V7BP2/qNME85FSIFj8PIfGIMFnWLBuvGPsykFmX83ZYcVMlZoNcSgsCCJ4klEf3lWR/003s++//KsQAF3yCDfTQ4rKDJIX+dsURr7i4mhT1iQRUfZpc5eZ/1vGQLTsNrYkvTUdRR0U/TelEPZ1xdxXWJEpALBRmeWXxp9o6n7WDCWWBB/HccC/6CCdYLsiCCekprUxAIRWZNYqwKbmHAgw1tkrOGpKtmCLNY6kXV+oRkfs4hhQdrzFhWW0uUkaYbCAuWegipmrmTl+/vEsMDmSJqx2YhpY8UJceronkOM8dBmC/K5h+t/9/me8SfLsCAJ4QoLkqDux/t0r/TdUiywGYXDk5/dskihRxAK5xBUH0eoN+JQY4FiEh2dUC2wIEyDJxt3LW5ROyRAEHSm48PqHWNBEGLbwQIPdJaDTEnFbIGzTwfTFFoO4esY1piphgWyp14NC6Id7ub8wkK8fx/HAme4IeCM9XKownnLNM2ruTmEPVBknwALRMIjknWIYgEZAozBgvawIEkkWLeLBeVTC6vkAHQJlZMK9e9boDu733qT8mwfPZzxt3Hi2y0TX9qh9K2zATq0wILiQQQR5sNBBL/MylhQPA0wG3HoDAuiNe98boEI9gsLlQcRMlCwgwhijoL+iJstyLcEgwgRMqg2iNAsCrreuIA7L0EMPSxcUZ4u2sfHAnEepq/k2QJbYHQQYaVWV2KMVzMW6NCeDxwMcbbA9KFl5BNRVnSv7dpFkTOP3+GgFRY4+XkZ2ie+3BqZh/hKkNJPwm1lLHCmPT7u12qrSXvIFrW43UI8IRE5S52sRBh3sgJOkCuZciim+52zkdtunL/SCKcc5ml/N3+QbHcT7AEWCAjIY60YR8h68/F0vW2L5gC57ELsGe4TDiLY+YONKyJboPaXwxNOCkGOI7Sa94AxBgsEFjhpg3axYMDnFoyC287nt+8O7lvQh6WGGGMMFtQfRLDLCtQOF222wB1ZsOsRSrBAx/6Cjv7Kr0QYEXd028GBPxxYgDEGC1aVBve+BXhYDRZgjMGCAVaX7nJYZ3+wAGOMMVgwsBrAZyJgjDHGYMFICSzAGGMMFqAcCxBCCKHBUa+w4IEHHiDqIzSA+v49WwfcfEcIDbjAAtRvPbQSGuLWgQUIIbAAgQVgAViAEAILEFgAFoAFCKFRxYIHL37iPVh5gJXdtzEm/YTo4nf7pB/84c29fxrrtJR9Rx5avLpX+9V76nzuwL9//M/HpsCC3mPBnsuvTfxtbOf3dz72t9cmLv+ivfitC7mp/ZuzO/Pt+8d+c9Ns/+2eCoXsPDtt9syqlGHBicc+v7GDyy9CYMHwYEGsYiOCBTkc1MGCHdf/+dz1Ez0InK9/+t3y8vJX79XEgv0T/3vz0ruJTx0Nanv0pH6r0c7X1bWGnU4alqi8dZWw4BeHbr526EUbsL0/y+DAwYIcDjrDgrX3Xrj53Md/vJcrMEJgwYhiwYpp/xuLS9eO9wMLpt6xBwo0deO5vHfYXST47tNPv6qNBbuO/vXs0f2WALLXqQ6eunn2VOPsimKBatp3n55OXr6n2pe9roQFOhgnNCCC+spgwdYXf2towFZpq0OKhy8c4BqMEFhQQUnfOrONvvqpSMHG8sid7Z8/PylWiDrcyxeT7Z+9dSj5lH1IoygkeyBT/iSnzPnDnD6ZnM3Ktw9+zI9oH+mUHXQ2eYr0LTeRIGvofer4taWlpXf82Hvg/OLS0uIb+8NT4O1vsOCeP5khgKv3H7E7jt2fjgtc3fvnIz9wYn+23eOJSLZg//kPl5Y+PB/Www4fOIFTR7ugN6w2fvfp67aj/PWN7I0b+d5aOkyqyJl88EYUC258rQu+0XoQQUGAkzD4VUPnCXaf6QQLRG1tE3SjVH2yt1QznarKtr3uNcVrYJIgyUEhwIKYy7DAjhekHfp2sCDJTFQZXxCVffKPh8OhhOPvqN9sIV8ihEYRC3QkzmKq6JTrJyhm0V2/dh6vHLnYyycryg59pJCEQtTOyUMa1eGyhzomBJAWImtVnC2wUVweKF4fgz5mH/06LU08V1of3U0/1MGCSJDWWLB49aE/JIHkyKvZ5ICHtvw525i8zghAs0KGDvp1tk8RFhTV0L/6p6HOxkvNB1n8Tlkh+fN0kgs4nQVOs39CDC4EdBULdPLg5K/Wru0EC258bY8r6payjmmR2J43Pwn3OQn1Bwt0Pz6jAc0H7lyEilggP5iPF7SccujxIliAEFgQk5OKt9HXi8p55C7DAjcwFxeSPdM58qxnUUK8YkU1z58TXYwF+Q62OXo3W0jAFpUVv7a6gwhZ1M/5wIn3emeZOVC7+YmE+NwCPWyxtHj+gBxBcEaRY2EvmjDX4S/IB5iBg9dbYkHFKYc6N/DXid354EKKCJ1lCxw6SWvrAo3dnhNPrG3pDsHG2isRNAdMuE6wQPXypx/bXxbvW2OB/lMUoo8l/yxZicA4AkJgQSdYIMNwSyyQ2f5I7qEKFtgMv3XvsUAmQkSuoqamNBW0wgKdGEixIBbv/YkI9bBAHD2YXBbLnAssiIRA0Y0WKYTOsUDH/iQ3kP+ZoUBHWPDeV5FBgXQQIdq2PFvgtV682zkWxLIFIS60hwXyU9WxQP820omoCCGwoJNsgd/vL5VO0Sc7FxVSggVFnfWeYYHDIi93MNuyYBDByRa8uWVfkC3I/vSyBX7yoMYgQiRb4EY7N1sQ6xlLhmg59F4RCxImkJMNdarg3ZuevdmIFbCgICtQhAUOQ7ht8wYLeoUFxSG8vWyBnzwgW4AQWNCRvMH1bNDdGRSol13PaaCgkKJBhGS+YUF/PdKV7wYWlGdBujLlMAjzct6AmGeQzDeUcwvEFMU4FujDRaYcRuYWyH5xEvJLsaAooHYwtyBgghg0uNmC5GQuvTNVBQvkmEg5FtiBkmgWIc4EXZ1bUD4VoNrcAucGCeEEhfpzC2ITVxFCo4oFYiq+CpAqTMZWIrSYb+guQ3Did6yQIizwy3EDdr5cQq5ECLDArUlemSrZAj9hUBcL1oYLFKMrDuRKBDlwIFYi2PmGTiHypkbFCxT11V90Cr25+skKwxrZgjzQurl6b31/KRboaYZOViCfXlCIBWZopug8S+jJa6vaVitbkLftht82cVp6txLhpnOfAzm4YOAguQ9BdMRBrEQomW9YYSVCkuVy5qYghEYeC0ZZXrag/ekFg6XO7lvgBdTI9IK+3OUwwa/W2YL6t14QNBOddDikNz8uGEEoyDkhhMCCUZQ3+8HOilj96uQuh3IFY7VZeN3GAtOFbc0E9VvnjoBEll8OKRZE73JopsrCBAiBBZ30rb07C3U8U2+l5Q4iDAkTmM52B89EcAcRajPBQD8TwR1EqMsEXtM2b9huou/kjp9887Of/WP3Twdti6knz0RACCxAqN3AyaOSKjdNhV4ViVUM/r+f/sdPNt333z96YNC28PtHCCxACPVJJhIrqxhsuumDtoXvCKEhxAKEEEIIgQUIIYQQAgsQQgghBBYghBBCCCxooanzty1/sWb5ozumOIUIIYTQiGOB0aV313xz/k5OIkIIIQQWrF07c/vyu9/jJCKEEEJgAViAEEIIgQVgAUIIIQQW+Dp4xzdf3H6Js4gQQgiBBRkZrCFngBBCCI08FszczhpFhBBCCCzIsIA8AUIIIQQWgAUIIYQQWAAWIIQQQmBBIO5yiBBCCIEF2TMRWJ2IEEIIgQUIIYQQAgsQQgghBBYghBBCCCxACCGEEFiAEEIIIbAAIYQQQmABQgghhMAChBBCCCGwACGEEEJgAUIIIYTAAoQQQgiBBQghhBACCxBCCCEEFiCEEEIILEAIIYQQWIAQQgghsAAhhBBCYAFCCCGEwAKEEEIIgQUIIYQQAgsQQggh1Ev9P6C6Ufmqlk+SAAAAAElFTkSuQmCC"},4541:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATsAAAD4CAIAAAActdY+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMjM6NDU6MzgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE1OjE3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE1OjE3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmExY2ZmNzZjLTIzOTEt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"},7811:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc0AAABxCAIAAAA4WG/wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMjM6NTc6NTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE0OjExKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE0OjExKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM5NGVjOGRmLTgxOWIt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"},5243:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAT8AAABuCAIAAADeYYMaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTJUMDI6MzA6MjQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjEzOjE2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjEzOjE2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ1MTZkNGU0LWY1Zjkt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"},6714:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/generics-5-9f575c9b47e95f4301f0e9db22059d17.png"}}]); \ No newline at end of file diff --git a/assets/js/5f289fb7.c8228f07.js b/assets/js/5f289fb7.c8228f07.js new file mode 100644 index 00000000..3a097b10 --- /dev/null +++ b/assets/js/5f289fb7.c8228f07.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[2870],{3905:(a,e,t)=>{t.d(e,{Zo:()=>d,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var p=n.createContext({}),m=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},d=function(a){var e=m(a.components);return n.createElement(p.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,d=u(a,["components","mdxType","originalType","parentName"]),s=m(t),o=i,b=s["".concat(p,".").concat(o)]||s[o]||k[o]||r;return t?n.createElement(b,l(l({ref:e},d),{},{components:t})):n.createElement(b,l({ref:e},d))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=s;var u={};for(var p in e)hasOwnProperty.call(e,p)&&(u[p]=e[p]);u.originalType=a,u.mdxType="string"==typeof a?a:i,l[1]=u;for(var m=2;m{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>u,toc:()=>m});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:49,title:"A.49. Attributes",sidebar_label:"A.49. Attributes"},l=void 0,u={unversionedId:"basic/attributes",id:"basic/attributes",title:"A.49. Attributes",description:"Kita telah beberapa kali menggunakan attributes pada chapter-chapter sebelumnya, contohnya seperti #[derive(Debug)]. Pada chapter ini kita akan bahas tentang apa sebenarnya attributes, macam-macam jenisnya, beserta kegunaannya.",source:"@site/docs/basic/attributes.md",sourceDirName:"basic",slug:"/basic/attributes",permalink:"/basic/attributes",draft:!1,tags:[],version:"current",sidebarPosition:49,frontMatter:{sidebar_position:49,title:"A.49. Attributes",sidebar_label:"A.49. Attributes"},sidebar:"tutorialSidebar",previous:{title:"A.48. Trait \u279c Iterator",permalink:"/basic/trait-iterator"},next:{title:"A.50. Date Time",permalink:"/basic/datetime"}},p={},m=[{value:"A.49.1. Konsep attributes",id:"a491-konsep-attributes",level:2},{value:"A.49.2. Attribute derive",id:"a492-attribute-derive",level:2},{value:"A.49.3. Attribute cfg / configuration",id:"a493-attribute-cfg--configuration",level:2},{value:"\u25c9 Configuration target_os",id:"-configuration-target_os",level:3},{value:"\u25c9 Configuration target_arch",id:"-configuration-target_arch",level:3},{value:"\u25c9 Other configuration",id:"-other-configuration",level:3},{value:"A.49.4. Attribute linting & diagnostic",id:"a494-attribute-linting--diagnostic",level:2},{value:"A.49.5. Attribute type system",id:"a495-attribute-type-system",level:2},{value:"A.49.6. Attribute modules",id:"a496-attribute-modules",level:2},{value:"A.49.7. Attribute testing",id:"a497-attribute-testing",level:2},{value:"A.49.8. Attribute macros",id:"a498-attribute-macros",level:2},{value:"A.49.9 Attribute lainnya",id:"a499-attribute-lainnya",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function k(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Kita telah beberapa kali menggunakan attributes pada chapter-chapter sebelumnya, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]"),". Pada chapter ini kita akan bahas tentang apa sebenarnya attributes, macam-macam jenisnya, beserta kegunaannya."),(0,i.kt)("h2",{id:"a491-konsep-attributes"},"A.49.1. Konsep attributes"),(0,i.kt)("p",null,"Attributes adalah metadata yang didefinisikan untuk suatu crate, module, atau module item. Kegunaan dari attributes berbeda satu sama lain, tergantung attribute apa yang dipakai (kita akan bahas satu per satu)."),(0,i.kt)("p",null,"Attribute dikategorikan menjadi 2:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Outer attributes"),(0,i.kt)("li",{parentName:"ul"},"Inner attributes")),(0,i.kt)("p",null,"Keduanya memiliki kegunaan yang sama, pembedanya adalah posisi di mana attribute harus dituliskan."),(0,i.kt)("p",null,"Outer attribute dituliskan tepat sebelum target (crate, module, module item, atau lainnya) dengan notasi penulisan seperti berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#[attribute = "value"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#[attribute(key = "value")]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[attribute(value)]"))),(0,i.kt)("p",null,"Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(Debug)]\nstruct LegoSet {\n code: i32,\n name: String,\n category: String,\n age_minimum: i32,\n}\n")),(0,i.kt)("p",null,"Sedikit berbeda dengan inner attribute, penulisannya berada di dalam target (crate, module, module item, atau lainnya). Notasi penulisannya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#![attribute = "value"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#![attribute(key = "value")]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#![attribute(value)]"))),(0,i.kt)("p",null,"Rust mengenal beberapa jenis attributes, dan kita akan membahasnya satu per satu."),(0,i.kt)("h2",{id:"a492-attribute-derive"},"A.49.2. Attribute ",(0,i.kt)("inlineCode",{parentName:"h2"},"derive")),(0,i.kt)("p",null,"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," digunakan untuk mempermudah implementasi suatu trait ke tipe data."),(0,i.kt)("p",null,"Kita telah mempelajari cara implementasi trait pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits")," yaitu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"for"),", kemudian diikuti dengan method serta implementasinya."),(0,i.kt)("p",null,"Dengan memanfaatkan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," kita tidak perlu menggunakan cara tersebut. Cukup tulis saja attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," beserta trait yang ingin diimplementasikan."),(0,i.kt)("p",null,"Agar lebih jelas, silakan pelajari contoh berikut terlebih dahulu:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'const SuperheroSuperman: &str = "superman";\nconst SuperheroOmniMan: &str = "omniman";\nconst SuperheroHyperion: &str = "hyperion";\n\nenum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nfn main() {\n let value: Superhero = Superhero::Superman;\n\n if value == Superhero::Superman {\n println!("hello superman!");\n }\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(253).Z,width:"958",height:"719"})),(0,i.kt)("p",null,"Kode di atas menghasilkan error karena enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," tidak mengadopsi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq")," yang mana trait ini diperlukan dalam seleksi kondisi menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," dan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"=="),"."),(0,i.kt)("p",null,"Cara mengatasi error tersebut adalah dengan mengimplementasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq")," secara eksplisit. Sekarang coba tambahkan kode berikut pada deklarasi enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),", maka error akan hilang."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nimpl PartialEq for Superhero {\n\n fn eq(&self, other: &Self) -> bool {\n match (self, other) {\n (Superhero::Superman, Superhero::Superman) => true,\n (Superhero::OmniMan, Superhero::OmniMan) => true,\n (Superhero::Hyperion, Superhero::Hyperion) => true,\n _ => false,\n }\n }\n}\n")),(0,i.kt)("p",null,"Cara lain untuk mengatasi error di atas, selain menggunakan teknik implementasi trait secara eksplisit, adalah dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," disertai trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq"),". Kurang lebih penulisan cara ini bisa dilihat di bawah ini. Cukup hapus block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," lalu tambahkan attribute pada deklarasi enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(PartialEq)]\nenum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n")),(0,i.kt)("p",null,"Cukup mudah bukan?"),(0,i.kt)("p",null,"Contoh lainnya, misalnya variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"value")," ingin di-print seperti pada kode berikut ini, pasti hasilnya error."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let value: Superhero = Superhero::Superman;\n\n if value == Superhero::Superman {\n println!("hello superman!");\n }\n\n println!("{value} (via `Display` trait)");\n println!("{value:#?} (via `Debug` trait)");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(7095).Z,width:"900",height:"461"})),(0,i.kt)("p",null,"Cara ",(0,i.kt)("em",{parentName:"p"},"resolve")," error di atas adalah dengan mengimplementasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Display")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," secara eksplisit. Atau, bisa juga menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," yang pastinya lebih praktis."),(0,i.kt)("p",null,"Kabar buruknya, hanya trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," yang menyediakan fitur implementasi trait menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive"),". Untuk trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Display")," kita perlu melakukan implementasi secara eksplisit."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Untuk tau mana trait yang bisa di-",(0,i.kt)("em",{parentName:"p"},"derive")," atau tidak, cukup lihat saja ",(0,i.kt)("em",{parentName:"p"},"highlight")," error yang muncul saat penulisan kode atau kompilasi.")),(0,i.kt)("p",null,"Ok, kita implementasikan saja keduanya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(PartialEq, Debug)]\nenum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nimpl std::fmt::Display for Superhero {\n\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "{self:?}")\n }\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(635).Z,width:"537",height:"127"})),(0,i.kt)("p",null,"Bisa dilihat, hasilnya program tereksekusi tanpa error. Enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," kini mengadopsi 3 trait:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"PartialEq")," via attribute ",(0,i.kt)("inlineCode",{parentName:"li"},"derive")),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Debug")," via attribute ",(0,i.kt)("inlineCode",{parentName:"li"},"derive")),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Display")," via implementasi eksplisit")),(0,i.kt)("h2",{id:"a493-attribute-cfg--configuration"},"A.49.3. Attribute ",(0,i.kt)("inlineCode",{parentName:"h2"},"cfg")," / ",(0,i.kt)("em",{parentName:"h2"},"configuration")),(0,i.kt)("p",null,"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg")," digunakan untuk menentukan beberapa konfigurasi yang berhubungan dengan arsitekture hardware/prosesor."),(0,i.kt)("p",null,"Salah satu contoh penerapannya bisa dilihat pada kode berikut. Ada 2 buah module yang namanya sama persis, perbedaannya adalah satu didefinisikan khusus untuk platform ",(0,i.kt)("inlineCode",{parentName:"p"},"linux"),", dan satunya lagi untuk platform ",(0,i.kt)("inlineCode",{parentName:"p"},"windows"),". Hal seperti ini bisa dilakukan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg")," dengan key ",(0,i.kt)("inlineCode",{parentName:"p"},"target_os"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[cfg(target_os = "linux")]\nmod util {\n\n pub fn say_hello() {\n println!("hello (from linux)")\n }\n}\n\n#[cfg(target_os = "windows")]\nmod util {\n\n pub fn say_hello() {\n println!("hello (from windows)")\n }\n\n pub fn say_something() {\n println!("how are you")\n }\n}\n')),(0,i.kt)("p",null,"Bisa dilihat cara penulisannya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg()")," kemudian diisi key ",(0,i.kt)("inlineCode",{parentName:"p"},"target_os")," dengan value adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"windows")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"linux"),"."),(0,i.kt)("p",null,"Dengan kondisi kode seperti di atas, ketika berada di sistem operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"linux"),", item ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_hello")," bisa diakses. Sedangkan pada sistem operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"windows"),", item ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_hello")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_something")," bisa diakses."),(0,i.kt)("p",null,"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg(target_os)")," juga bisa diterapkan pada block kode. Contohnya seperti pada kode berikut. Item ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_hello")," dipanggil di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". Dan khusus untuk sistem operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"windows"),", block kode berisi pemanggilan ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_something")," juga dipanggil."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n util::say_hello();\n\n #[cfg(target_os = "windows")]\n {\n util::say_something();\n }\n}\n')),(0,i.kt)("p",null,"Ada beberapa key yang tersedia pada attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg"),", di antaranya:"),(0,i.kt)("h3",{id:"-configuration-target_os"},"\u25c9 Configuration ",(0,i.kt)("inlineCode",{parentName:"h3"},"target_os")),(0,i.kt)("p",null,"Digunakan untuk menandai bahwa item atau statement di bawah definisi attribute ini dikhususkan untuk sistem operasi tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[cfg(target_os = "value")]\n')),(0,i.kt)("p",null,"Opsi value yang tersedia:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"windows")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"macos")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ios")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"linux")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"android")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"freebsd")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"dragonfly")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"openbsd")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"netbsd"))),(0,i.kt)("h3",{id:"-configuration-target_arch"},"\u25c9 Configuration ",(0,i.kt)("inlineCode",{parentName:"h3"},"target_arch")),(0,i.kt)("p",null,"Digunakan untuk menandai bahwa item atau statement di bawah definisi attribute ini dikhususkan untuk arsitektur CPU tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[cfg(target_arch = "value")]\n')),(0,i.kt)("p",null,"Opsi value yang tersedia:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"x86")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"x86_64")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"mips")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"powerpc")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"powerpc64")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"arm")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"aarch64"))),(0,i.kt)("h3",{id:"-other-configuration"},"\u25c9 Other configuration"),(0,i.kt)("p",null,"Ada beberapa key konfigurasi lainnya yang tersedia. Lebih detailnya silakan lihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options"},"https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options"),"."),(0,i.kt)("h2",{id:"a494-attribute-linting--diagnostic"},"A.49.4. Attribute ",(0,i.kt)("em",{parentName:"h2"},"linting")," & ",(0,i.kt)("em",{parentName:"h2"},"diagnostic")),(0,i.kt)("p",null,"Ada beberapa attribute name yang bisa digunakan untuk meng-override ",(0,i.kt)("em",{parentName:"p"},"default linting")," milik Rust ataupun menandai indikator ",(0,i.kt)("em",{parentName:"p"},"diagnostic")," lainnya, seperti warning yang muncul karena ada kode yang tidak digunakan, dll; Warning sejenis ini bisa di-override menggunakan attribute."),(0,i.kt)("p",null,"Contoh kasus yang berhubungan dengan ",(0,i.kt)("em",{parentName:"p"},"linting")," bisa dilihat pada kode berikut."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(2329).Z,width:"351",height:"363"})),(0,i.kt)("p",null,"Kode di atas tidak menghasilkan error. Kode akan dieksekusi tanpa error. Namun ada 3 buah warning yang muncul karena beberapa baris kode tidak digunakan atau sia-sia."),(0,i.kt)("p",null,"Cara agar warning tidak muncul bisa dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"#[allow(value)]"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[allow(unused_imports)]\nuse std::fmt::Display;\n\nfn say_hello() {\n println!("hello")\n}\n\n#[allow(dead_code)]\nfn say_something() {\n println!("how are you")\n}\n\nfn main() {\n #[allow(unused_variables)]\n let name = "noval agung";\n\n say_hello();\n}\n')),(0,i.kt)("p",null,"Pada kode di atas, attribute name ",(0,i.kt)("inlineCode",{parentName:"p"},"allow")," digunakan pada 3 tempat:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[allow(unused_imports)]")," digunakan untuk antisipasi error yang muncul ketika module item di-import namun tidak digunakan."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[allow(dead_code)]")," digunakan untuk membolehkan kode yang tidak digunakan."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[allow(unused_variables)]")," digunakan untuk membolehkan variabel yang didefinisikan tapi tidak dimanfaatkan.")),(0,i.kt)("p",null,"Dengan penambahan 3 attribute di atas program akan tereksekusi tanpa warning."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(7964).Z,width:"463",height:"107"})),(0,i.kt)("p",null,"Ada beberapa attribute ",(0,i.kt)("em",{parentName:"p"},"key")," yang bisa digunakan untuk override ",(0,i.kt)("em",{parentName:"p"},"lint")," warning:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"#[allow(lint_rule)]")," untuk membolehkan suatu ",(0,i.kt)("em",{parentName:"p"},"lint rule"),".",(0,i.kt)("br",null),"List ",(0,i.kt)("inlineCode",{parentName:"p"},"lint_rule")," bisa dilihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html"},"https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"#[warn(lint_rule)]")," untuk memunculkan warning untuk suatu ",(0,i.kt)("em",{parentName:"p"},"lint rule")," yang ",(0,i.kt)("em",{parentName:"p"},"default"),"-nya tidak memunculkan warning.",(0,i.kt)("br",null),"List ",(0,i.kt)("inlineCode",{parentName:"p"},"lint_rule")," bisa dilihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/rustc/lints/listing/warn-by-default.html"},"https://doc.rust-lang.org/rustc/lints/listing/warn-by-default.html"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"#[deny(lint_rule)]")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"#[forbid(lint_rule)]")," untuk melarang suatu ",(0,i.kt)("em",{parentName:"p"},"lint rule")," yang ",(0,i.kt)("em",{parentName:"p"},"default"),"-nya adalah diperbolehkan.",(0,i.kt)("br",null),"List ",(0,i.kt)("inlineCode",{parentName:"p"},"lint_rule")," bisa dilihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/rustc/lints/listing/deny-by-default.html"},"https://doc.rust-lang.org/rustc/lints/listing/deny-by-default.html"),"."))),(0,i.kt)("p",null,"Selain 3 attribute di atas, ada juga beberapa attribute lainnya untuk keperluan ",(0,i.kt)("em",{parentName:"p"},"diagnostic"),", di antaranya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[deprecated]")," digunakan untuk menandai bahwa kode di bawahnya adalah ",(0,i.kt)("em",{parentName:"li"},"deprecated"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[must_use]")," digunakan untuk mendandai bahwa kode di bawahnya harus digunakan, jika tidak maka akan muncul error.")),(0,i.kt)("h2",{id:"a495-attribute-type-system"},"A.49.5. Attribute ",(0,i.kt)("em",{parentName:"h2"},"type system")),(0,i.kt)("p",null,"Ada sebuah attribute bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive")," gunanya untuk mem-",(0,i.kt)("em",{parentName:"p"},"bypass")," error yang muncul karena ada pattern matching yang tidak meng-cover semua kondisi, atau untuk mengantisipasi error yang muncul saat deklarasi variabel bertipe struct tapi value property-nya tidak diisi."),(0,i.kt)("p",null,"Salah satu contoh error yang dimaksud bisa dilihat pada kode berikut. Error ini muncul karena enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero::Superhero")," tidak ter-cover dalam pattern matching."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(7812).Z,width:"671",height:"669"})),(0,i.kt)("p",null,"Solusi untuk mengatasi error di atas bisa dengan cukup menambahkan case kondisi yang belum ter-cover:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match value {\n Superhero::Superman => println!("stronk"),\n Superhero::OmniMan => println!("stronk"),\n Superhero::Hyperion => println!("stronk"),\n}\n')),(0,i.kt)("p",null,"Atau dengan memanfaatkan kondisi ",(0,i.kt)("em",{parentName:"p"},"other")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"_"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match value {\n Superhero::Superman => println!("stronk"),\n Superhero::OmniMan => println!("stronk"),\n _ => println!("stronk"),\n}\n')),(0,i.kt)("p",null,"Atau, bisa dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[non_exhaustive]\npub enum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nfn main() {\n let value = Superhero::Superman;\n\n match value {\n Superhero::Superman => println!("stronk"),\n Superhero::OmniMan => println!("stronk"),\n }\n}\n')),(0,i.kt)("p",null,"Sayangnya dalam penggunaan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive")," ini, efeknya ",(0,i.kt)("strong",{parentName:"p"},"hanya bisa dirasakan jika digunakan pada enum atau struct yang berbeda crate"),"."),(0,i.kt)("p",null,"Pada contoh di atas, tempat di mana enum dideklarasikan dan digunakan adalah masih dalam satu crate yang sama, jadi kode tetap menghasilkan error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive")," ini jika digunakan pada struct efeknya saat deklarasi variabel boleh tidak menuliskan value property.")),(0,i.kt)("h2",{id:"a496-attribute-modules"},"A.49.6. Attribute ",(0,i.kt)("em",{parentName:"h2"},"modules")),(0,i.kt)("p",null,"Aturan manajemen di Rust cukup ketat, dan sudah dibahas secara mendetal pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/module-basic"},"Module System \u279c Module"),", yang intinya adalah ada dua cara pembuatan module:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Cara ke-1: dengan mendefinisikan module pada file bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"nama_module.rs")),(0,i.kt)("li",{parentName:"ul"},"Cara ke-2: dengan mendefinisikan module pada file bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"nama_module/mod.rs"))),(0,i.kt)("p",null,"Rust memiliki sebuah attribute bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," yang berguna untuk meng-override 2 aturan di atas secara paksa. Dengan memanfaatkan attribute ini kita bisa menulis module dengan nama sesuka hati."),(0,i.kt)("p",null,"Mari kita praktekan agar lebih jelas. Silakan buat package baru dengan struktur seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 util1.rs\n \u2502\u2500\u2500\u2500 util2\n \u2502 \u2514\u2500\u2500\u2500 mod.rs\n \u2514\u2500\u2500\u2500 util3_mymodule.rs\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="util1.rs"',title:'"util1.rs"'},'pub fn say_hello() {\n println!("hello (from util1)")\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="util2/mod.rs"',title:'"util2/mod.rs"'},'pub fn say_hello() {\n println!("hello (from util2)")\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="util3_mymodule.rs"',title:'"util3_mymodule.rs"'},'pub fn say_hello() {\n println!("hello (from util3_mymodule)")\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'},'mod util1;\nmod util2;\n\n#[path = "util3_mymodule.rs"]\nmod util3;\n\nfn main() {\n util1::say_hello();\n util2::say_hello();\n util3::say_hello();\n}\n')),(0,i.kt)("p",null,"Pada kode di atas bisa dilihat, module ",(0,i.kt)("inlineCode",{parentName:"p"},"util1")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"util2")," patuh mengikuti aturan deklarasi module system. Berbeda dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"util3")," yang sebenarnya dideklarasikan dengan nama ",(0,i.kt)("inlineCode",{parentName:"p"},"util3_mymodule")," (karena filename-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"util3_mymodule.rs"),"). Nama module satu ini diubah menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"util3")," lalu dengan memanfaatkan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," kita arahkan isi module ",(0,i.kt)("inlineCode",{parentName:"p"},"util3")," adalah berada di ",(0,i.kt)("inlineCode",{parentName:"p"},"util3_mymodule.rs"),"."),(0,i.kt)("p",null,"Jialankan program, harusnya tidak ada error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(2259).Z,width:"456",height:"147"})),(0,i.kt)("h2",{id:"a497-attribute-testing"},"A.49.7. Attribute ",(0,i.kt)("em",{parentName:"h2"},"testing")),(0,i.kt)("p",null,"Lebih detailnya mengenai attribute testing dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/testing"},"Testing"),"."),(0,i.kt)("h2",{id:"a498-attribute-macros"},"A.49.8. Attribute ",(0,i.kt)("em",{parentName:"h2"},"macros")),(0,i.kt)("p",null,"Lebih detailnya mengenai attribute macros dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"),"."),(0,i.kt)("h2",{id:"a499-attribute-lainnya"},"A.49.9 Attribute lainnya"),(0,i.kt)("p",null,"Rust memiliki cukup banyak attribute yang list-nya bisa dilihat pada link ini ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/reference/attributes.html"},"https://doc.rust-lang.org/reference/attributes.html"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/attributes"},"github.com/novalagung/dasarpemrogramanrust-example/../attributes")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/module-basic"},"Module System \u279c Module")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/enum"},"Enum")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/attributes.html"},"https://doc.rust-lang.org/reference/attributes.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items/implementations.html"},"https://doc.rust-lang.org/reference/items/implementations.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rustc/lints/index.html"},"https://doc.rust-lang.org/rustc/lints/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/attributes/diagnostics.html"},"https://doc.rust-lang.org/reference/attributes/diagnostics.html"))))}k.isMDXComponent=!0},253:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-1-c3fd3abaf784b196c8b4da4512bb8abd.png"},7095:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-2-935bd54d9113cbcfb6a5c07a7ebd9f68.png"},635:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhkAAAB/CAIAAADNSkeyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE72lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMzBUMjA6NDE6MTkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTMxVDE5OjU1OjQwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTMxVDE5OjU1OjQwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjNjIzZTI3OS1mMTJkLTkwNDktODVjYi0xNTZlYWJlNGE1NTkiIHhtcE1NOkRvY3VtZW50SUQ9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"},2329:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-4-0ae9faf44e5f0113b2599d985a7f331d.png"},7964:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAABrCAIAAACe4J4wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE72lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMzBUMjI6MDU6NTIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTMxVDE5OjU2OjQ4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTMxVDE5OjU2OjQ4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozYzYzZWI4Ny1kMzc1LWIxNDctYjVkYS1iMzY2MGQ3NTY0YWYiIHhtcE1NOkRvY3VtZW50SUQ9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"},7812:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-6-edad9c816a2c847561bcc988d0905b16.png"},2259:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcgAAACTCAIAAACF/R49AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFf2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMzFUMTk6Mjg6NTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTMxVDE5OjU4OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTMxVDE5OjU4OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjZjYxM2Q1My1iY2RkLTM4NDUtYjkwYS1lMWM4NTc3M2E3ZWIiIHhtcE1NOkRvY3VtZW50SUQ9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"}}]); \ No newline at end of file diff --git a/assets/js/5f289fb7.e0fc9497.js b/assets/js/5f289fb7.e0fc9497.js deleted file mode 100644 index 6aafca39..00000000 --- a/assets/js/5f289fb7.e0fc9497.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[2870],{3905:(a,e,t)=>{t.d(e,{Zo:()=>d,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var p=n.createContext({}),m=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},d=function(a){var e=m(a.components);return n.createElement(p.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,d=u(a,["components","mdxType","originalType","parentName"]),s=m(t),o=i,b=s["".concat(p,".").concat(o)]||s[o]||k[o]||r;return t?n.createElement(b,l(l({ref:e},d),{},{components:t})):n.createElement(b,l({ref:e},d))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=s;var u={};for(var p in e)hasOwnProperty.call(e,p)&&(u[p]=e[p]);u.originalType=a,u.mdxType="string"==typeof a?a:i,l[1]=u;for(var m=2;m{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>u,toc:()=>m});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:49,title:"A.49. Attributes",sidebar_label:"A.49. Attributes"},l=void 0,u={unversionedId:"basic/attributes",id:"basic/attributes",title:"A.49. Attributes",description:"Kita telah beberapa kali menggunakan attributes pada chapter-chapter sebelumnya, contohnya seperti #[derive(Debug)]. Pada chapter ini kita akan bahas tentang apa sebenarnya attributes, macam-macam jenisnya, beserta kegunaannya.",source:"@site/docs/basic/attributes.md",sourceDirName:"basic",slug:"/basic/attributes",permalink:"/basic/attributes",draft:!1,tags:[],version:"current",sidebarPosition:49,frontMatter:{sidebar_position:49,title:"A.49. Attributes",sidebar_label:"A.49. Attributes"},sidebar:"tutorialSidebar",previous:{title:"A.48. Trait \u279c Iterator",permalink:"/basic/trait-iterator"},next:{title:"A.50. Date Time",permalink:"/basic/datetime"}},p={},m=[{value:"A.49.1. Konsep attributes",id:"a491-konsep-attributes",level:2},{value:"A.49.2. Attribute derive",id:"a492-attribute-derive",level:2},{value:"A.49.3. Attribute cfg / configuration",id:"a493-attribute-cfg--configuration",level:2},{value:"\u25c9 Configuration target_os",id:"-configuration-target_os",level:3},{value:"\u25c9 Configuration target_arch",id:"-configuration-target_arch",level:3},{value:"\u25c9 Other configuration",id:"-other-configuration",level:3},{value:"A.49.4. Attribute linting & diagnostic",id:"a494-attribute-linting--diagnostic",level:2},{value:"A.49.5. Attribute type system",id:"a495-attribute-type-system",level:2},{value:"A.49.6. Attribute modules",id:"a496-attribute-modules",level:2},{value:"A.49.7. Attribute testing",id:"a497-attribute-testing",level:2},{value:"A.49.8. Attribute macros",id:"a498-attribute-macros",level:2},{value:"A.49.9 Attribute lainnya",id:"a499-attribute-lainnya",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function k(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Kita telah beberapa kali menggunakan attributes pada chapter-chapter sebelumnya, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]"),". Pada chapter ini kita akan bahas tentang apa sebenarnya attributes, macam-macam jenisnya, beserta kegunaannya."),(0,i.kt)("h2",{id:"a491-konsep-attributes"},"A.49.1. Konsep attributes"),(0,i.kt)("p",null,"Attributes adalah metadata yang didefinisikan untuk suatu crate, module, atau module item. Kegunaan dari attributes berbeda satu sama lain, tergantung attribute apa yang dipakai (kita akan bahas satu per satu)."),(0,i.kt)("p",null,"Attribute dikategorikan menjadi 2:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Outer attributes"),(0,i.kt)("li",{parentName:"ul"},"Inner attributes")),(0,i.kt)("p",null,"Keduanya memiliki kegunaan yang sama, pembedanya adalah posisi dimana attribute harus dituliskan."),(0,i.kt)("p",null,"Outer attribute dituliskan tepat sebelum target (crate, module, module item, atau lainnya) dengan notasi penulisan seperti berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#[attribute = "value"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#[attribute(key = "value")]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[attribute(value)]"))),(0,i.kt)("p",null,"Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(Debug)]\nstruct LegoSet {\n code: i32,\n name: String,\n category: String,\n age_minimum: i32,\n}\n")),(0,i.kt)("p",null,"Sedikit berbeda dengan inner attribute, penulisannya berada didalam target (crate, module, module item, atau lainnya). Notasi penulisannya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#![attribute = "value"]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},'#![attribute(key = "value")]')),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#![attribute(value)]"))),(0,i.kt)("p",null,"Rust mengenal beberapa jenis attributes, dan kita akan membahasnya satu per satu."),(0,i.kt)("h2",{id:"a492-attribute-derive"},"A.49.2. Attribute ",(0,i.kt)("inlineCode",{parentName:"h2"},"derive")),(0,i.kt)("p",null,"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," digunakan untuk mempermudah implementasi suatu trait ke tipe data."),(0,i.kt)("p",null,"Kita telah mempelajari cara implementasi trait pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits")," yaitu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"for"),", kemudian diikuti dengan method serta implementasinya."),(0,i.kt)("p",null,"Dengan memanfaatkan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," kita tidak perlu menggunakan cara tersebut. Cukup tulis saja attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," beserta trait yang ingin diimplementasikan."),(0,i.kt)("p",null,"Agar lebih jelas, silakan pelajari contoh berikut terlebih dahulu:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'const SuperheroSuperman: &str = "superman";\nconst SuperheroOmniMan: &str = "omniman";\nconst SuperheroHyperion: &str = "hyperion";\n\nenum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nfn main() {\n let value: Superhero = Superhero::Superman;\n\n if value == Superhero::Superman {\n println!("hello superman!");\n }\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(253).Z,width:"958",height:"719"})),(0,i.kt)("p",null,"Kode di atas menghasilkan error karena enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," tidak mengadopsi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq")," yang dimana trait ini diperlukan dalam seleksi kondisi menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," dan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"=="),"."),(0,i.kt)("p",null,"Cara mengatasi error tersebut adalah dengan mengimplementasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq")," secara eksplisit. Sekarang coba tambahkan kode berikut pada deklarasi enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),", maka error akan hilang."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"enum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nimpl PartialEq for Superhero {\n\n fn eq(&self, other: &Self) -> bool {\n match (self, other) {\n (Superhero::Superman, Superhero::Superman) => true,\n (Superhero::OmniMan, Superhero::OmniMan) => true,\n (Superhero::Hyperion, Superhero::Hyperion) => true,\n _ => false,\n }\n }\n}\n")),(0,i.kt)("p",null,"Cara lain untuk mengatasi error di atas, selain menggunakan teknik implementasi trait secara eksplisit, adalah dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," disertai trait ",(0,i.kt)("inlineCode",{parentName:"p"},"PartialEq"),". Kurang lebih penulisan cara ini bisa dilihat di bawah ini. Cukup hapus block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," lalu tambahkan attribute pada deklarasi enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(PartialEq)]\nenum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n")),(0,i.kt)("p",null,"Cukup mudah bukan?"),(0,i.kt)("p",null,"Contoh lainnya, misalnya variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"value")," ingin di-print seperti pada kode berikut ini, pasti hasilnya error."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let value: Superhero = Superhero::Superman;\n\n if value == Superhero::Superman {\n println!("hello superman!");\n }\n\n println!("{value} (via `Display` trait)");\n println!("{value:#?} (via `Debug` trait)");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(7095).Z,width:"900",height:"461"})),(0,i.kt)("p",null,"Cara ",(0,i.kt)("em",{parentName:"p"},"resolve")," error di atas adalah dengan mengimplementasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Display")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," secara eksplisit. Atau, bisa juga menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive")," yang pastinya lebih praktis."),(0,i.kt)("p",null,"Kabar buruknya, hanya trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," yang menyediakan fitur implementasi trait menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive"),". Untuk trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Display")," kita perlu melakukan implementasi secara eksplisit."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Untuk tau mana trait yang bisa di-",(0,i.kt)("em",{parentName:"p"},"derive")," atau tidak, cukup lihat saja ",(0,i.kt)("em",{parentName:"p"},"highlight")," error yang muncul saat penulisan kode atau kompilasi.")),(0,i.kt)("p",null,"Ok, kita implementasikan saja keduanya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(PartialEq, Debug)]\nenum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nimpl std::fmt::Display for Superhero {\n\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "{self:?}")\n }\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(635).Z,width:"537",height:"127"})),(0,i.kt)("p",null,"Bisa dilihat, hasilnya program tereksekusi tanpa error. Enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero")," kini mengadopsi 3 trait:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"PartialEq")," via attribute ",(0,i.kt)("inlineCode",{parentName:"li"},"derive")),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Debug")," via attribute ",(0,i.kt)("inlineCode",{parentName:"li"},"derive")),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Display")," via implementasi eksplisit")),(0,i.kt)("h2",{id:"a493-attribute-cfg--configuration"},"A.49.3. Attribute ",(0,i.kt)("inlineCode",{parentName:"h2"},"cfg")," / ",(0,i.kt)("em",{parentName:"h2"},"configuration")),(0,i.kt)("p",null,"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg")," digunakan untuk menentukan beberapa konfigurasi yang berhubungan dengan arsitekture hardware/prosesor."),(0,i.kt)("p",null,"Salah satu contoh penerapannya bisa dilihat pada kode berikut. Ada 2 buah module yang namanya sama persis, perbedaannya adalah satu didefinisikan khusus untuk platform ",(0,i.kt)("inlineCode",{parentName:"p"},"linux"),", dan satunya lagi untuk platform ",(0,i.kt)("inlineCode",{parentName:"p"},"windows"),". Hal seperti ini bisa dilakukan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg")," dengan key ",(0,i.kt)("inlineCode",{parentName:"p"},"target_os"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[cfg(target_os = "linux")]\nmod util {\n\n pub fn say_hello() {\n println!("hello (from linux)")\n }\n}\n\n#[cfg(target_os = "windows")]\nmod util {\n\n pub fn say_hello() {\n println!("hello (from windows)")\n }\n\n pub fn say_something() {\n println!("how are you")\n }\n}\n')),(0,i.kt)("p",null,"Bisa dilihat cara penulisannya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg()")," kemudian diisi key ",(0,i.kt)("inlineCode",{parentName:"p"},"target_os")," dengan value adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"windows")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"linux"),"."),(0,i.kt)("p",null,"Dengan kondisi kode seperti di atas, ketika berada di sistem operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"linux"),", item ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_hello")," bisa diakses. Sedangkan pada sistem operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"windows"),", item ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_hello")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_something")," bisa diakses."),(0,i.kt)("p",null,"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg(target_os)")," juga bisa diterapkan pada block kode. Contohnya seperti pada kode berikut. Item ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_hello")," dipanggil di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". Dan khusus untuk sistem operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"windows"),", block kode berisi pemanggilan ",(0,i.kt)("inlineCode",{parentName:"p"},"util::say_something")," juga dipanggil."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n util::say_hello();\n\n #[cfg(target_os = "windows")]\n {\n util::say_something();\n }\n}\n')),(0,i.kt)("p",null,"Ada beberapa key yang tersedia pada attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"cfg"),", diantaranya:"),(0,i.kt)("h3",{id:"-configuration-target_os"},"\u25c9 Configuration ",(0,i.kt)("inlineCode",{parentName:"h3"},"target_os")),(0,i.kt)("p",null,"Digunakan untuk menandai bahwa item atau statement dibawah definisi attribute ini dikhususkan untuk sistem operasi tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[cfg(target_os = "value")]\n')),(0,i.kt)("p",null,"Opsi value yang tersedia:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"windows")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"macos")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ios")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"linux")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"android")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"freebsd")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"dragonfly")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"openbsd")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"netbsd"))),(0,i.kt)("h3",{id:"-configuration-target_arch"},"\u25c9 Configuration ",(0,i.kt)("inlineCode",{parentName:"h3"},"target_arch")),(0,i.kt)("p",null,"Digunakan untuk menandai bahwa item atau statement dibawah definisi attribute ini dikhususkan untuk arsitektur CPU tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[cfg(target_arch = "value")]\n')),(0,i.kt)("p",null,"Opsi value yang tersedia:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"x86")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"x86_64")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"mips")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"powerpc")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"powerpc64")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"arm")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"aarch64"))),(0,i.kt)("h3",{id:"-other-configuration"},"\u25c9 Other configuration"),(0,i.kt)("p",null,"Ada beberapa key konfigurasi lainnya yang tersedia. Lebih detailnya silakan lihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options"},"https://doc.rust-lang.org/reference/conditional-compilation.html#set-configuration-options"),"."),(0,i.kt)("h2",{id:"a494-attribute-linting--diagnostic"},"A.49.4. Attribute ",(0,i.kt)("em",{parentName:"h2"},"linting")," & ",(0,i.kt)("em",{parentName:"h2"},"diagnostic")),(0,i.kt)("p",null,"Ada beberapa attribute name yang bisa digunakan untuk meng-override ",(0,i.kt)("em",{parentName:"p"},"default linting")," milik Rust ataupun menandai indikator ",(0,i.kt)("em",{parentName:"p"},"diagnostic")," lainnya, seperti warning yang muncul karena ada kode yang tidak digunakan, dll; Warning sejenis ini bisa di-override menggunakan attribute."),(0,i.kt)("p",null,"Contoh kasus yang berhubungan dengan ",(0,i.kt)("em",{parentName:"p"},"linting")," bisa dilihat pada kode berikut."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(2329).Z,width:"351",height:"363"})),(0,i.kt)("p",null,"Kode di atas tidak menghasilkan error. Kode akan dieksekusi tanpa error. Namun ada 3 buah warning yang muncul karena beberapa baris kode tidak digunakan atau sia-sia."),(0,i.kt)("p",null,"Cara agar warning tidak muncul bisa dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"#[allow(value)]"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[allow(unused_imports)]\nuse std::fmt::Display;\n\nfn say_hello() {\n println!("hello")\n}\n\n#[allow(dead_code)]\nfn say_something() {\n println!("how are you")\n}\n\nfn main() {\n #[allow(unused_variables)]\n let name = "noval agung";\n\n say_hello();\n}\n')),(0,i.kt)("p",null,"Pada kode di atas, attribute name ",(0,i.kt)("inlineCode",{parentName:"p"},"allow")," digunakan pada 3 tempat:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[allow(unused_imports)]")," digunakan untuk antisipasi error yang muncul ketika module item di-import namun tidak digunakan."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[allow(dead_code)]")," digunakan untuk membolehkan kode yang tidak digunakan."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[allow(unused_variables)]")," digunakan untuk membolehkan variabel yang didefinisikan tapi tidak dimanfaatkan.")),(0,i.kt)("p",null,"Dengan penambahan 3 attribute di atas program akan tereksekusi tanpa warning."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(7964).Z,width:"463",height:"107"})),(0,i.kt)("p",null,"Ada beberapa attribute ",(0,i.kt)("em",{parentName:"p"},"key")," yang bisa digunakan untuk override ",(0,i.kt)("em",{parentName:"p"},"lint")," warning:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"#[allow(lint_rule)]")," untuk membolehkan suatu ",(0,i.kt)("em",{parentName:"p"},"lint rule"),".",(0,i.kt)("br",null),"List ",(0,i.kt)("inlineCode",{parentName:"p"},"lint_rule")," bisa dilihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html"},"https://doc.rust-lang.org/rustc/lints/listing/allowed-by-default.html"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"#[warn(lint_rule)]")," untuk memunculkan warning untuk suatu ",(0,i.kt)("em",{parentName:"p"},"lint rule")," yang ",(0,i.kt)("em",{parentName:"p"},"default"),"-nya tidak memunculkan warning.",(0,i.kt)("br",null),"List ",(0,i.kt)("inlineCode",{parentName:"p"},"lint_rule")," bisa dilihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/rustc/lints/listing/warn-by-default.html"},"https://doc.rust-lang.org/rustc/lints/listing/warn-by-default.html"),".")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},(0,i.kt)("inlineCode",{parentName:"p"},"#[deny(lint_rule)]")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"#[forbid(lint_rule)]")," untuk melarang suatu ",(0,i.kt)("em",{parentName:"p"},"lint rule")," yang ",(0,i.kt)("em",{parentName:"p"},"default"),"-nya adalah diperbolehkan.",(0,i.kt)("br",null),"List ",(0,i.kt)("inlineCode",{parentName:"p"},"lint_rule")," bisa dilihat di ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/rustc/lints/listing/deny-by-default.html"},"https://doc.rust-lang.org/rustc/lints/listing/deny-by-default.html"),"."))),(0,i.kt)("p",null,"Selain 3 attribute di atas, ada juga beberapa attribute lainnya untuk keperluan ",(0,i.kt)("em",{parentName:"p"},"diagnostic"),", diantaranya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[deprecated]")," digunakan untuk menandai bahwa kode dibawahnya adalah ",(0,i.kt)("em",{parentName:"li"},"deprecated"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"#[must_use]")," digunakan untuk mendandai bahwa kode dibawahnya harus digunakan, jika tidak maka akan muncul error.")),(0,i.kt)("h2",{id:"a495-attribute-type-system"},"A.49.5. Attribute ",(0,i.kt)("em",{parentName:"h2"},"type system")),(0,i.kt)("p",null,"Ada sebuah attribute bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive")," gunanya untuk mem-",(0,i.kt)("em",{parentName:"p"},"bypass")," error yang muncul karena ada pattern matching yang tidak meng-cover semua kondisi, atau untuk mengantisipasi error yang muncul saat deklarasi variabel bertipe struct tapi value property-nya tidak diisi."),(0,i.kt)("p",null,"Salah satu contoh error yang dimaksud bisa dilihat pada kode berikut. Error ini muncul karena enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Superhero::Superhero")," tidak ter-cover dalam pattern matching."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(7812).Z,width:"671",height:"669"})),(0,i.kt)("p",null,"Solusi untuk mengatasi error di atas bisa dengan cukup menambahkan case kondisi yang belum ter-cover:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match value {\n Superhero::Superman => println!("stronk"),\n Superhero::OmniMan => println!("stronk"),\n Superhero::Hyperion => println!("stronk"),\n}\n')),(0,i.kt)("p",null,"Atau dengan memanfaatkan kondisi ",(0,i.kt)("em",{parentName:"p"},"other")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"_"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match value {\n Superhero::Superman => println!("stronk"),\n Superhero::OmniMan => println!("stronk"),\n _ => println!("stronk"),\n}\n')),(0,i.kt)("p",null,"Atau, bisa dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[non_exhaustive]\npub enum Superhero {\n Superman,\n OmniMan,\n Hyperion,\n}\n\nfn main() {\n let value = Superhero::Superman;\n\n match value {\n Superhero::Superman => println!("stronk"),\n Superhero::OmniMan => println!("stronk"),\n }\n}\n')),(0,i.kt)("p",null,"Sayangnya dalam penggunaan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive")," ini, efeknya ",(0,i.kt)("strong",{parentName:"p"},"hanya bisa dirasakan jika digunakan pada enum atau struct yang berbeda crate"),"."),(0,i.kt)("p",null,"Pada contoh di atas, tempat dimana enum dideklarasikan dan digunakan adalah masih dalam satu crate yang sama, jadi kode tetap menghasilkan error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"non_exhaustive")," ini jika digunakan pada struct efeknya saat deklarasi variabel boleh tidak menuliskan value property.")),(0,i.kt)("h2",{id:"a496-attribute-modules"},"A.49.6. Attribute ",(0,i.kt)("em",{parentName:"h2"},"modules")),(0,i.kt)("p",null,"Aturan manajemen di Rust cukup ketat, dan sudah dibahas secara mendetal pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/module-basic"},"Module System \u279c Module"),", yang intinya adalah ada dua cara pembuatan module:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Cara ke-1: dengan mendefinisikan module pada file bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"nama_module.rs")),(0,i.kt)("li",{parentName:"ul"},"Cara ke-2: dengan mendefinisikan module pada file bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"nama_module/mod.rs"))),(0,i.kt)("p",null,"Rust memiliki sebuah attribute bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," yang berguna untuk meng-override 2 aturan di atas secara paksa. Dengan memanfaatkan attribute ini kita bisa menulis module dengan nama sesuka hati."),(0,i.kt)("p",null,"Mari kita praktekan agar lebih jelas. Silakan buat package baru dengan struktur seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2502\u2500\u2500\u2500 util1.rs\n \u2502\u2500\u2500\u2500 util2\n \u2502 \u2514\u2500\u2500\u2500 mod.rs\n \u2514\u2500\u2500\u2500 util3_mymodule.rs\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="util1.rs"',title:'"util1.rs"'},'pub fn say_hello() {\n println!("hello (from util1)")\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="util2/mod.rs"',title:'"util2/mod.rs"'},'pub fn say_hello() {\n println!("hello (from util2)")\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="util3_mymodule.rs"',title:'"util3_mymodule.rs"'},'pub fn say_hello() {\n println!("hello (from util3_mymodule)")\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="main.rs"',title:'"main.rs"'},'mod util1;\nmod util2;\n\n#[path = "util3_mymodule.rs"]\nmod util3;\n\nfn main() {\n util1::say_hello();\n util2::say_hello();\n util3::say_hello();\n}\n')),(0,i.kt)("p",null,"Pada kode di atas bisa dilihat, module ",(0,i.kt)("inlineCode",{parentName:"p"},"util1")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"util2")," patuh mengikuti aturan deklarasi module system. Berbeda dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"util3")," yang sebenarnya dideklarasikan dengan nama ",(0,i.kt)("inlineCode",{parentName:"p"},"util3_mymodule")," (karena filename-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"util3_mymodule.rs"),"). Nama module satu ini diubah menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"util3")," lalu dengan memanfaatkan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," kita arahkan isi module ",(0,i.kt)("inlineCode",{parentName:"p"},"util3")," adalah berada di ",(0,i.kt)("inlineCode",{parentName:"p"},"util3_mymodule.rs"),"."),(0,i.kt)("p",null,"Jialankan program, harusnya tidak ada error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Attribute",src:t(2259).Z,width:"456",height:"147"})),(0,i.kt)("h2",{id:"a497-attribute-testing"},"A.49.7. Attribute ",(0,i.kt)("em",{parentName:"h2"},"testing")),(0,i.kt)("p",null,"Lebih detailnya mengenai attribute testing dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/testing"},"Testing"),"."),(0,i.kt)("h2",{id:"a498-attribute-macros"},"A.49.8. Attribute ",(0,i.kt)("em",{parentName:"h2"},"macros")),(0,i.kt)("p",null,"Lebih detailnya mengenai attribute macros dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"),"."),(0,i.kt)("h2",{id:"a499-attribute-lainnya"},"A.49.9 Attribute lainnya"),(0,i.kt)("p",null,"Rust memiliki cukup banyak attribute yang list-nya bisa dilihat pada link ini ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/reference/attributes.html"},"https://doc.rust-lang.org/reference/attributes.html"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/attributes"},"github.com/novalagung/dasarpemrogramanrust-example/../attributes")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/module-basic"},"Module System \u279c Module")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/enum"},"Enum")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/attributes.html"},"https://doc.rust-lang.org/reference/attributes.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items/implementations.html"},"https://doc.rust-lang.org/reference/items/implementations.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rustc/lints/index.html"},"https://doc.rust-lang.org/rustc/lints/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/attributes/diagnostics.html"},"https://doc.rust-lang.org/reference/attributes/diagnostics.html"))))}k.isMDXComponent=!0},253:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-1-c3fd3abaf784b196c8b4da4512bb8abd.png"},7095:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-2-935bd54d9113cbcfb6a5c07a7ebd9f68.png"},635:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhkAAAB/CAIAAADNSkeyAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE72lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMzBUMjA6NDE6MTkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTMxVDE5OjU1OjQwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTMxVDE5OjU1OjQwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjNjIzZTI3OS1mMTJkLTkwNDktODVjYi0xNTZlYWJlNGE1NTkiIHhtcE1NOkRvY3VtZW50SUQ9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"},2329:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-4-0ae9faf44e5f0113b2599d985a7f331d.png"},7964:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAABrCAIAAACe4J4wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAE72lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMzBUMjI6MDU6NTIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTMxVDE5OjU2OjQ4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTMxVDE5OjU2OjQ4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDozYzYzZWI4Ny1kMzc1LWIxNDctYjVkYS1iMzY2MGQ3NTY0YWYiIHhtcE1NOkRvY3VtZW50SUQ9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"},7812:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/attribute-6-edad9c816a2c847561bcc988d0905b16.png"},2259:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcgAAACTCAIAAACF/R49AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFf2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMzFUMTk6Mjg6NTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTMxVDE5OjU4OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTMxVDE5OjU4OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjZjYxM2Q1My1iY2RkLTM4NDUtYjkwYS1lMWM4NTc3M2E3ZWIiIHhtcE1NOkRvY3VtZW50SUQ9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"}}]); \ No newline at end of file diff --git a/assets/js/62b99870.4801cdae.js b/assets/js/62b99870.4801cdae.js deleted file mode 100644 index 0d143b72..00000000 --- a/assets/js/62b99870.4801cdae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[1422],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>c});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var s=t.createContext({}),d=function(a){var e=t.useContext(s),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},m=function(a){var e=d(a.components);return t.createElement(s.Provider,{value:e},a.children)},A={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},u=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,s=a.parentName,m=p(a,["components","mdxType","originalType","parentName"]),u=d(n),c=i,b=u["".concat(s,".").concat(c)]||u[c]||A[c]||l;return n?t.createElement(b,r(r({ref:e},m),{},{components:n})):t.createElement(b,r({ref:e},m))}));function c(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=u;var p={};for(var s in e)hasOwnProperty.call(e,s)&&(p[s]=e[s]);p.originalType=a,p.mdxType="string"==typeof a?a:i,r[1]=p;for(var d=2;d{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>r,default:()=>A,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:14,title:"A.14. Slice (Basic)",sidebar_label:"A.14. Slice (Basic)"},r=void 0,p={unversionedId:"basic/slice",id:"basic/slice",title:"A.14. Slice (Basic)",description:"Pada bab ini kita belajar tentang apa itu slice, apa perbedaan slice dan array, slicing atau borrowing pada slice, dan juga slice mutability.",source:"@site/docs/basic/slice.md",sourceDirName:"basic",slug:"/basic/slice",permalink:"/basic/slice",draft:!1,tags:[],version:"current",sidebarPosition:14,frontMatter:{sidebar_position:14,title:"A.14. Slice (Basic)",sidebar_label:"A.14. Slice (Basic)"},sidebar:"tutorialSidebar",previous:{title:"A.13. Array",permalink:"/basic/array"},next:{title:"A.15. Tuple",permalink:"/basic/tuple"}},s={},d=[{value:"A.14.1. Tipe data slice",id:"a141-tipe-data-slice",level:2},{value:"A.14.2. Size slice",id:"a142-size-slice",level:2},{value:"A.14.3. Slice range syntax",id:"a143-slice-range-syntax",level:2},{value:"A.14.4. Mutability pada slice",id:"a144-mutability-pada-slice",level:2},{value:"A.14.5. Perulangan for in pada slice",id:"a145-perulangan-for-in-pada-slice",level:2},{value:"A.14.6. Perulangan for in pada mutable slice",id:"a146-perulangan-for-in-pada-mutable-slice",level:2},{value:"A.14.7. Append slice",id:"a147-append-slice",level:2},{value:"A.14.8. Memory management pada slice",id:"a148-memory-management-pada-slice",level:2},{value:"A.14.9. Summary",id:"a149-summary",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:d};function A(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},m,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada bab ini kita belajar tentang apa itu slice, apa perbedaan slice dan array, ",(0,i.kt)("em",{parentName:"p"},"slicing")," atau ",(0,i.kt)("em",{parentName:"p"},"borrowing")," pada slice, dan juga slice mutability."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada chapter ini kita akan bahas slice secara garis besar saja, tanpa menyinggung masalah memory management."),(0,i.kt)("p",{parentName:"blockquote"},"Pembahasan lebih dalam perihal slice ada pada chapter terpisah (",(0,i.kt)("a",{parentName:"p",href:"/basic/slice-memory-management"},"Memory Management \u279c Slice"),"), setelah kita mempelajari dasar-dasar memory management nantinya.")),(0,i.kt)("h2",{id:"a141-tipe-data-slice"},"A.14.1. Tipe data slice"),(0,i.kt)("p",null,"Array adalah tipe data kolektif yang isinya bertipe sejenis. Contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},'["a", "b", "c"]')," adalah sebuah array dengan elemen bertipe string dan array tersebut memiliki size ",(0,i.kt)("inlineCode",{parentName:"p"},"3"),"."),(0,i.kt)("p",null,"Lalu apa itu slice? menurut laman dokumentasi Rust, slice adalah:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"A slice is a dynamically sized type representing a 'view' into a sequence of elements of type T. The slice type is written as ","[T]"),(0,i.kt)("p",{parentName:"blockquote"},"A dynamically-sized view into a contiguous sequence, ","[T]",". Contiguous here means that elements are laid out so that every element is the same distance from its neighbors."),(0,i.kt)("p",{parentName:"blockquote"},"Slices are a view into a block of memory represented as a pointer and a size.")),(0,i.kt)("p",null,"Slice adalah representasi ",(0,i.kt)("em",{parentName:"p"},"block of memory")," berbentuk pointer dan memiliki size yang dinamis (tidak fixed seperti array). Notasi tipe data slice adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"&[T]")," dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data element."),(0,i.kt)("p",null,"Slice bisa dibuat dari data array (atau dari tipe kolektif data lainnya) dengan menggunakan kombinasi operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," dan ",(0,i.kt)("em",{parentName:"p"},"range syntax")," ",(0,i.kt)("inlineCode",{parentName:"p"},"..")," dengan notasi penulisan seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let sliced_value1 = &data[start_index..end_index]\nlet sliced_value2 = &data[start_index..=end_index]\nlet sliced_value3 = &data[start_index..end_index]\n...\n")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Slice juga bisa dibuat dari tipe data vector. Lebih jelasnya dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector"),".")),(0,i.kt)("p",null,"Silakan perhatikan contoh berikut dan praktikkan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numbers = [12, 16, 8, 3];\nprintln!("numbers : {:?}, len: {}", numbers, numbers.len());\nprintln!("numbers[0]: {:?}", numbers[0]);\nprintln!("numbers[1]: {:?}", numbers[1]);\n\nlet slice_a = &numbers[0..3];\nprintln!("slice_a : {:?}, len: {}", slice_a, slice_a.len());\nprintln!("slice_a[0]: {:?}", slice_a[0]);\nprintln!("slice_a[1]: {:?}", slice_a[1]);\n\nlet slice_b = &slice_a[1..=2];\nprintln!("slice_b : {:?}, len: {}", slice_b, slice_b.len());\nprintln!("slice_b[0]: {:?}", slice_b[0]);\nprintln!("slice_b[1]: {:?}", slice_b[1]);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(8493).Z,width:"463",height:"256"})),(0,i.kt)("p",null,"Pada contoh di atas, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," didefinisikan bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"[i32; 4]"),". Data pada variabel tersebut kemudian dipinjam ditampung pada variabel baru beranama ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," yang merupakan slice bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&[i32]"),", dengan isi adalah element array ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," indeks ke ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," hingga sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"3")," (yang berarti index ke-",(0,i.kt)("inlineCode",{parentName:"p"},"2"),"). Dengan ini maka ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[12, 16, 8]")," dengan size ",(0,i.kt)("inlineCode",{parentName:"p"},"3"),"."),(0,i.kt)("p",null,"Bisa dilihat pada statement print ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a[0]")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a[1]"),", nilai elemennya sesuai dengan dengan hasil peminjaman data array ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Data yang tipenya ",(0,i.kt)("inlineCode",{parentName:"p"},"&[T]")," biasa disebut sebagai ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/reference/types/slice.html"},(0,i.kt)("em",{parentName:"a"},"shared slice"))," atau cukup ",(0,i.kt)("em",{parentName:"p"},"slice"),". Contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," dengan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&[i32]"),".")),(0,i.kt)("p",null,"Slice ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," bukan merupakan pemilik sebenarnya data ",(0,i.kt)("inlineCode",{parentName:"p"},"[12, 16, 8]"),", slice tersebut hanya meminjam datanya dari ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," yang notabene dalah owner data ",(0,i.kt)("inlineCode",{parentName:"p"},"[12, 16, 8]"),"."),(0,i.kt)("p",null,"Meminjam di sini artinya variabel baru ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," memiliki data yang sama, dan alamat memori (atau pointer) data tersebut juga sama yaitu mengarah ke owner sebenarnya, yang pada contoh ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di Rust, proses meminjam data secara umum disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"borrowing"),". Variabel atau data hasil dari borrowing biasa disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"reference"),". Lebih jelasnya akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Variabel pemilik data yang sebenarnya disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"owner"),". Lebih jelasnya mengenai ownership dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership")),(0,i.kt)("p",{parentName:"blockquote"},"Dalam konteks slice, proses meminjam data (yg menggunakan teknik borrowing dan range syntax) disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"slicing"),".")),(0,i.kt)("p",null,"Dengan menggunakan VSCode ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer")," kita bisa melihat dengan mudah tipe sebuah slice."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(2462).Z,width:"540",height:"346"})),(0,i.kt)("p",null,"Kembali ke pembahasan pada contoh di atas. Selain ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a"),", ada juga slice ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_b")," yang isinya merupakan data pinjaman dari ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a"),". Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"&slice_a[1..=2]")," artinya adalah ",(0,i.kt)("em",{parentName:"p"},"borrowing")," slice ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," mulai dari indeks ke-",(0,i.kt)("inlineCode",{parentName:"p"},"1")," hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"2"),". Dengan ini indeks ke-1 milik ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," menjadi indeks ke-0 milik ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_b"),", ... dan seterusnya. Hasilnya, nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_b")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[16, 8]")," dengan size ",(0,i.kt)("inlineCode",{parentName:"p"},"2"),"."),(0,i.kt)("p",null,"Silakan juga cek penjelasan tambahan berikut, agar semakin paham tentang slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let numbers = [12, 16, 8, 3];\n// variabel numbers isinya array [12, 16, 8, 3]\n\nlet slice_a = &numbers[0..3];\n// meminjam data milik numbers elemen ke-0 hingga sebelum 3 (yaitu 2)\n// hasilnya adalah [12, 16, 8]\n\nlet slice_b = &slice_a[1..=2];\n// meminjam data milik slice_a elemen ke-1 hingga 2\n// hasilnya adalah [16, 8]\n")),(0,i.kt)("h2",{id:"a142-size-slice"},"A.14.2. Size slice"),(0,i.kt)("p",null,"Gunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"len")," untuk mencari tau size dari slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numbers = [12, 16, 8, 3];\nprintln!("{}", numbers.len());\n// output: 4\n\nlet slice_a = &numbers[0..3];\nprintln!("{}", slice_a.len());\n// output: 3\n\nlet slice_b = &slice_a[1..=2];\nprintln!("{}", slice_b.len());\n// output: 2\n')),(0,i.kt)("h2",{id:"a143-slice-range-syntax"},"A.14.3. Slice ",(0,i.kt)("em",{parentName:"h2"},"range syntax")),(0,i.kt)("p",null,"Di bawah ini adalah range syntax yang bisa digunakan untuk slicing. Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data")," pada contoh berikut dijadikan sebagai bahan slicing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data = ["a", "b", "c", "d"];\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[start_index..end_index]")," untuk slicing data dari ",(0,i.kt)("inlineCode",{parentName:"p"},"start_index")," hingga sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[1..3];\nprintln!("{:?}", sliced_data);\n// output => ["b", "c"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[start_index..=end_index]")," untuk slicing data dari ",(0,i.kt)("inlineCode",{parentName:"p"},"start_index")," hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[1..=3];\nprintln!("{:?}", sliced_data);\n// output => ["b", "c", "d"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[..end_index]")," untuk slicing data dari 0 hingga sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[..3];\nprintln!("{:?}", sliced_data);\n// output => ["a", "b", "c"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[..=end_index]")," untuk slicing data dari 0 hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[..=2];\nprintln!("{:?}", sliced_data);\n// output => ["a", "b", "c"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[start_index..]")," untuk slicing data dari ",(0,i.kt)("inlineCode",{parentName:"p"},"start_index")," hingga indeks terakhir"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[1..];\nprintln!("{:?}", sliced_data);\n// output => ["b", "c", "d"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[..]")," untuk slicing semua elemen yang ada"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[..];\nprintln!("{:?}", sliced_data);\n// output => ["A", "b", "c", "d"]\n')))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Perihal apa itu borrowing dan kegunaan dari operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," yang ditulis di awal variabel dibahas lebih detail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),".")),(0,i.kt)("h2",{id:"a144-mutability-pada-slice"},"A.14.4. Mutability pada slice"),(0,i.kt)("p",null,"Ada dua jenis data hasil operasi ",(0,i.kt)("em",{parentName:"p"},"borrowing")," (atau biasa disebut dengan data ",(0,i.kt)("em",{parentName:"p"},"reference"),")."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Read only atau shared reference, operator yang digunakan adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"&"),"."),(0,i.kt)("li",{parentName:"ul"},"Mutable reference, operator yang digunakan adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"&mut"),".")),(0,i.kt)("p",null,"Kita akan bahas garis besarnya saja pada chapter ini. Intinya, shared reference adalah data hasil peminjaman/borrowing yang hanya bisa dibaca. Sedangkan mutable reference adalah data hasil borrowing yang bisa diubah nilainya, yang jika ini dilakukan maka akan mengubah juga data pemilik sebenarnya."),(0,i.kt)("p",null,"Contoh berikut adalah salah satu penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut"),". Variabel slice ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers2")," dipinjam beberapa elemennya dengan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," ke variabel baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_e"),". Dengan operator tersebut maka borrowing menghasilkan data ",(0,i.kt)("em",{parentName:"p"},"mutable reference"),", data yang nilainya diperbolehkan untuk diubah meskipun data pinjaman."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut numbers2 = [12, 16, 8, 3];\nprintln!("===== before =====");\nprintln!("numbers2 : {:?}", numbers2);\n\nlet slice_e = &mut numbers2[..=2];\nslice_e[1] = 99;\n\nprintln!("===== after =====");\nprintln!("slice_e : {:?}", slice_e);\nprintln!("numbers2 : {:?}", numbers2);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(7858).Z,width:"457",height:"189"})),(0,i.kt)("p",null,"Bisa dilihat, indeks ke-1 ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_e")," diubah nilainya yang sebelumnya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"16")," menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"99"),". Setelah itu di-print, di output nilai variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers2")," juga ikut berubah. Hal ini karena perubahan data pada variabel mutable reference juga punya pengaruh ke variabel pemilik data sebenarnya (yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers2"),")."),(0,i.kt)("p",null,"O iya, penggunaan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," mengharuskan kita untuk tidak menuliskan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," pada variabel yang menampung nilai borrowing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// statement yang direkomendasikan\nlet slice_e = &mut numbers2[..=2];\n\n// statement yang TIDAK DIREKOMENDASIKAN dan akan memunculkan warning.\nlet mut slice_e = &mut numbers2[..=2];\n")),(0,i.kt)("h2",{id:"a145-perulangan-for-in-pada-slice"},"A.14.5. Perulangan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")," pada slice"),(0,i.kt)("p",null,"Slice merupakan tipe data yang implement trait Iterator (seperti array), dan semua data yang memiliki trait tersebut bisa digunakan pada perulangan. Slice ",(0,i.kt)("inlineCode",{parentName:"p"},"&[T]")," jika dipergunakan dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", tipe data penampung iterasi perulangan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),", bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yaa jadi jangan sampai keliru."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let scores1 = [7, 8, 9];\n\nfor score in &scores1[..] {\n print!("{:?} ", score);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(6760).Z,width:"462",height:"272"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Sangat dianjurkan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer")," jika menggunakan VSCode, agar lebih mudah melihat tipe data variabel dan informasi penting lainnya yang berguna dalam proses coding atau development."),(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator")))),(0,i.kt)("h2",{id:"a146-perulangan-for-in-pada-mutable-slice"},"A.14.6. Perulangan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")," pada mutable slice"),(0,i.kt)("p",null,"Sama seperti penggunaan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," pada shared slice, pada contoh kasus mutable slice perbedaannya hanyalah pada tipe data penampung iterasi yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut T"),", bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),"."),(0,i.kt)("p",null,"Pada contoh berikut kita coba eksperimen mengubah nilai elemen sebuah mutable slice yang data aslinya juga hasil dari peminjaman mutable slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut scores2 = [7, 8, 9];\nprintln!("(before) scores2 : {:?}", scores2);\n\nlet slice_f = &mut scores2[..];\n\nfor score in &mut slice_f[..] {\n *score += 1;\n}\n\nprintln!("(after) scores2 : {:?}", scores2);\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"scores")," dipinjam menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," ke variabel baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_f"),". Kemudian ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_f")," dipinjam juga sebagai mutable slice pada perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),"."),(0,i.kt)("p",null,"Setelah di-increment nilainya menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"*score += 1")," bisa dilihat hasil akhirnya juga mengubah nilai variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"scores2")," yang merupakan ",(0,i.kt)("em",{parentName:"p"},"owner")," atau pemilik data sebenarnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(4820).Z,width:"467",height:"376"})),(0,i.kt)("p",null,"Operasi increment pada ",(0,i.kt)("inlineCode",{parentName:"p"},"score")," tidak bisa dituliskan dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"score += 1")," karena tipe data score adalah pointer mutable reference (ditandai dengan adanya ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut"),"), untuk increment nilainya perlu di-",(0,i.kt)("em",{parentName:"p"},"dereference")," terlebih dahulu menggunakan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"*"),". Lebih jelasnya kita bahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),"."),(0,i.kt)("h2",{id:"a147-append-slice"},"A.14.7. Append slice"),(0,i.kt)("p",null,"Slice by default tidak mendukung operasi append. Sebenarnya bisa saja dilakukan tapi agak panjang caranya (silakan cari referensinya di Google untuk ini)."),(0,i.kt)("p",null,"Perlu diketahui, jika kebutuhannya adalah untuk menampung jenis data yang size-nya bisa bertamah, penulis anjurkan untuk menggunakan ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector")," yang beberapa bab lagi akan kita bahas."),(0,i.kt)("h2",{id:"a148-memory-management-pada-slice"},"A.14.8. Memory management pada slice"),(0,i.kt)("p",null,"Nantinya setelah selesai dengan pembahasan dasar memory management di Rust, kita akan bahas lagi topik slice tapi dari sudut pandang memory management pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/slice-memory-management"},"Memory Management \u279c Slice"),"."),(0,i.kt)("h2",{id:"a149-summary"},"A.14.9. Summary"),(0,i.kt)("p",null,"Catatan ringkas perihal slice:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Slice memiliki notasi ",(0,i.kt)("inlineCode",{parentName:"li"},"&[T]"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"&")," disitu artinya adalah operasi borrowing/peminjaman"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," adalah tipe data tiap elemen"))),(0,i.kt)("li",{parentName:"ul"},"Slice bisa terbentuk dari hasil meminjam data array, vector, atau tipe data kolektif lainnya"),(0,i.kt)("li",{parentName:"ul"},"Data slice adalah selalu data pinjaman"),(0,i.kt)("li",{parentName:"ul"},"Slice memiliki lebar/size"),(0,i.kt)("li",{parentName:"ul"},"Slicing adalah cara pengaksesan slice menggunakan ",(0,i.kt)("em",{parentName:"li"},"range syntax")),(0,i.kt)("li",{parentName:"ul"},"Slice bisa immutable, bisa juga mutable (menggunakan ",(0,i.kt)("inlineCode",{parentName:"li"},"&mut"),")")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/slice"},"github.com/novalagung/dasarpemrogramanrust-example/../slice")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-03-slices.html#the-slice-type"},"https://doc.rust-lang.org/book/ch04-03-slices.html#the-slice-type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.slice.html"},"https://doc.rust-lang.org/std/primitive.slice.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/trait.Iterator.html"},"https://doc.rust-lang.org/std/iter/trait.Iterator.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/types/slice.html"},"https://doc.rust-lang.org/reference/types/slice.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/references.html"},"https://doc.rust-lang.org/nomicon/references.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/primitives/array.html"},"https://doc.rust-lang.org/rust-by-example/primitives/array.html"))))}A.isMDXComponent=!0},8493:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAAEACAIAAABapGodAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjdUMTY6MjA6MDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE0OjQzOjIzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE0OjQzOjIzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdlY2NjOGVmLWRjNjgt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"},2462:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/slice-2-f573e34bdab45ca8821163ae546a42ba.png"},7858:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAAC9CAIAAABXmRFFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDRUMTI6NTI6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE0OjQxOjMzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE0OjQxOjMzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU4MzM3NjM1LTc5MGEt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"},6760:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/slice-5-541f1e4111281ebbac474d8d9828c0e8.png"},4820:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/slice-6-393c62bd8cdd9da05fcae56436a3cacd.png"}}]); \ No newline at end of file diff --git a/assets/js/62b99870.eac41936.js b/assets/js/62b99870.eac41936.js new file mode 100644 index 00000000..f2ce815f --- /dev/null +++ b/assets/js/62b99870.eac41936.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[1422],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>c});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var s=t.createContext({}),d=function(a){var e=t.useContext(s),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},m=function(a){var e=d(a.components);return t.createElement(s.Provider,{value:e},a.children)},A={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},u=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,s=a.parentName,m=p(a,["components","mdxType","originalType","parentName"]),u=d(n),c=i,b=u["".concat(s,".").concat(c)]||u[c]||A[c]||l;return n?t.createElement(b,r(r({ref:e},m),{},{components:n})):t.createElement(b,r({ref:e},m))}));function c(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=u;var p={};for(var s in e)hasOwnProperty.call(e,s)&&(p[s]=e[s]);p.originalType=a,p.mdxType="string"==typeof a?a:i,r[1]=p;for(var d=2;d{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>r,default:()=>A,frontMatter:()=>l,metadata:()=>p,toc:()=>d});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:14,title:"A.14. Slice (Basic)",sidebar_label:"A.14. Slice (Basic)"},r=void 0,p={unversionedId:"basic/slice",id:"basic/slice",title:"A.14. Slice (Basic)",description:"Pada bab ini kita belajar tentang apa itu slice, apa perbedaan slice dan array, slicing atau borrowing pada slice, dan juga slice mutability.",source:"@site/docs/basic/slice.md",sourceDirName:"basic",slug:"/basic/slice",permalink:"/basic/slice",draft:!1,tags:[],version:"current",sidebarPosition:14,frontMatter:{sidebar_position:14,title:"A.14. Slice (Basic)",sidebar_label:"A.14. Slice (Basic)"},sidebar:"tutorialSidebar",previous:{title:"A.13. Array",permalink:"/basic/array"},next:{title:"A.15. Tuple",permalink:"/basic/tuple"}},s={},d=[{value:"A.14.1. Tipe data slice",id:"a141-tipe-data-slice",level:2},{value:"A.14.2. Size slice",id:"a142-size-slice",level:2},{value:"A.14.3. Slice range syntax",id:"a143-slice-range-syntax",level:2},{value:"A.14.4. Mutability pada slice",id:"a144-mutability-pada-slice",level:2},{value:"A.14.5. Perulangan for in pada slice",id:"a145-perulangan-for-in-pada-slice",level:2},{value:"A.14.6. Perulangan for in pada mutable slice",id:"a146-perulangan-for-in-pada-mutable-slice",level:2},{value:"A.14.7. Append slice",id:"a147-append-slice",level:2},{value:"A.14.8. Memory management pada slice",id:"a148-memory-management-pada-slice",level:2},{value:"A.14.9. Summary",id:"a149-summary",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:d};function A(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},m,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada bab ini kita belajar tentang apa itu slice, apa perbedaan slice dan array, ",(0,i.kt)("em",{parentName:"p"},"slicing")," atau ",(0,i.kt)("em",{parentName:"p"},"borrowing")," pada slice, dan juga slice mutability."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada chapter ini kita akan bahas slice secara garis besar saja, tanpa menyinggung masalah memory management."),(0,i.kt)("p",{parentName:"blockquote"},"Pembahasan lebih dalam perihal slice ada pada chapter terpisah (",(0,i.kt)("a",{parentName:"p",href:"/basic/slice-memory-management"},"Memory Management \u279c Slice"),"), setelah kita mempelajari dasar-dasar memory management nantinya.")),(0,i.kt)("h2",{id:"a141-tipe-data-slice"},"A.14.1. Tipe data slice"),(0,i.kt)("p",null,"Array adalah tipe data kolektif yang isinya bertipe sejenis. Contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},'["a", "b", "c"]')," adalah sebuah array dengan elemen bertipe string dan array tersebut memiliki size ",(0,i.kt)("inlineCode",{parentName:"p"},"3"),"."),(0,i.kt)("p",null,"Lalu apa itu slice? menurut laman dokumentasi Rust, slice adalah:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"A slice is a dynamically sized type representing a 'view' into a sequence of elements of type T. The slice type is written as ","[T]"),(0,i.kt)("p",{parentName:"blockquote"},"A dynamically-sized view into a contiguous sequence, ","[T]",". Contiguous here means that elements are laid out so that every element is the same distance from its neighbors."),(0,i.kt)("p",{parentName:"blockquote"},"Slices are a view into a block of memory represented as a pointer and a size.")),(0,i.kt)("p",null,"Slice adalah representasi ",(0,i.kt)("em",{parentName:"p"},"block of memory")," berbentuk pointer dan memiliki size yang dinamis (tidak fixed seperti array). Notasi tipe data slice adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"&[T]")," yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data element."),(0,i.kt)("p",null,"Slice bisa dibuat dari data array (atau dari tipe kolektif data lainnya) dengan menggunakan kombinasi operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," dan ",(0,i.kt)("em",{parentName:"p"},"range syntax")," ",(0,i.kt)("inlineCode",{parentName:"p"},"..")," dengan notasi penulisan seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let sliced_value1 = &data[start_index..end_index]\nlet sliced_value2 = &data[start_index..=end_index]\nlet sliced_value3 = &data[start_index..end_index]\n...\n")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Slice juga bisa dibuat dari tipe data vector. Lebih jelasnya dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector"),".")),(0,i.kt)("p",null,"Silakan perhatikan contoh berikut dan praktikkan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numbers = [12, 16, 8, 3];\nprintln!("numbers : {:?}, len: {}", numbers, numbers.len());\nprintln!("numbers[0]: {:?}", numbers[0]);\nprintln!("numbers[1]: {:?}", numbers[1]);\n\nlet slice_a = &numbers[0..3];\nprintln!("slice_a : {:?}, len: {}", slice_a, slice_a.len());\nprintln!("slice_a[0]: {:?}", slice_a[0]);\nprintln!("slice_a[1]: {:?}", slice_a[1]);\n\nlet slice_b = &slice_a[1..=2];\nprintln!("slice_b : {:?}, len: {}", slice_b, slice_b.len());\nprintln!("slice_b[0]: {:?}", slice_b[0]);\nprintln!("slice_b[1]: {:?}", slice_b[1]);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(8493).Z,width:"463",height:"256"})),(0,i.kt)("p",null,"Pada contoh di atas, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," didefinisikan bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"[i32; 4]"),". Data pada variabel tersebut kemudian dipinjam ditampung pada variabel baru beranama ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," yang merupakan slice bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&[i32]"),", dengan isi adalah element array ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," indeks ke ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," hingga sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"3")," (yang berarti index ke-",(0,i.kt)("inlineCode",{parentName:"p"},"2"),"). Dengan ini maka ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[12, 16, 8]")," dengan size ",(0,i.kt)("inlineCode",{parentName:"p"},"3"),"."),(0,i.kt)("p",null,"Bisa dilihat pada statement print ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a[0]")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a[1]"),", nilai elemennya sesuai dengan dengan hasil peminjaman data array ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Data yang tipenya ",(0,i.kt)("inlineCode",{parentName:"p"},"&[T]")," biasa disebut sebagai ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/reference/types/slice.html"},(0,i.kt)("em",{parentName:"a"},"shared slice"))," atau cukup ",(0,i.kt)("em",{parentName:"p"},"slice"),". Contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," dengan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&[i32]"),".")),(0,i.kt)("p",null,"Slice ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," bukan merupakan pemilik sebenarnya data ",(0,i.kt)("inlineCode",{parentName:"p"},"[12, 16, 8]"),", slice tersebut hanya meminjam datanya dari ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," yang notabene dalah owner data ",(0,i.kt)("inlineCode",{parentName:"p"},"[12, 16, 8]"),"."),(0,i.kt)("p",null,"Meminjam di sini artinya variabel baru ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," memiliki data yang sama, dan alamat memori (atau pointer) data tersebut juga sama yaitu mengarah ke owner sebenarnya, yang pada contoh ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di Rust, proses meminjam data secara umum disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"borrowing"),". Variabel atau data hasil dari borrowing biasa disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"reference"),". Lebih jelasnya akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Variabel pemilik data yang sebenarnya disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"owner"),". Lebih jelasnya mengenai ownership dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership")),(0,i.kt)("p",{parentName:"blockquote"},"Dalam konteks slice, proses meminjam data (yg menggunakan teknik borrowing dan range syntax) disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"slicing"),".")),(0,i.kt)("p",null,"Dengan menggunakan VSCode ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer")," kita bisa melihat dengan mudah tipe sebuah slice."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(2462).Z,width:"540",height:"346"})),(0,i.kt)("p",null,"Kembali ke pembahasan pada contoh di atas. Selain ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a"),", ada juga slice ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_b")," yang isinya merupakan data pinjaman dari ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a"),". Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"&slice_a[1..=2]")," artinya adalah ",(0,i.kt)("em",{parentName:"p"},"borrowing")," slice ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," mulai dari indeks ke-",(0,i.kt)("inlineCode",{parentName:"p"},"1")," hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"2"),". Dengan ini indeks ke-1 milik ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_a")," menjadi indeks ke-0 milik ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_b"),", ... dan seterusnya. Hasilnya, nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_b")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[16, 8]")," dengan size ",(0,i.kt)("inlineCode",{parentName:"p"},"2"),"."),(0,i.kt)("p",null,"Silakan juga cek penjelasan tambahan berikut, agar semakin paham tentang slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let numbers = [12, 16, 8, 3];\n// variabel numbers isinya array [12, 16, 8, 3]\n\nlet slice_a = &numbers[0..3];\n// meminjam data milik numbers elemen ke-0 hingga sebelum 3 (yaitu 2)\n// hasilnya adalah [12, 16, 8]\n\nlet slice_b = &slice_a[1..=2];\n// meminjam data milik slice_a elemen ke-1 hingga 2\n// hasilnya adalah [16, 8]\n")),(0,i.kt)("h2",{id:"a142-size-slice"},"A.14.2. Size slice"),(0,i.kt)("p",null,"Gunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"len")," untuk mencari tau size dari slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numbers = [12, 16, 8, 3];\nprintln!("{}", numbers.len());\n// output: 4\n\nlet slice_a = &numbers[0..3];\nprintln!("{}", slice_a.len());\n// output: 3\n\nlet slice_b = &slice_a[1..=2];\nprintln!("{}", slice_b.len());\n// output: 2\n')),(0,i.kt)("h2",{id:"a143-slice-range-syntax"},"A.14.3. Slice ",(0,i.kt)("em",{parentName:"h2"},"range syntax")),(0,i.kt)("p",null,"Di bawah ini adalah range syntax yang bisa digunakan untuk slicing. Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data")," pada contoh berikut dijadikan sebagai bahan slicing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data = ["a", "b", "c", "d"];\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[start_index..end_index]")," untuk slicing data dari ",(0,i.kt)("inlineCode",{parentName:"p"},"start_index")," hingga sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[1..3];\nprintln!("{:?}", sliced_data);\n// output => ["b", "c"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[start_index..=end_index]")," untuk slicing data dari ",(0,i.kt)("inlineCode",{parentName:"p"},"start_index")," hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[1..=3];\nprintln!("{:?}", sliced_data);\n// output => ["b", "c", "d"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[..end_index]")," untuk slicing data dari 0 hingga sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[..3];\nprintln!("{:?}", sliced_data);\n// output => ["a", "b", "c"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[..=end_index]")," untuk slicing data dari 0 hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"end_index")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[..=2];\nprintln!("{:?}", sliced_data);\n// output => ["a", "b", "c"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[start_index..]")," untuk slicing data dari ",(0,i.kt)("inlineCode",{parentName:"p"},"start_index")," hingga indeks terakhir"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[1..];\nprintln!("{:?}", sliced_data);\n// output => ["b", "c", "d"]\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"&data[..]")," untuk slicing semua elemen yang ada"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sliced_data = &data[..];\nprintln!("{:?}", sliced_data);\n// output => ["A", "b", "c", "d"]\n')))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Perihal apa itu borrowing dan kegunaan dari operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," yang ditulis di awal variabel dibahas lebih detail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),".")),(0,i.kt)("h2",{id:"a144-mutability-pada-slice"},"A.14.4. Mutability pada slice"),(0,i.kt)("p",null,"Ada dua jenis data hasil operasi ",(0,i.kt)("em",{parentName:"p"},"borrowing")," (atau biasa disebut dengan data ",(0,i.kt)("em",{parentName:"p"},"reference"),")."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Read only atau shared reference, operator yang digunakan adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"&"),"."),(0,i.kt)("li",{parentName:"ul"},"Mutable reference, operator yang digunakan adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"&mut"),".")),(0,i.kt)("p",null,"Kita akan bahas garis besarnya saja pada chapter ini. Intinya, shared reference adalah data hasil peminjaman/borrowing yang hanya bisa dibaca. Sedangkan mutable reference adalah data hasil borrowing yang bisa diubah nilainya, yang jika ini dilakukan maka akan mengubah juga data pemilik sebenarnya."),(0,i.kt)("p",null,"Contoh berikut adalah salah satu penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut"),". Variabel slice ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers2")," dipinjam beberapa elemennya dengan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," ke variabel baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_e"),". Dengan operator tersebut maka borrowing menghasilkan data ",(0,i.kt)("em",{parentName:"p"},"mutable reference"),", data yang nilainya diperbolehkan untuk diubah meskipun data pinjaman."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut numbers2 = [12, 16, 8, 3];\nprintln!("===== before =====");\nprintln!("numbers2 : {:?}", numbers2);\n\nlet slice_e = &mut numbers2[..=2];\nslice_e[1] = 99;\n\nprintln!("===== after =====");\nprintln!("slice_e : {:?}", slice_e);\nprintln!("numbers2 : {:?}", numbers2);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(7858).Z,width:"457",height:"189"})),(0,i.kt)("p",null,"Bisa dilihat, indeks ke-1 ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_e")," diubah nilainya yang sebelumnya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"16")," menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"99"),". Setelah itu di-print, di output nilai variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers2")," juga ikut berubah. Hal ini karena perubahan data pada variabel mutable reference juga punya pengaruh ke variabel pemilik data sebenarnya (yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers2"),")."),(0,i.kt)("p",null,"O iya, penggunaan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," mengharuskan kita untuk tidak menuliskan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," pada variabel yang menampung nilai borrowing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// statement yang direkomendasikan\nlet slice_e = &mut numbers2[..=2];\n\n// statement yang TIDAK DIREKOMENDASIKAN dan akan memunculkan warning.\nlet mut slice_e = &mut numbers2[..=2];\n")),(0,i.kt)("h2",{id:"a145-perulangan-for-in-pada-slice"},"A.14.5. Perulangan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")," pada slice"),(0,i.kt)("p",null,"Slice merupakan tipe data yang implement trait Iterator (seperti array), dan semua data yang memiliki trait tersebut bisa digunakan pada perulangan. Slice ",(0,i.kt)("inlineCode",{parentName:"p"},"&[T]")," jika dipergunakan dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", tipe data penampung iterasi perulangan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),", bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yaa jadi jangan sampai keliru."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let scores1 = [7, 8, 9];\n\nfor score in &scores1[..] {\n print!("{:?} ", score);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(6760).Z,width:"462",height:"272"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Sangat dianjurkan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer")," jika menggunakan VSCode, agar lebih mudah melihat tipe data variabel dan informasi penting lainnya yang berguna dalam proses coding atau development."),(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator")))),(0,i.kt)("h2",{id:"a146-perulangan-for-in-pada-mutable-slice"},"A.14.6. Perulangan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")," pada mutable slice"),(0,i.kt)("p",null,"Sama seperti penggunaan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," pada shared slice, pada contoh kasus mutable slice perbedaannya hanyalah pada tipe data penampung iterasi yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut T"),", bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),"."),(0,i.kt)("p",null,"Pada contoh berikut kita coba eksperimen mengubah nilai elemen sebuah mutable slice yang data aslinya juga hasil dari peminjaman mutable slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut scores2 = [7, 8, 9];\nprintln!("(before) scores2 : {:?}", scores2);\n\nlet slice_f = &mut scores2[..];\n\nfor score in &mut slice_f[..] {\n *score += 1;\n}\n\nprintln!("(after) scores2 : {:?}", scores2);\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"scores")," dipinjam menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," ke variabel baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_f"),". Kemudian ",(0,i.kt)("inlineCode",{parentName:"p"},"slice_f")," dipinjam juga sebagai mutable slice pada perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),"."),(0,i.kt)("p",null,"Setelah di-increment nilainya menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"*score += 1")," bisa dilihat hasil akhirnya juga mengubah nilai variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"scores2")," yang merupakan ",(0,i.kt)("em",{parentName:"p"},"owner")," atau pemilik data sebenarnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"slice",src:n(4820).Z,width:"467",height:"376"})),(0,i.kt)("p",null,"Operasi increment pada ",(0,i.kt)("inlineCode",{parentName:"p"},"score")," tidak bisa dituliskan dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"score += 1")," karena tipe data score adalah pointer mutable reference (ditandai dengan adanya ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut"),"), untuk increment nilainya perlu di-",(0,i.kt)("em",{parentName:"p"},"dereference")," terlebih dahulu menggunakan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"*"),". Lebih jelasnya kita bahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),"."),(0,i.kt)("h2",{id:"a147-append-slice"},"A.14.7. Append slice"),(0,i.kt)("p",null,"Slice by default tidak mendukung operasi append. Sebenarnya bisa saja dilakukan tapi agak panjang caranya (silakan cari referensinya di Google untuk ini)."),(0,i.kt)("p",null,"Perlu diketahui, jika kebutuhannya adalah untuk menampung jenis data yang size-nya bisa bertamah, penulis anjurkan untuk menggunakan ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector")," yang beberapa bab lagi akan kita bahas."),(0,i.kt)("h2",{id:"a148-memory-management-pada-slice"},"A.14.8. Memory management pada slice"),(0,i.kt)("p",null,"Nantinya setelah selesai dengan pembahasan dasar memory management di Rust, kita akan bahas lagi topik slice tapi dari sudut pandang memory management pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/slice-memory-management"},"Memory Management \u279c Slice"),"."),(0,i.kt)("h2",{id:"a149-summary"},"A.14.9. Summary"),(0,i.kt)("p",null,"Catatan ringkas perihal slice:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Slice memiliki notasi ",(0,i.kt)("inlineCode",{parentName:"li"},"&[T]"),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"&")," di situ artinya adalah operasi borrowing/peminjaman"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," adalah tipe data tiap elemen"))),(0,i.kt)("li",{parentName:"ul"},"Slice bisa terbentuk dari hasil meminjam data array, vector, atau tipe data kolektif lainnya"),(0,i.kt)("li",{parentName:"ul"},"Data slice adalah selalu data pinjaman"),(0,i.kt)("li",{parentName:"ul"},"Slice memiliki lebar/size"),(0,i.kt)("li",{parentName:"ul"},"Slicing adalah cara pengaksesan slice menggunakan ",(0,i.kt)("em",{parentName:"li"},"range syntax")),(0,i.kt)("li",{parentName:"ul"},"Slice bisa immutable, bisa juga mutable (menggunakan ",(0,i.kt)("inlineCode",{parentName:"li"},"&mut"),")")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/slice"},"github.com/novalagung/dasarpemrogramanrust-example/../slice")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-03-slices.html#the-slice-type"},"https://doc.rust-lang.org/book/ch04-03-slices.html#the-slice-type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.slice.html"},"https://doc.rust-lang.org/std/primitive.slice.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/trait.Iterator.html"},"https://doc.rust-lang.org/std/iter/trait.Iterator.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/types/slice.html"},"https://doc.rust-lang.org/reference/types/slice.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/references.html"},"https://doc.rust-lang.org/nomicon/references.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/primitives/array.html"},"https://doc.rust-lang.org/rust-by-example/primitives/array.html"))))}A.isMDXComponent=!0},8493:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAAEACAIAAABapGodAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjdUMTY6MjA6MDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE0OjQzOjIzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE0OjQzOjIzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdlY2NjOGVmLWRjNjgtYTg0MS04ZjEwLTczODJlMjcxZWYwMSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3ZWNjYzhlZi1kYzY4LWE4NDEtOGYxMC03MzgyZTI3MWVmMDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3ZWNjYzhlZi1kYzY4LWE4NDEtOGYxMC03MzgyZTI3MWVmMDEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjdlY2NjOGVmLWRjNjgtYTg0MS04ZjEwLTczODJlMjcxZWYwMSIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yN1QxNjoyMDowMSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhFvIYUAACCESURBVHic7d1BbNtYmifwz/Y4nR4O0io47RgFQ1VEAE5l4N5tFrLIeHlwQxdPH3ghCjAQwAfefOdZJ595z00HAQ0YaLyLDoVcjPWBCAobNAcY71RDmFpWCUHB5Y1R2tpmT7qMxHsgKVHSo0RS5LNE/38oIGWaenx8lD89fqQ+rtTrdQIAgJKt3nYHAADuBERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBAhLVf/epXt90Hrocrz3+z9o/rN//eL2LNhyvPf7O2/beb//hrOX0gdf/gv2//v6+/+79Z2k9sau/pzs7Ozs4/PiymxRzbT7Xp9GvOaKWooUvXZn3P+JfP7v+vby7m3ELqfU91RIcrbd+bs29CzD5s6v7Bf32QdleKeS8tuL+73c2vfPFs9d7wx5vv/+3D/4gFxHu/TNtQ+jWXwfXFK3bWK3sr6v6B/E7Ehu42dV+p9bsnL93pq7kvT1yi+p6xe392i4IOXOKG6nuGIl28ejm1B+7XF8ausXdVekfre8bu1joREc0Y6KQ11f0DpVb+X90tR1siIvrp/R++nlj49uYPb9+nenn6NSGN4M++2DWrJ/W+1x9I1PcqNU71vadbdPFqZmTqnbGN/YOne/Xe7CCW/72k7u9u+UHoVPcPlCnhnb+mun+g0MXFNW3k234GixBtx8UmvINA/HDl+eOV73+4+fjRKhHR3z44/3rzHXfNcOUoIR2uSURE/7DyxePVeyMLhy38/MP7P3478fLpYh+VRNcXEwuDz091/0Ch4Sfp2I/ptnLfC18Q/XC1Zzyl1979XaU23FLYei3q0Ct21qP65JpXwy7uHhzsDhoYdj3e3ua7C2lra/36onu1oWytX1+8Ymc0ueboaMR+w51QcIdu2ghsXM2ceaQ7HKHBQAVLuYPsjoxnNKaezN137uEg2rgfG5KxTWc+i6knHLiR30RtBjPT1/Q0+EXUJ84enfXGRyl5Q0Tqk4lYGx/5kVF2v76Qd5+o1Es14UwznhMvlmvXF6/c4dY25Dr1OEPKW5NoY19+9+rkjPaMrYROzZwwp7eI0fbmj1+9n0gyENHKx49u/vzV+z89XHn+ePWfHr7/7i13zZUvHq8OQ2fMR49o9OUrXzxbvReE6Ycrzx+v/f4v77+kleeDl88Iu7GPSlL3D+TxhfW98ETqsq8omypR8Jdc2FxnfWtXvnh1ctKr7xm78l7dPaPgBO/krBdsfXdf7b28iq1J6v6Bsq+evGQ93nli74z1Js9ma1v3uyfdzQNFCf6V5TqdcdYMXh2OwsHmZRSuJwekxx26OaU+HERENWVkQNyXVwltRlmA+p6xu+V32VmPqMcbpYnDcRWFOSJSDg4UGnzSTR6jtG+HYIgnD1x97wm9PjnpUdDmYDq5vrW72++enLiDt8gGb494o8TfEBGpm7Xrq1ejsfbpYOQneuxdPd0dvPmn7NTM8XS5n0ob99evr7zgN+r+7tY60f0NIs6qvDVVOnvJiIjGCiFO26M5LMI9CQ/Wnj8L/lv5fOqKP35z86fo/6V/mLbmvUecpsZe/smnK/fo5vtg3vuWfiT66Nf0+a9XiT78729n97q+J9f63fHjoW4OF/bOvP76hlwn9+uL69qmGrxM3qCLr4s5iv3gj5963tX1+v0NUp9srfe98E3ZO3t9cV3bHF2T3Ms+SQ+yFdm8Dvt7nbbf6r5C0SBwBiRh6OaT+nAEvxgZkGiUJndks0b9S5coGOMZIzd2OHpn7OTk5KTbJ+p3T05OTk5OXrrcY6Tm3emB3tnLKBZFb4bA9cWrl+5gaY+/R9w3bZL6A4n8nyaiWeJe9H7yM7/jAuNv7ynqe8bBwYFC3ZPujPd3+jWLOC5jFmFuy83b5nfzP3+40R6tfvaMPqPRTMKojV+uENHHv1l7Hlv44Bdzbbv+QKJaOJEJXF9Q/AO+Lm/Q1evyUvHX7/iTtLj1hA//gqj7CnWjJFzCgKQ0khrYCk5ps5x7p9n61btrSroudfXumraCiVld3hhOjeaT5hhlNZbF6UebGvQ4PPGoc/aoLmc5RpzMSJCfDVqYPDxX766VUt9xgwk8EdX3DPIvkzaVes3pe5TbIkTbon337YfvviUi+t1v1z7+xeo/PXzPjbZX/3lDD2jsLojf/XbuzfOyPFG4rT8oN9iORFLO3wURlfPXPjASawMTA1LfS9lYlJtImbflmjwco/OZjfvr1++Stv+Tv7sVBaLrFNeFUklzjLJR93e3KMxOTL+tgbdHdcqSmuR/OkUXudT9g11jj+JHauP+eonvuKt313R99SqWJU/aWPo1iWjqHuW2CJmE0nj9mym//e7bm59p5eNPJl+y+ughEa38fuq1st5PfnSyUd8zwusOPe/quqbsT56C9Lyra+mBKm/4Xq7DFp7zhPmmBO5ln2ryXhBNgosCYycN6r5SG8x3rt5dTz1nzK6+ZwxzCESUMCDcoZtTtsMR67Fcu77ygh/GBznITpyEipng8I5R1pQK98CFZ/f1vadT3iHcPUoeJd6GpmcGrt5dj2+Sn3koSs+7ul7fehoMaHg0w40FSQMjHOtpa04zuUf5LeDcNn5t6sHa82f08w/v//iX9GuOXNr6+Yf3X74lesjd0s0fv/nw/PHa82fhzz9+8/7Lbz/ItbWPH689f0w/fvPhx8erUlI/3ZfdzfBko999dSE/JSLqnTHaM3YHp2WD05DemffkQNnqd8/Sj0Sod/ZaNnZ3Dw526fqie3GtJM5c3JcntH8Qu4gcTV0GJ4rx06JYuxO3KgTXdfrdk0vOZkYuYQ/WfHkV/KEPz0n73ZOXLm9AuEM3p/SHg7gDwhnk4JjFTrHHbseI73uGfnKOUTYTB879+kLeja7EXVxcbyW9Q/h7NOVNO74hInIv+4oSv81gNIsxtkd1eWN9+kVh/nspw2Aw2os6OfWsn7tmfOtbuwcHu9cXJ8ybtkdzWMFzyRZN0feuj9zbBBmMjdw8+Yycmyy5+Zx7lOFl+AZNXKUzCQDzGE2q1uWN9TLPiUUoZo96Z68vKDonnyL4xtlrhNrIAmYSgNa3wlNazApuUyw5QUQF3uXOM/zSQb+sTRS3R6m+JaY+2fILOwmvBGQSAABEQCYBAEAERFsAABEQbQEARFjYauJlyFAdPI2g/vNC1X6eWeK51DLb6euC1/eMf/nn/8Irnb1YVaUX8BDD8lq8ue0nn65GRWrWnj9b++LTgtsvru64+/Lk5NWFpByMfQ1H3R9+gaVUkxtyv76gYr8elkX6rQcVW15dFPc1nXIkHWKAHBb1DrAfv3n/5Vv6/MnaZ4/Wfv+X91++LaLREuqOx6oMLoSed/V0Vj3Rhd764lUoX7RDDEtrUaNt4E//58NnD1aJwi/pBiE4+P/oS7oTJcbT1x3nrzlZ1vbDn78almqcagGKPffOvCcH49VABZXZPuvN3Pq0Gzx5VaVHe8T9wmXWh6PU94zdLYpuZVb3D0YKvqZqEyCPxY62n/96lejmP/9K9PdJq0yUGOcu5Ncd5645LEb+yaer2iP6/t9ShlpajGLP5F72FTlev15cmW3e1tMXZuZXlVb3DwbVt4fLOBXKE/o5uWZQTe/pXr0XG+4MbQLks3h528BHj9eeP1v77BcfnK9GKiJO4pYYT193fHzNh3SPbt5eEhF995dpJcSyEFjsmYL06daTKNEousz26NYD+QszB1Wyxr78mX5AEtZ0X766oK0ne7GhyTrIAJkt6tz2x2/Ch9b8t0/fB8VqBXlLPz9e+eXfE/01fI7DT5keip5AXLFnojRPJymzzPbY1ucrzLxxf/Kb/OkrlCevGVS32vKjUrzzVT0HSGNRoy0R0dub77fp40crn3+b/ly+GB89Xnv+mGh05pufyGLPQTO89Om40spsT2x9jsLMSSE//YDw11T3dzeuuhcb8Ue0IlkL5VrUTEIgVtubKMwJzCjyPadPPl25Rx/+/NX7P3z1/g9f5bsX4laLPYfcy+hc+DbKbA+3Pt7f5A3y8To6pfOcAtK8NdV9pdb3ztxhLavZAwIwr8WrSvPJp6vao5Xw9oPgutbfPjj/erPxZO2zB0REP37zgR6vSlHhcN6NCvyF8a0krvntyu+frX4UWzPqSRZTbiHoX1xIW/e9k5cu/4GmvCv9EzcVDF415TI67/aBfvfVO/kpvU5ok/hbGawYPOM86jyvn5Nbnyg1PXaHxnD5FW/h2BPSZw1IsHikNxNr/vRkcBdCNOATN34U+jQqgMDiRdvb9fmTtc8eDG/5+t1v1z6mxOdIFq7Y8tXlVXJO00/UkQYYtch529sw+szdlV/+guhv4rZebPnq8r4okKafi/c1BYDbhbntuNFMQvID0ssxeoa+uNdtlqWfAIsD0RYAQITFvicBAKAqEG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABGFPONeabat2algtURssmmkzXSYiIt+1D4+dW+7OrRuOh9fJfFi1ZttSpZwvBlhOwqJtFfDCrGkzXY7/YhhIckeSiTYHC3M2O3xtjlcnvLhlGa3wQzRTX4iIyDk+dHK/OIfgoOBjEm4Vou0cTJvp5Lo+KYNFWvNI6drGsRP8tt3sZvz75rQZBovLjmHkid1as61T9FrTZrpttrLE2yCsRt3Ivke3T2seqZeeJ2/edkfgbksfbbVm+4henNasYKITzHJG8gPhD+c7bKfvbqqq5LudrqKrku8ah6dEFJsnDSZJnKmgabNG335BR8EvosWxNYs8/zRtpst52jPtRt82jqnZVocLg0kbERG1zj1drylEGWITt00yDfUy/w4rNcnvd8Mfun2favnaIXLeXFrK7NXym3wzcN91gbQHTmseqeTa5zWrUWbfAWbJdJVMUq1G3zYMw3Z9udHUEleU1dqp0fEkVQ/+Df9EZT14udHxZN02ici0gzmbYRi2u6m3ozYl1bJqp/Etac2jaE3DWIhUX8sqfpLHbdPckf3+ts1CtpmxzXNPUi3bpGAQJe887+CZO7LfPS1tYpvwZkj9ruMKYu2LZZuOQxVluyfB6wTBwDnt+lIteZrju6wV/3fs5dQ690jeITJ3ZK8TRk7n+NSTlIYWtWBbrfEtyTsZA00aLauc6G3aujy2//lo25skqbXz4HOm48nDD6V0WpZhdEhnjFlK186xr1qzzRhjTJe90/LCFufNEPwi4V2X6sCZBmItLIpbytsGJ7Ta9ibJOmP6YLnvhv8OplCDU/PjQ8VmwcqLf7VDa7Z12esYRfVyEIaoxdyGlS0/YdpM33Rtw3BMm1ms3cg6eoNjoDXbrL1dzuAnvxnyM21907WthX6rwN1xS9FWqUl+n4i4GdikOXN0uca0mdVu0sIGXK3ZtlQKJ+fzc95cWsq2lin/O9Kbhuy79rFDRC3LIJvphklOrr45p90jNWMqOovJN0PGvMEoc0cmiSzGrGiJxZiBW87glhTw7YbNbY0oyLpJ6V6hNRuy3z0l57TrhwncLLp9P+MrpjHtHLnQZFGonfgsCE7HMyYBiChMvBphD00jlnlN2+bw/NvckWlwzSxzl0Y2zpd7NzO/GWYfuJZlDHU88l17MVL+cDfNObd1jl802pbFmEW+23F9vTZt7cGJ4iAVcHxIzbY1OH1MThHEb0ggKvAcPb94l1SLMct3jcM3hipFPxNRbJec0+6RqkrTZ4acNu3D45Zlbw9GKT7/S9OmE0vB0OgQZ+5SintBMrepM6YH7fLeDFO3BbBUVur1+m33YTkE96XNk74I86eFZkDmbHPuLnG+IljGbgJUAL7dIERwn3GxV/fmbHMBuwRQaZjbpoU6CaPmqpMAcAch2gIAiICKiwAAIiDaAgCIgGgLACDC0lcTT33xCld1AOA2VeEOsIkwyy3oPVf1ayIqp3A4ANwVFcwkxAr35SiYldgoYzt9N/6V4bBweLHbAYCqqlw18bAISzifZW7DUhoaOTMyDDOmpmUUDgeAu6Vy1cSVmjQo1xgUyplWiDelMgqHA8DdUtFq4kElKp06RseLipQlKKCaeGGFwwGguqpYTVxSLcsLH3uoNdt0eV7mvLTowuEAUE2Vqybe7fvkdweVvEcegVi8gguHA0B1Va6auHPa9SX1KEgAhxuaOuvMX008sXA4AMCE6lUTd4I2g3LeBZXrylg4HABgwtLXAMtY5Lusr7QBAExXwW83AAAsoCp8c1dSw1RG2joJojoGADCw9JkEAIClgEwCAIAIiLYAACIg2gIAiIBq4gAAIlThngRemJ2o/F1GNfHBQiJCEAeAqaoQbceZNtPJdf3EggtFtak120HBSARZAJilctXE+ZW/p8hdTZxMQ73EfBYA0qlcNfFSKn9z2zR3ZL+/bbNQrsI2AHBnVLSaeAZ5q4lr25skqbVzA08mA4AUqlhNXJzBR0XwBDQ8mQwAElWumrgwzptLS9nWEF8BIJXKVRPPLHc18da5J6lG+ELTUCXvHBfMACBJ9aqJcyp/z5134LfZsuztQedxty0ATLX0NcBQTRwAlgLqJAAAiFCF75KhmjgALL6lzyQAACwFZBIAAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAR5n3mrtZsW6pEROR1DKsV+41pM12e8RzcZTJ8Zm9Fdir2EOKxQ5dC8nEHAL55o61zfOgEf3u1Irqz2HhhduJDZRiHcgci7gfVPMFx+NrYq1uW0cp96IQdd27XAZbRvNE2WfDHXGmmzXRyXZ+UwSKteaR0bePYCX7bbnYzToM5bYYR/LJj5BpRrdnWKXqtaTPdNlvLE7SGbyOt2bayjyfAwsgUbWPTtqnzjMTTzNhEJZq6pZ8KxtYs8lzetJku55k1mXajbxvH1Gyrw4XBnI+IiFrnnq7XFKIMHeW2SaahXuaf1ik1ye93wx+6fZ9q+dpJY/Joas32Eb04rVnBgY8PdMaRd95cWsrs1QAWVYZoqzWPUv7R808zTZvpm24w7xsus6I2Z0xdtKZBLwzDoWDNo6bm3PIkp2UdEhFppbdp7sh+v28zli+R0Dr3dN2yTcdqac0jVfI6ZU1seUeTiCTVari2YThas201mlor34Ezd2S/a2NiC0sr4z0J8o6Zc0NasyH77ovRPzRzR/Y6Yehwjk89SWkkBS/n2Ipe65x2falW1DSnZRlGGelA09Zl32XzN6xtb5Kk1s4NwzAMo+PJeruZKcS3LMPokM4Ys5SuXV7qk3M0g194neAzdOzApRx5rdlmjDGmy94psgiwxDLMbZ3jQ8VmOmN6nlN5pSbR5ZvRl2jbmyQHDYZ8N7GBeBqDiLwsGxdOa7Z12esYRUWHQRSjFnMbVrb8RHRSYTimzSzWbpRzS0Wmo5nBIDmjNdusvV2J+0HgTsp2lSy6ZGHazGo3Kcv7PilhmPK82LQtlaI0xILfAqE125ZKrl3QJNJ5c2kp21qm/O9Ibxqy79rHDhG1LINsphsmOeVMcCePZoGJFue0e6RmTIQDLI58327o9v2sL3FOu76s2+asZVOEU2OteRSb487NtBljqfswUxRqJz6JghPijEkAIiJqnXuSaoQ9NA1V8s6Hl+lTtTk8fTd3ZBpeM0vYgXz9zHg0s4/8yK4DLJ30c9vRM/nwLDm+UGdMJ69jWF3ewpZzfEjNthWdaQa5iNFlUxIULeY2rPA01XNdX61l39eCxfddtRizfNc4fGOoUvQzEcV2yTntHqmqNH1uxmnTPjxuWfb2YJTi08c0bcYTQJQiB5S5n8NDzDuaU7aUxsi7DvfbwlJbqdfrt92H5WDarNGfK2kY5k8LzTvO3abWbFu104n79IruJwCU9+0GiAluNC72K7/L0iYAENHizW3jX9SMWYBzSNRJAIB5LFq0BQCoJlRcBAAQAdEWAEAERFsAABGWvpp46otXuCgEALepCtXEJ8Ist4rjXMWziaicwuEAcFeUl0loWYZh3MadUmHdv5wFsxIbZWyn78a/sBwWDi92OwBQVZWrJh4WYQnns8xtWEpDI2dGhmHGpssoHA4Ad0vlqokrNcnvnjqD1iWi+cNgGYXDAeBuqWg18aCQlU4do+PR5va0MFlANfHCCocDQHVVsZq4pFqWFz72UGu26fK8zBP8oguHA0A1Va6aeLfvk98dVPIeeQRi8QouHA4A1VW5auLOadeX1KPgBgGt2ZAHWdwE+auJJxYOBwCYkL4qzUQ18ejS1kjoG68mHl95ZG3OPQkz7jUY3rvguptqVJOVV3Z2uC73VtzRcq5p7kmY2E3fNQ7fjJcrq0htMAAoxdLXAMtY5JtTPBsAQADUSQAAEGHRnt2Qp5q4FDwFLH2dhPm7CQCQ0dJnEgAAlgIyCQAAIiDaAgCIgGgLACACqokDAIhQyWrixIv1JVQTHywkIgRxAJiqvDvAopoK4pk208l1fZpaJqyANrVmOyhcjiALALNUrpo4v/L3FLmriZNppKz3CwBQvWripVT+5rZp7sh+v28zhkQCAMxW0WriGeStJq5tb5Kk1s4NPJkMAFKoYjVxcQYfFcET0PBkMgBIVLlq4sI4by4tZVtDfAWAVCpXTTyz3NXEW+eepBrhC01Dlbxz5G0BIEn6ue1ENfHxWuA6Y/pENfHBwpZzfEjNthXlDYJcxOiyKQmKFnMbVph08FzXV2tp+qlajFkFfMOC32bLsrcHncdFMgCYaulrgKGaOAAsBdRJAAAQAdXEAQBEWPpMAgDAUkAmAQBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEAHRFgBABERbAAAREG0BAERAtAUAEGHeZ+5qzbalSkSTj8U1babLM56Dm207tdMpD94t3fCZvYXtVJ6NT336MF/yMQIAceaNts7xoRPGwiK6s9h4YZb7oTJPcIw/433w6pZltHIPs7hjNIzrCOwA4+aNtsmCAFFpps10cl2flNhCrdm21MuOkWvvtWZbp+i1ps1022wtTdDSmkdK1zaOnaDr7WZX9CkAwCLLFG1jU5epc5fEU9fYvC2aDmaaDg1eX+DMybSZLudpz7Qbfds4pmZbjS811Mv8nVNqkt/vhj90+z7V8rWTxuTIa832Eb04rVmTg5xmlII5NBERtc49Xa8pRIi2AJEMV8m05pF62TFCM/7sDMOwXX9kqWkzfdO1w9cH0x7TtqI2bXdTbze1KR2Q9UbfNgzD6Hiybpvpe16OlsWZupk7st/ftlkoay9b556kWrZJwXBL3nlZE9uEkZdUKxhk2/XlxtTDAQCZZLwnQd7JG+S0ZkP23Rej8cnckb1OGLed41NPUhpT/r69ThjeWufeHD0Z07JmfHZkoW1vkqTWzoNPlI4nz/gA4famQzpjzFK6dnmpT87IB7+IBtk57fpSbZAiyTZKpq3LvsuWJQUCIESGTIJzfKjYTGdMz3NZXqlJdPlm9CXa9ibJQYMh303VWMnn2PMZRDFqMbdhZTufHpwAOKbNLNZulHP7Q+6RT9N2s63LXsdAzhZgRLarZNGVL9NmVrtJWQJBUoDMlYEdSW8uEufNpaVsa3nzlcEJgH3sEFHLMshmumGSU84ccXLkC8gbaM22pZJrL82lPQBh8n27odv3Z680yjnt+uPZVt6yFLRmQ/a7pwVNnUw7R341Uevck1QjbM00YplXrdlmjM1OLAxP380dmaZ/qKRtc0LmkU81SlGoxa0IABzp57bxGxKIwjPF+EKdMZ28jmF1eQtbzvEhNdtWdPYa5CJGl81IUAxOfW/h6wUc8X1XLcYs37UPj1uWvT3Yo/j00TntHqmqNDWxEE/WUIr9TNMm/xi1eCOfbr8TmYYqUTgW6foPcJes1Ov12+7DcjBt1ujPFT3CnGz+JjhfqJu7TQAQpLxvN0BMcKNwsXO9MtoEgNIs2tw2/r3VmAX4Hujy1kkAgEWwaNEWAKCaUHERAEAERFsAABEQbQEARFj6auKpL17hQhMA3KYqVBOfCLPcKo5zFeQmohIKhwPAHVLBauJhLUGrVWRR6+ILhwPA3VK5auJhYZdwPsvchqU0NHJmZBhmbLqMwuEAcLdkiLZhNfEU0YWfXoiKCY6ehw/moVqzbU2fh8p6w7UNw5n6CBmlJg0q1pi2pUpE8z9DoGUdEo3XyDJ3ZL/ftxlDIgEAZqtoNfGgOJZOHaPj0eb2tBpZeauJz104HADulCpWE5dUy/LCbKrWbNPleVlfs52rcDgA3CmVqybe7fvkdwfVrMurOz5n4XAAuGMqV03cOe36knoUnNSnqTueu5p4cuFwAIAJ6avSTFQTjy5tDReGy7u8ha2xJjj3JExLUCSuxis7O1yZeyvu6Lck0tyTMLGbYbuZbqgAgDtt6WuAZSzynfidNACAUqFOAgCACIv27IY81cSl4ElY6eskzN9NAICMlj6TAACwFJBJAAAQAdEWAEAERFsAABFQTRwAQIRKVhMnXqyfs5p4/GYJhGsAyKyC1cT5lb/nojXbOkVVw6fVewQASFC5auIJlb9ntDlj0yO1baYXIAMA4KpcNXF+5e85tc49Xbds07FaWvNIlbwOJrYAkE1Fq4lnkKqaeMsyjA7pjDFL6drI2gJAZlWsJl6CaF5uOKbNLNZuFHSrBQDcGZWrJl6G8MmSxw4RtSyDbKYbJjmY4AJAepWrJp5ZymriUi26w8HckUlkrAeASkg/t52oJj5eC1xnTJ+oJj5Y2HKOD6nZtqK8QZCLGF02I0ExSDpMXS3eJdVizJr/GxbxHMrMXgIA8Cx9DTBUEweApYA6CQAAIqCaOACACEufSQAAWArIJAAAiIBoCwAgAqItAIAIiLYAACIg2gIAiIBoCwAgAqItAIAIiLYAACIg2gIAiIBoCwAgAqItAIAI/x+K0xtQhqLb3AAAAABJRU5ErkJggg=="},2462:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/slice-2-f573e34bdab45ca8821163ae546a42ba.png"},7858:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAAC9CAIAAABXmRFFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDRUMTI6NTI6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE0OjQxOjMzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE0OjQxOjMzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU4MzM3NjM1LTc5MGEt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"},6760:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/slice-5-541f1e4111281ebbac474d8d9828c0e8.png"},4820:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/slice-6-393c62bd8cdd9da05fcae56436a3cacd.png"}}]); \ No newline at end of file diff --git a/assets/js/68e1906b.57a9a7b8.js b/assets/js/68e1906b.57a9a7b8.js new file mode 100644 index 00000000..ff557937 --- /dev/null +++ b/assets/js/68e1906b.57a9a7b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4758],{3905:(e,a,t)=>{t.d(a,{Zo:()=>o,kt:()=>c});var n=t(7294);function r(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function i(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(r[t]=e[t]);return r}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=n.createContext({}),m=function(e){var a=n.useContext(p),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},o=function(e){var a=m(e.components);return n.createElement(p.Provider,{value:a},e.children)},u={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},s=n.forwardRef((function(e,a){var t=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,o=d(e,["components","mdxType","originalType","parentName"]),s=m(t),c=r,A=s["".concat(p,".").concat(c)]||s[c]||u[c]||i;return t?n.createElement(A,l(l({ref:a},o),{},{components:t})):n.createElement(A,l({ref:a},o))}));function c(e,a){var t=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var i=t.length,l=new Array(i);l[0]=s;var d={};for(var p in a)hasOwnProperty.call(a,p)&&(d[p]=a[p]);d.originalType=e,d.mdxType="string"==typeof e?e:r,l[1]=d;for(var m=2;m{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>m});var n=t(7462),r=(t(7294),t(3905));const i={sidebar_position:25,title:"A.25. Method",sidebar_label:"A.25. Method"},l=void 0,d={unversionedId:"basic/method",id:"basic/method",title:"A.25. Method",description:"Pada chapter ini kita akan belajar tentang method beserta perbedaannya dengan associated function.",source:"@site/docs/basic/method.md",sourceDirName:"basic",slug:"/basic/method",permalink:"/basic/method",draft:!1,tags:[],version:"current",sidebarPosition:25,frontMatter:{sidebar_position:25,title:"A.25. Method",sidebar_label:"A.25. Method"},sidebar:"tutorialSidebar",previous:{title:"A.24. Associated Function",permalink:"/basic/associated-function"},next:{title:"A.26. Enum",permalink:"/basic/enum"}},p={},m=[{value:"A.25.1. Method vs associated function",id:"a251-method-vs-associated-function",level:2},{value:"A.25.2. Deklarasi method",id:"a252-deklarasi-method",level:2},{value:"\u25c9 Naming convention method",id:"-naming-convention-method",level:3},{value:"A.25.3. Method parameter",id:"a253-method-parameter",level:2},{value:"A.25.4. Struct property mutability via method",id:"a254-struct-property-mutability-via-method",level:2},{value:"A.25.5. Generic pada method",id:"a255-generic-pada-method",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:m};function u(e){let{components:a,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},o,i,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Pada chapter ini kita akan belajar tentang method beserta perbedaannya dengan ",(0,r.kt)("em",{parentName:"p"},"associated function"),"."),(0,r.kt)("h2",{id:"a251-method-vs-associated-function"},"A.25.1. Method vs ",(0,r.kt)("em",{parentName:"h2"},"associated function")),(0,r.kt)("p",null,"Method adalah ",(0,r.kt)("em",{parentName:"p"},"associated item")," yang hanya bisa diakses lewat instance/object, berbeda dengan ",(0,r.kt)("em",{parentName:"p"},"associated function")," yang pengaksesan fungsinya via tipe data struct."),(0,r.kt)("p",null,"Silakan lihat ilustrasi kode berikut, lalu pelajari penjelasan di bawahnya untuk mencari tau perbedaan ",(0,r.kt)("em",{parentName:"p"},"associated function")," vs method."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"struct Car {\n // ...\n}\n\nimpl Car {\n // ...\n}\n\n// associated function\nlet my_car: Car = Car::new();\n\n// method\nlet info: String = my_car.info();\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fungsi ",(0,r.kt)("inlineCode",{parentName:"li"},"new")," di situ adalah ",(0,r.kt)("em",{parentName:"li"},"associated function")," milik struct ",(0,r.kt)("inlineCode",{parentName:"li"},"Car"),". Dengannya object baru bernama ",(0,r.kt)("inlineCode",{parentName:"li"},"my_car")," bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"Car")," dibuat."),(0,r.kt)("li",{parentName:"ul"},"Object ",(0,r.kt)("inlineCode",{parentName:"li"},"my_car")," adalah variabel bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"Car"),". Via object tersebut method bernama ",(0,r.kt)("inlineCode",{parentName:"li"},"info")," diakses."),(0,r.kt)("li",{parentName:"ul"},"Method ",(0,r.kt)("inlineCode",{parentName:"li"},"info")," tidak bisa diakses via struct ",(0,r.kt)("inlineCode",{parentName:"li"},"Car"),". Dan ",(0,r.kt)("em",{parentName:"li"},"associated function")," ",(0,r.kt)("inlineCode",{parentName:"li"},"new")," juga tidak bisa diakses dari instance/object ",(0,r.kt)("inlineCode",{parentName:"li"},"my_car"),".")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Di bahasa pemrograman lain, ",(0,r.kt)("em",{parentName:"p"},"associated function")," disebut dengan ",(0,r.kt)("strong",{parentName:"p"},"class method"),", sedangkan method disebut dengan ",(0,r.kt)("strong",{parentName:"p"},"instance method"))),(0,r.kt)("p",null,"Pengaksesan ",(0,r.kt)("em",{parentName:"p"},"associated function")," dilakukan menggunakan notasi path dengan separator ",(0,r.kt)("inlineCode",{parentName:"p"},"::"),", contohnya seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"Car::new()"),". Sedangkan pengaksesan method menggunakan separator ",(0,r.kt)("inlineCode",{parentName:"p"},"."),", contoh: ",(0,r.kt)("inlineCode",{parentName:"p"},"my_car.info()"),"."),(0,r.kt)("p",null,"Agar lebih jelas, mari lanjut ke bagian praktik. Siapkan package dengan struktur seperti berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2514\u2500\u2500\u2500 models.rs\n")),(0,r.kt)("p",null,"Buka file ",(0,r.kt)("inlineCode",{parentName:"p"},"models.rs"),", isi dengan deklarasi struct ",(0,r.kt)("inlineCode",{parentName:"p"},"Car")," berikut diikuti dengan blok kode ",(0,r.kt)("inlineCode",{parentName:"p"},"impl")," untuk associated items-nya."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"#[derive(Debug)]\npub struct Car {\n brand: String,\n model: String,\n manufacture_year: i32\n}\n\nimpl Car {\n // ...\n}\n")),(0,r.kt)("h2",{id:"a252-deklarasi-method"},"A.25.2. Deklarasi method"),(0,r.kt)("p",null,"Cara deklarasi method mirip dengan ",(0,r.kt)("em",{parentName:"p"},"associated function"),", perbedaannya adalah parameter pertama harus diisi dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," pada deklarasi method. Parameter tersebut menjadi identifier apakah fungsi merupakan ",(0,r.kt)("em",{parentName:"p"},"associated function")," atau ",(0,r.kt)("em",{parentName:"p"},"method"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Object ",(0,r.kt)("inlineCode",{parentName:"p"},"self")," merupakan representasi dari ",(0,r.kt)("em",{parentName:"p"},"current instance")," atau ",(0,r.kt)("em",{parentName:"p"},"current object"),"."),(0,r.kt)("p",{parentName:"blockquote"},"Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," artinya kita melakukan operasi ",(0,r.kt)("em",{parentName:"p"},"borrowing")," terhadap object ",(0,r.kt)("inlineCode",{parentName:"p"},"self"),"."),(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai borrowing dibahas pada chapter terpisah.")),(0,r.kt)("p",null,"Silakan tambahkan ",(0,r.kt)("em",{parentName:"p"},"associated function")," bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"new")," dan method bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"info")," berikut. Tulis keduanya dalam blok kode ",(0,r.kt)("inlineCode",{parentName:"p"},"impl"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},'// ...\n\nimpl Car {\n \n pub fn new(brand: String, model: String) -> Self {\n Self { brand, model, manufacture_year: 0 }\n }\n\n pub fn info(&self) -> String {\n if self.manufacture_year == 0 {\n format!("{} model {}", self.brand, self.model)\n } else {\n format!(\n "{} model {}, manufactured at {}",\n self.brand,\n self.model,\n self.manufacture_year\n )\n }\n }\n}\n')),(0,r.kt)("p",null,"Bisa dilihat, deklarasi method adalah mirip dengan fungsi biasa, perbedaannya ada pada deklarasi parameter pertama fungsi yang diisi dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"&self"),"."),(0,r.kt)("p",null,"Cara mengakses property milik ",(0,r.kt)("em",{parentName:"p"},"current object")," dari dalam method adalah menggunakan keyword ",(0,r.kt)("inlineCode",{parentName:"p"},"self"),", contohnya seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"self.brand"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"self.model"),", dan ",(0,r.kt)("inlineCode",{parentName:"p"},"self.manufacture_year"),", pemanggilan ketiganya adalah mengarah ke value property milik ",(0,r.kt)("em",{parentName:"p"},"current object")," (",(0,r.kt)("inlineCode",{parentName:"p"},"self"),")."),(0,r.kt)("p",null,"Selanjutnya panggil keduanya di fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod models;\n\nfn main() {\n let car = models::Car::new(\n String::from("Mercedes-Benz"),\n String::from("Vision Gran Turismo")\n );\n println!("car: {:?}", car);\n\n let info = car.info();\n println!("info: {:?}", info);\n}\n')),(0,r.kt)("p",null,"Bisa dilihat, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"car")," adalah instance dari struct ",(0,r.kt)("inlineCode",{parentName:"p"},"models::Car"),", dibuat menggunakan ",(0,r.kt)("em",{parentName:"p"},"associated function")," ",(0,r.kt)("inlineCode",{parentName:"p"},"models::Car::new"),". Dari variabel tersebut kemudian diakses method ",(0,r.kt)("inlineCode",{parentName:"p"},"info"),"."),(0,r.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(2693).Z,width:"626",height:"110"})),(0,r.kt)("h3",{id:"-naming-convention-method"},"\u25c9 ",(0,r.kt)("em",{parentName:"h3"},"Naming convention")," method"),(0,r.kt)("p",null,"Sesuai anjuran di ",(0,r.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", snake case digunakan dalam penamaan method. Contoh:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"impl NamaStruct {\n\n fn nama_method(&self) {\n // ...\n }\n}\n")),(0,r.kt)("h2",{id:"a253-method-parameter"},"A.25.3. Method parameter"),(0,r.kt)("p",null,"Ok, penulis rasa sudah cukup jelas perihal perbedaan ",(0,r.kt)("em",{parentName:"p"},"associated function")," dengan method. Sekarang, bagaimana dengan method yang ada parameternya? Cara deklarasinya adalah cukup dengan menuliskan parameter yang diinginkan setelah ",(0,r.kt)("inlineCode",{parentName:"p"},"&self"),"."),(0,r.kt)("p",null,"Lanjut ke praktik berikutnya. Silakan buat method baru bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"congratulate")," yang memiliki 1 buah parameter bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),", dengan tugas adalah menampilkan pesan selamat."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},'// ...\n\nimpl Car {\n \n // ...\n \n pub fn congratulate(&self, name: String) {\n println!("hello {}", name);\n println!("congrats with your new car {}", self.info());\n println!("vroooom vroooooooommmmm!");\n }\n}\n')),(0,r.kt)("p",null,"Dalam method ",(0,r.kt)("inlineCode",{parentName:"p"},"congratulate")," ada statement pemanggilan method ",(0,r.kt)("inlineCode",{parentName:"p"},"info"),", yang return value-nya ikut di-print. Notasi ",(0,r.kt)("inlineCode",{parentName:"p"},"self.nama_method()")," digunakan untuk pemanggilan method dari dalam method. Mirip seperti pemanggilan property yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"self.nama_property"),"."),(0,r.kt)("p",null,"Selanjutnya, panggil method ",(0,r.kt)("inlineCode",{parentName:"p"},"congratulate")," di fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),". Isi argumen pemanggilan method dengan sebuah ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'// ...\n\nfn main() {\n let car = models::Car::new(\n String::from("Mercedes-Benz"),\n String::from("Vision Gran Turismo")\n );\n\n car.congratulate(String::from("Sylvanas Windrunner"));\n}\n')),(0,r.kt)("p",null,"Meskipun pada definisi method parameter pertama adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"&self"),", pada saat pemanggilan method yang menjadi parameter pertama adalah parameter setelah ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"name"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(1460).Z,width:"487",height:"128"})),(0,r.kt)("h2",{id:"a254-struct-property-mutability-via-method"},"A.25.4. Struct property mutability via method"),(0,r.kt)("p",null,"Nilai property struct bisa diubah dari dalam method. Pada bagian ini kita akan buat method baru untuk struct ",(0,r.kt)("inlineCode",{parentName:"p"},"Car")," dengan nama ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year"),". Method ini bertugas untuk melakukan perubahan nilai property ",(0,r.kt)("inlineCode",{parentName:"p"},"manufacture_year"),"."),(0,r.kt)("p",null,"Silakan tulis kode berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"// ...\n\nimpl Car {\n \n // ...\n \n pub fn set_manufacture_year(&self, year: i32) {\n self.manufacture_year = year\n }\n}\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(2653).Z,width:"678",height:"195"})),(0,r.kt)("p",null,"Hmm, tapi kenapa terdeteksi error? Penyebabnya error tersebut adalah karena ",(0,r.kt)("strong",{parentName:"p"},"mutable reference")," tidak digunakan dalam pengaksesan current object yang padahal ada operasi ",(0,r.kt)("em",{parentName:"p"},"mutable")," atau perubahan nilai terhadap property di situ. Syntax ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," artinya operasi peminjaman object ",(0,r.kt)("inlineCode",{parentName:"p"},"self")," adalah ",(0,r.kt)("em",{parentName:"p"},"read only"),"."),(0,r.kt)("p",null,"Cara mengambil mutable reference dari object ",(0,r.kt)("inlineCode",{parentName:"p"},"self")," adalah dengan menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"&mut self"),". Cara tersebut kurang lebih sama seperti pengambilan mutable reference dari variabel biasa."),(0,r.kt)("p",null,"Ok, sekarang kita coba modifikasi deklarasi method ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year")," menjadi seperti berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"// ...\n\nimpl Car {\n \n // ...\n \n pub fn set_manufacture_year(&mut self, year: i32) {\n self.manufacture_year = year\n }\n}\n")),(0,r.kt)("p",null,"Lalu panggil method ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year")," di fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'// ...\n\nfn main() {\n let mut car = models::Car::new(\n String::from("Mercedes-Benz"),\n String::from("Vision Gran Turismo")\n );\n\n let info = car.info();\n println!("info: {:?}", info);\n\n car.set_manufacture_year(2013);\n let detailed_info = car.info();\n println!("detailed info: {:?}", detailed_info);\n}\n')),(0,r.kt)("p",null,"Jalankan program, lihat hasilnya."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(7797).Z,width:"570",height:"109"})),(0,r.kt)("p",null,"Setelah ",(0,r.kt)("inlineCode",{parentName:"p"},"manufacture_year")," di-set, method ",(0,r.kt)("inlineCode",{parentName:"p"},"info")," mengembalikan pesan yang berbeda. Dari sini bisa disimpulkan bahwa method ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year")," sukses menjalankan tugasnya untuk mengubah property ",(0,r.kt)("inlineCode",{parentName:"p"},"manufacture_year"),"."),(0,r.kt)("h2",{id:"a255-generic-pada-method"},"A.25.5. Generic pada method"),(0,r.kt)("p",null,"Pembahasan mengenai generic pada method ada pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/generics#a366-generics-method"},"Generics"),"."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/method"},"github.com/novalagung/dasarpemrogramanrust-example/../method")),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-03-method-syntax.html"},"https://doc.rust-lang.org/book/ch05-03-method-syntax.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.impl.html"},"https://doc.rust-lang.org/std/keyword.impl.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.SelfTy.html"},"https://doc.rust-lang.org/std/keyword.SelfTy.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.self.html"},"https://doc.rust-lang.org/std/keyword.self.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/fn/methods.html"},"https://doc.rust-lang.org/rust-by-example/fn/methods.html"))))}u.isMDXComponent=!0},2693:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnIAAABuCAIAAAAsx2kLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTY6NDg6NDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDIwOjIzOjE0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDIwOjIzOjE0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk5OTM0ZWRlLTFhYzct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"},1460:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAecAAACACAIAAAC+6TZVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTc6MTQ6MTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDIwOjI1OjI5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDIwOjI1OjI5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmNmNTY4MDdjLWVmNGYtZTM0My1hZGM5LWY4M2UzYTA0NTExYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxNmEzNjA4OC1kZjM3LTExNDYtYjM4NS0yZjYyZGE5OGU5Y2QiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxNmEzNjA4OC1kZjM3LTExNDYtYjM4NS0yZjYyZGE5OGU5Y2QiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOmFjYTJjOGRhLTkwMTAtMjU0OC1iNTgyLWI1ODM1YzlhZWE0NjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE2YTM2MDg4LWRmMzctMTE0Ni1iMzg1LTJmNjJkYTk4ZTljZCIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yOVQxNzoxNDoxOCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjZjU2ODA3Yy1lZjRmLWUzNDMtYWRjOS1mODNlM2EwNDUxMWEiIHN0RXZ0OndoZW49IjIwMjItMTAtMjlUMjA6MjU6MjkrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5PD9NSAAATcklEQVR42u2du27dRhCG/SSSggBGDLhJasetK0dpUrhQABVCSgUBBFiVCnV+BT2CnuL0eqicw+teZpaz5JKHPOf7YcASteReuPw4HC5n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"},2653:(e,a,t)=>{t.d(a,{Z:()=>n});const n=t.p+"assets/images/method-3-2b2f604aaaa2cd04220b106aec22800d.png"},7797:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAABtCAIAAAAnPlzxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTk6NTE6NDIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDIwOjIyOjIwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDIwOjIyOjIwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFjYTJjOGRhLTkwMTAt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"}}]); \ No newline at end of file diff --git a/assets/js/68e1906b.f87d9410.js b/assets/js/68e1906b.f87d9410.js deleted file mode 100644 index ea4711ed..00000000 --- a/assets/js/68e1906b.f87d9410.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4758],{3905:(e,a,t)=>{t.d(a,{Zo:()=>o,kt:()=>c});var n=t(7294);function r(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function i(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(r[t]=e[t]);return r}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=n.createContext({}),m=function(e){var a=n.useContext(p),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},o=function(e){var a=m(e.components);return n.createElement(p.Provider,{value:a},e.children)},u={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},s=n.forwardRef((function(e,a){var t=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,o=d(e,["components","mdxType","originalType","parentName"]),s=m(t),c=r,A=s["".concat(p,".").concat(c)]||s[c]||u[c]||i;return t?n.createElement(A,l(l({ref:a},o),{},{components:t})):n.createElement(A,l({ref:a},o))}));function c(e,a){var t=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var i=t.length,l=new Array(i);l[0]=s;var d={};for(var p in a)hasOwnProperty.call(a,p)&&(d[p]=a[p]);d.originalType=e,d.mdxType="string"==typeof e?e:r,l[1]=d;for(var m=2;m{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>m});var n=t(7462),r=(t(7294),t(3905));const i={sidebar_position:25,title:"A.25. Method",sidebar_label:"A.25. Method"},l=void 0,d={unversionedId:"basic/method",id:"basic/method",title:"A.25. Method",description:"Pada chapter ini kita akan belajar tentang method beserta perbedaannya dengan associated function.",source:"@site/docs/basic/method.md",sourceDirName:"basic",slug:"/basic/method",permalink:"/basic/method",draft:!1,tags:[],version:"current",sidebarPosition:25,frontMatter:{sidebar_position:25,title:"A.25. Method",sidebar_label:"A.25. Method"},sidebar:"tutorialSidebar",previous:{title:"A.24. Associated Function",permalink:"/basic/associated-function"},next:{title:"A.26. Enum",permalink:"/basic/enum"}},p={},m=[{value:"A.25.1. Method vs associated function",id:"a251-method-vs-associated-function",level:2},{value:"A.25.2. Deklarasi method",id:"a252-deklarasi-method",level:2},{value:"\u25c9 Naming convention method",id:"-naming-convention-method",level:3},{value:"A.25.3. Method parameter",id:"a253-method-parameter",level:2},{value:"A.25.4. Struct property mutability via method",id:"a254-struct-property-mutability-via-method",level:2},{value:"A.25.5. Generic pada method",id:"a255-generic-pada-method",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:m};function u(e){let{components:a,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},o,i,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Pada chapter ini kita akan belajar tentang method beserta perbedaannya dengan ",(0,r.kt)("em",{parentName:"p"},"associated function"),"."),(0,r.kt)("h2",{id:"a251-method-vs-associated-function"},"A.25.1. Method vs ",(0,r.kt)("em",{parentName:"h2"},"associated function")),(0,r.kt)("p",null,"Method adalah ",(0,r.kt)("em",{parentName:"p"},"associated item")," yang hanya bisa diakses lewat instance/object, berbeda dengan ",(0,r.kt)("em",{parentName:"p"},"associated function")," yang pengaksesan fungsinya via tipe data struct."),(0,r.kt)("p",null,"Silakan lihat ilustrasi kode berikut, lalu pelajari penjelasan dibawahnya untuk mencari tau perbedaan ",(0,r.kt)("em",{parentName:"p"},"associated function")," vs method."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"struct Car {\n // ...\n}\n\nimpl Car {\n // ...\n}\n\n// associated function\nlet my_car: Car = Car::new();\n\n// method\nlet info: String = my_car.info();\n")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Fungsi ",(0,r.kt)("inlineCode",{parentName:"li"},"new")," disitu adalah ",(0,r.kt)("em",{parentName:"li"},"associated function")," milik struct ",(0,r.kt)("inlineCode",{parentName:"li"},"Car"),". Dengannya object baru bernama ",(0,r.kt)("inlineCode",{parentName:"li"},"my_car")," bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"Car")," dibuat."),(0,r.kt)("li",{parentName:"ul"},"Object ",(0,r.kt)("inlineCode",{parentName:"li"},"my_car")," adalah variabel bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"Car"),". Via object tersebut method bernama ",(0,r.kt)("inlineCode",{parentName:"li"},"info")," diakses."),(0,r.kt)("li",{parentName:"ul"},"Method ",(0,r.kt)("inlineCode",{parentName:"li"},"info")," tidak bisa diakses via struct ",(0,r.kt)("inlineCode",{parentName:"li"},"Car"),". Dan ",(0,r.kt)("em",{parentName:"li"},"associated function")," ",(0,r.kt)("inlineCode",{parentName:"li"},"new")," juga tidak bisa diakses dari instance/object ",(0,r.kt)("inlineCode",{parentName:"li"},"my_car"),".")),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Di bahasa pemrograman lain, ",(0,r.kt)("em",{parentName:"p"},"associated function")," disebut dengan ",(0,r.kt)("strong",{parentName:"p"},"class method"),", sedangkan method disebut dengan ",(0,r.kt)("strong",{parentName:"p"},"instance method"))),(0,r.kt)("p",null,"Pengaksesan ",(0,r.kt)("em",{parentName:"p"},"associated function")," dilakukan menggunakan notasi path dengan separator ",(0,r.kt)("inlineCode",{parentName:"p"},"::"),", contohnya seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"Car::new()"),". Sedangkan pengaksesan method menggunakan separator ",(0,r.kt)("inlineCode",{parentName:"p"},"."),", contoh: ",(0,r.kt)("inlineCode",{parentName:"p"},"my_car.info()"),"."),(0,r.kt)("p",null,"Agar lebih jelas, mari lanjut ke bagian praktik. Siapkan package dengan struktur seperti berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u2514\u2500\u2500\u2500 models.rs\n")),(0,r.kt)("p",null,"Buka file ",(0,r.kt)("inlineCode",{parentName:"p"},"models.rs"),", isi dengan deklarasi struct ",(0,r.kt)("inlineCode",{parentName:"p"},"Car")," berikut diikuti dengan blok kode ",(0,r.kt)("inlineCode",{parentName:"p"},"impl")," untuk associated items-nya."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"#[derive(Debug)]\npub struct Car {\n brand: String,\n model: String,\n manufacture_year: i32\n}\n\nimpl Car {\n // ...\n}\n")),(0,r.kt)("h2",{id:"a252-deklarasi-method"},"A.25.2. Deklarasi method"),(0,r.kt)("p",null,"Cara deklarasi method mirip dengan ",(0,r.kt)("em",{parentName:"p"},"associated function"),", perbedaannya adalah parameter pertama harus diisi dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," pada deklarasi method. Parameter tersebut menjadi identifier apakah fungsi merupakan ",(0,r.kt)("em",{parentName:"p"},"associated function")," atau ",(0,r.kt)("em",{parentName:"p"},"method"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Object ",(0,r.kt)("inlineCode",{parentName:"p"},"self")," merupakan representasi dari ",(0,r.kt)("em",{parentName:"p"},"current instance")," atau ",(0,r.kt)("em",{parentName:"p"},"current object"),"."),(0,r.kt)("p",{parentName:"blockquote"},"Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," artinya kita melakukan operasi ",(0,r.kt)("em",{parentName:"p"},"borrowing")," terhadap object ",(0,r.kt)("inlineCode",{parentName:"p"},"self"),"."),(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai borrowing dibahas pada chapter terpisah.")),(0,r.kt)("p",null,"Silakan tambahkan ",(0,r.kt)("em",{parentName:"p"},"associated function")," bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"new")," dan method bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"info")," berikut. Tulis keduanya dalam blok kode ",(0,r.kt)("inlineCode",{parentName:"p"},"impl"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},'// ...\n\nimpl Car {\n \n pub fn new(brand: String, model: String) -> Self {\n Self { brand, model, manufacture_year: 0 }\n }\n\n pub fn info(&self) -> String {\n if self.manufacture_year == 0 {\n format!("{} model {}", self.brand, self.model)\n } else {\n format!(\n "{} model {}, manufactured at {}",\n self.brand,\n self.model,\n self.manufacture_year\n )\n }\n }\n}\n')),(0,r.kt)("p",null,"Bisa dilihat, deklarasi method adalah mirip dengan fungsi biasa, perbedaannya ada pada deklarasi parameter pertama fungsi yang diisi dengan ",(0,r.kt)("inlineCode",{parentName:"p"},"&self"),"."),(0,r.kt)("p",null,"Cara mengakses property milik ",(0,r.kt)("em",{parentName:"p"},"current object")," dari dalam method adalah menggunakan keyword ",(0,r.kt)("inlineCode",{parentName:"p"},"self"),", contohnya seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"self.brand"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"self.model"),", dan ",(0,r.kt)("inlineCode",{parentName:"p"},"self.manufacture_year"),", pemanggilan ketiganya adalah mengarah ke value property milik ",(0,r.kt)("em",{parentName:"p"},"current object")," (",(0,r.kt)("inlineCode",{parentName:"p"},"self"),")."),(0,r.kt)("p",null,"Selanjutnya panggil keduanya di fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod models;\n\nfn main() {\n let car = models::Car::new(\n String::from("Mercedes-Benz"),\n String::from("Vision Gran Turismo")\n );\n println!("car: {:?}", car);\n\n let info = car.info();\n println!("info: {:?}", info);\n}\n')),(0,r.kt)("p",null,"Bisa dilihat, variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"car")," adalah instance dari struct ",(0,r.kt)("inlineCode",{parentName:"p"},"models::Car"),", dibuat menggunakan ",(0,r.kt)("em",{parentName:"p"},"associated function")," ",(0,r.kt)("inlineCode",{parentName:"p"},"models::Car::new"),". Dari variabel tersebut kemudian diakses method ",(0,r.kt)("inlineCode",{parentName:"p"},"info"),"."),(0,r.kt)("p",null,"Jalankan program untuk melihat hasilnya."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(2693).Z,width:"626",height:"110"})),(0,r.kt)("h3",{id:"-naming-convention-method"},"\u25c9 ",(0,r.kt)("em",{parentName:"h3"},"Naming convention")," method"),(0,r.kt)("p",null,"Sesuai anjuran di ",(0,r.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", snake case digunakan dalam penamaan method. Contoh:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},"impl NamaStruct {\n\n fn nama_method(&self) {\n // ...\n }\n}\n")),(0,r.kt)("h2",{id:"a253-method-parameter"},"A.25.3. Method parameter"),(0,r.kt)("p",null,"Ok, penulis rasa sudah cukup jelas perihal perbedaan ",(0,r.kt)("em",{parentName:"p"},"associated function")," dengan method. Sekarang, bagaimana dengan method yang ada parameternya? Cara deklarasinya adalah cukup dengan menuliskan parameter yang diinginkan setelah ",(0,r.kt)("inlineCode",{parentName:"p"},"&self"),"."),(0,r.kt)("p",null,"Lanjut ke praktik berikutnya. Silakan buat method baru bernama ",(0,r.kt)("inlineCode",{parentName:"p"},"congratulate")," yang memiliki 1 buah parameter bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),", dengan tugas adalah menampilkan pesan selamat."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},'// ...\n\nimpl Car {\n \n // ...\n \n pub fn congratulate(&self, name: String) {\n println!("hello {}", name);\n println!("congrats with your new car {}", self.info());\n println!("vroooom vroooooooommmmm!");\n }\n}\n')),(0,r.kt)("p",null,"Dalam method ",(0,r.kt)("inlineCode",{parentName:"p"},"congratulate")," ada statement pemanggilan method ",(0,r.kt)("inlineCode",{parentName:"p"},"info"),", yang return value-nya ikut di-print. Notasi ",(0,r.kt)("inlineCode",{parentName:"p"},"self.nama_method()")," digunakan untuk pemanggilan method dari dalam method. Mirip seperti pemanggilan property yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"self.nama_property"),"."),(0,r.kt)("p",null,"Selanjutnya, panggil method ",(0,r.kt)("inlineCode",{parentName:"p"},"congratulate")," di fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),". Isi argumen pemanggilan method dengan sebuah ",(0,r.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'// ...\n\nfn main() {\n let car = models::Car::new(\n String::from("Mercedes-Benz"),\n String::from("Vision Gran Turismo")\n );\n\n car.congratulate(String::from("Sylvanas Windrunner"));\n}\n')),(0,r.kt)("p",null,"Meskipun pada definisi method parameter pertama adalah ",(0,r.kt)("inlineCode",{parentName:"p"},"&self"),", pada saat pemanggilan method yang menjadi parameter pertama adalah parameter setelah ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"name"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(1460).Z,width:"487",height:"128"})),(0,r.kt)("h2",{id:"a254-struct-property-mutability-via-method"},"A.25.4. Struct property mutability via method"),(0,r.kt)("p",null,"Nilai property struct bisa diubah dari dalam method. Pada bagian ini kita akan buat method baru untuk struct ",(0,r.kt)("inlineCode",{parentName:"p"},"Car")," dengan nama ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year"),". Method ini bertugas untuk melakukan perubahan nilai property ",(0,r.kt)("inlineCode",{parentName:"p"},"manufacture_year"),"."),(0,r.kt)("p",null,"Silakan tulis kode berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"// ...\n\nimpl Car {\n \n // ...\n \n pub fn set_manufacture_year(&self, year: i32) {\n self.manufacture_year = year\n }\n}\n")),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(2653).Z,width:"678",height:"195"})),(0,r.kt)("p",null,"Hmm, tapi kenapa terdeteksi error? Penyebabnya error tersebut adalah karena ",(0,r.kt)("strong",{parentName:"p"},"mutable reference")," tidak digunakan dalam pengaksesan current object yang padahal ada operasi ",(0,r.kt)("em",{parentName:"p"},"mutable")," atau perubahan nilai terhadap property disitu. Syntax ",(0,r.kt)("inlineCode",{parentName:"p"},"&self")," artinya operasi peminjaman object ",(0,r.kt)("inlineCode",{parentName:"p"},"self")," adalah ",(0,r.kt)("em",{parentName:"p"},"read only"),"."),(0,r.kt)("p",null,"Cara mengambil mutable reference dari object ",(0,r.kt)("inlineCode",{parentName:"p"},"self")," adalah dengan menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"&mut self"),". Cara tersebut kurang lebih sama seperti pengambilan mutable reference dari variabel biasa."),(0,r.kt)("p",null,"Ok, sekarang kita coba modifikasi deklarasi method ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year")," menjadi seperti berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"// ...\n\nimpl Car {\n \n // ...\n \n pub fn set_manufacture_year(&mut self, year: i32) {\n self.manufacture_year = year\n }\n}\n")),(0,r.kt)("p",null,"Lalu panggil method ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year")," di fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'// ...\n\nfn main() {\n let mut car = models::Car::new(\n String::from("Mercedes-Benz"),\n String::from("Vision Gran Turismo")\n );\n\n let info = car.info();\n println!("info: {:?}", info);\n\n car.set_manufacture_year(2013);\n let detailed_info = car.info();\n println!("detailed info: {:?}", detailed_info);\n}\n')),(0,r.kt)("p",null,"Jalankan program, lihat hasilnya."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Method",src:t(7797).Z,width:"570",height:"109"})),(0,r.kt)("p",null,"Setelah ",(0,r.kt)("inlineCode",{parentName:"p"},"manufacture_year")," di-set, method ",(0,r.kt)("inlineCode",{parentName:"p"},"info")," mengembalikan pesan yang berbeda. Dari sini bisa disimpulkan bahwa method ",(0,r.kt)("inlineCode",{parentName:"p"},"set_manufacture_year")," sukses menjalankan tugasnya untuk mengubah property ",(0,r.kt)("inlineCode",{parentName:"p"},"manufacture_year"),"."),(0,r.kt)("h2",{id:"a255-generic-pada-method"},"A.25.5. Generic pada method"),(0,r.kt)("p",null,"Pembahasan mengenai generic pada method ada pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/generics#a366-generics-method"},"Generics"),"."),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/method"},"github.com/novalagung/dasarpemrogramanrust-example/../method")),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-03-method-syntax.html"},"https://doc.rust-lang.org/book/ch05-03-method-syntax.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.impl.html"},"https://doc.rust-lang.org/std/keyword.impl.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.SelfTy.html"},"https://doc.rust-lang.org/std/keyword.SelfTy.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.self.html"},"https://doc.rust-lang.org/std/keyword.self.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/fn/methods.html"},"https://doc.rust-lang.org/rust-by-example/fn/methods.html"))))}u.isMDXComponent=!0},2693:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnIAAABuCAIAAAAsx2kLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTY6NDg6NDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDIwOjIzOjE0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDIwOjIzOjE0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk5OTM0ZWRlLTFhYzct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"},1460:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAecAAACACAIAAAC+6TZVAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTc6MTQ6MTgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDIwOjI1OjI5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDIwOjI1OjI5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmNmNTY4MDdjLWVmNGYtZTM0My1hZGM5LWY4M2UzYTA0NTExYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxNmEzNjA4OC1kZjM3LTExNDYtYjM4NS0yZjYyZGE5OGU5Y2QiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxNmEzNjA4OC1kZjM3LTExNDYtYjM4NS0yZjYyZGE5OGU5Y2QiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOmFjYTJjOGRhLTkwMTAtMjU0OC1iNTgyLWI1ODM1YzlhZWE0NjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE2YTM2MDg4LWRmMzctMTE0Ni1iMzg1LTJmNjJkYTk4ZTljZCIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yOVQxNzoxNDoxOCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjZjU2ODA3Yy1lZjRmLWUzNDMtYWRjOS1mODNlM2EwNDUxMWEiIHN0RXZ0OndoZW49IjIwMjItMTAtMjlUMjA6MjU6MjkrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5PD9NSAAATcklEQVR42u2du27dRhCG/SSSggBGDLhJasetK0dpUrhQABVCSgUBBFiVCnV+BT2CnuL0eqicw+teZpaz5JKHPOf7YcASteReuPw4HC5n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"},2653:(e,a,t)=>{t.d(a,{Z:()=>n});const n=t.p+"assets/images/method-3-2b2f604aaaa2cd04220b106aec22800d.png"},7797:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjoAAABtCAIAAAAnPlzxAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTk6NTE6NDIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDIwOjIyOjIwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDIwOjIyOjIwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFjYTJjOGRhLTkwMTAt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"}}]); \ No newline at end of file diff --git a/assets/js/71880105.761a2054.js b/assets/js/71880105.761a2054.js new file mode 100644 index 00000000..de4b45e3 --- /dev/null +++ b/assets/js/71880105.761a2054.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[5758],{3905:(A,a,n)=>{n.d(a,{Zo:()=>p,kt:()=>m});var e=n(7294);function t(A,a,n){return a in A?Object.defineProperty(A,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):A[a]=n,A}function i(A,a){var n=Object.keys(A);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(A);a&&(e=e.filter((function(a){return Object.getOwnPropertyDescriptor(A,a).enumerable}))),n.push.apply(n,e)}return n}function l(A){for(var a=1;a=0||(t[n]=A[n]);return t}(A,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(A);for(e=0;e=0||Object.prototype.propertyIsEnumerable.call(A,n)&&(t[n]=A[n])}return t}var d=e.createContext({}),b=function(A){var a=e.useContext(d),n=a;return A&&(n="function"==typeof A?A(a):l(l({},a),A)),n},p=function(A){var a=b(A.components);return e.createElement(d.Provider,{value:a},A.children)},c={inlineCode:"code",wrapper:function(A){var a=A.children;return e.createElement(e.Fragment,{},a)}},u=e.forwardRef((function(A,a){var n=A.components,t=A.mdxType,i=A.originalType,d=A.parentName,p=r(A,["components","mdxType","originalType","parentName"]),u=b(n),m=t,o=u["".concat(d,".").concat(m)]||u[m]||c[m]||i;return n?e.createElement(o,l(l({ref:a},p),{},{components:n})):e.createElement(o,l({ref:a},p))}));function m(A,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof A||t){var i=n.length,l=new Array(i);l[0]=u;var r={};for(var d in a)hasOwnProperty.call(a,d)&&(r[d]=a[d]);r.originalType=A,r.mdxType="string"==typeof A?A:t,l[1]=r;for(var b=2;b{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>b});var e=n(7462),t=(n(7294),n(3905));const i={sidebar_position:12,title:"A.12. Perulangan \u279c for in",sidebar_label:"A.12. Perulangan \u279c for in"},l=void 0,r={unversionedId:"basic/perulangan-for-in",id:"basic/perulangan-for-in",title:"A.12. Perulangan \u279c for in",description:"for in adalah salah satu keyword untuk operasi perulangan yang ada di Rust selain loop dan while. Pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/perulangan-for-in.md",sourceDirName:"basic",slug:"/basic/perulangan-for-in",permalink:"/basic/perulangan-for-in",draft:!1,tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12,title:"A.12. Perulangan \u279c for in",sidebar_label:"A.12. Perulangan \u279c for in"},sidebar:"tutorialSidebar",previous:{title:"A.11. Perulangan \u279c loop, break, continue, label",permalink:"/basic/perulangan-loop-break-continue-label"},next:{title:"A.13. Array",permalink:"/basic/array"}},d={},b=[{value:"A.12.1. Keyword for in",id:"a121-keyword-for-in",level:2},{value:"A.12.2. Label perulangan",id:"a122-label-perulangan",level:2},{value:"A.12.3. Perulangan for in pada array",id:"a123-perulangan-for-in-pada-array",level:2},{value:"A.12.4. Perulangan for in pada tipe iterator lainnya",id:"a124-perulangan-for-in-pada-tipe-iterator-lainnya",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:b};function c(A){let{components:a,...i}=A;return(0,t.kt)("wrapper",(0,e.Z)({},p,i,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"for in")," adalah salah satu keyword untuk operasi perulangan yang ada di Rust selain ",(0,t.kt)("inlineCode",{parentName:"p"},"loop")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"while"),". Pada chapter ini kita akan mempelajarinya."),(0,t.kt)("h2",{id:"a121-keyword-for-in"},"A.12.1. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"for in")),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"for in")," adalah keyword perulangan yang paling sering dipakai untuk meng-iterasi data yang tipe data-nya mengimplementasikan trait ",(0,t.kt)("inlineCode",{parentName:"p"},"Iterator"),". Ada banyak jenis tipe data dengan trait ini, salah satunya adalah tipe data ",(0,t.kt)("strong",{parentName:"p"},"range")," yang akan kita bahas pada chapter ini."),(0,t.kt)("blockquote",null,(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai trait ",(0,t.kt)("inlineCode",{parentName:"li"},"Iterator")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator")))),(0,t.kt)("p",null,"Tipe data range dibuat dengan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"a..b"),". Mari lanjut dengan praktik agar lebih jelas. Silakan coba kode sederhana berikut lalu jalankan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'for i in 0..5 {\n println!("{i}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"perulangan for in",src:n(2472).Z,width:"446",height:"169"})),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"for in")," jika digunakan pada notasi iterator ",(0,t.kt)("inlineCode",{parentName:"p"},"a..b")," maka akan menghasilkan sebuah perulangan dari angka ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," hingga angka di bawah ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,t.kt)("p",null,"Pada contoh di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"0..5")," artinya adalah objek iterator yang dimulai dari angka ",(0,t.kt)("inlineCode",{parentName:"p"},"0")," hingga di bawah ",(0,t.kt)("inlineCode",{parentName:"p"},"5")," (yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"4"),"). Object iterator tersebut kemudian diiterasi, dan ditiap perulangan di-print menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},'println!("{i}")'),". Dengan ini, nilai ",(0,t.kt)("inlineCode",{parentName:"p"},"i")," muncul di layar console dimulai angka ",(0,t.kt)("inlineCode",{parentName:"p"},"0")," hingga ",(0,t.kt)("inlineCode",{parentName:"p"},"4"),"."),(0,t.kt)("p",null,"Jika ingin melakukan perulangan dari ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"b")," (bukan dari ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke angka di bawah ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),") gunakan notasi iterator ",(0,t.kt)("inlineCode",{parentName:"p"},"a..=b"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'for i in 0..=5 {\n println!("{i}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"perulangan for in",src:n(1154).Z,width:"445",height:"192"})),(0,t.kt)("h2",{id:"a122-label-perulangan"},"A.12.2. Label perulangan"),(0,t.kt)("p",null,"Penambahan label pada perulangan ",(0,t.kt)("inlineCode",{parentName:"p"},"for in")," juga bisa dilakukan. Caranya dengan cukup menambahkan sintaks ",(0,t.kt)("inlineCode",{parentName:"p"},"'namaLabel: ")," sebelum statement ",(0,t.kt)("inlineCode",{parentName:"p"},"for in"),". Contohnya seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'\'perulangan: for i in 0..=5 {\n if i > 3 {\n println!("perulangan dihentikan paksa pada iterasi {i}");\n break \'perulangan;\n }\n\n println!("{i}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"label perulangan for in",src:n(8267).Z,width:"448",height:"180"})),(0,t.kt)("p",null,"Selain ",(0,t.kt)("inlineCode",{parentName:"p"},"break"),", keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"continue")," juga bisa digunakan pada perulangan ",(0,t.kt)("inlineCode",{parentName:"p"},"for in"),"."),(0,t.kt)("h2",{id:"a123-perulangan-for-in-pada-array"},"A.12.3. Perulangan ",(0,t.kt)("inlineCode",{parentName:"h2"},"for in")," pada array"),(0,t.kt)("p",null,"Perulangan menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"for in")," adalah yang paling praktis digunakan untuk mengiterasi elemen array. Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let array = ["jason", "grayon", "drake", "damian"];\nfor name in array {\n println!("{name}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"label perulangan for in",src:n(2977).Z,width:"445",height:"149"})),(0,t.kt)("p",null,"Perihal apa itu ",(0,t.kt)("inlineCode",{parentName:"p"},"array")," akan dibahas pada chapter selanjutnya, yaitu ",(0,t.kt)("a",{parentName:"p",href:"/basic/array"},"Array"),"."),(0,t.kt)("h2",{id:"a124-perulangan-for-in-pada-tipe-iterator-lainnya"},"A.12.4. Perulangan ",(0,t.kt)("inlineCode",{parentName:"h2"},"for in")," pada tipe iterator lainnya"),(0,t.kt)("p",null,"Di Rust ada banyak cara membuat object iterator. Mengenai topik satu ini kita akan bahas seiring berjalannya proses pembelajaran. Akan berpotesi makin membingungkan jika dibahas terlalu detail pada chapter ini."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/perulangan_for_in"},"github.com/novalagung/dasarpemrogramanrust-example/../perulangan_for_in")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/loop-expr.html"},"https://doc.rust-lang.org/reference/expressions/loop-expr.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.in.html"},"https://doc.rust-lang.org/std/keyword.in.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.for.html"},"https://doc.rust-lang.org/std/keyword.for.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"))))}c.isMDXComponent=!0},2472:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAACpCAIAAADbS88pAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjE6NTE6NDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjU3OjQyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjU3OjQyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU4YjE4OWUxLTllMjIt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"},1154:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAADACAIAAAAfhyq4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MDY6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjU2OjU4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjU2OjU4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU3ZDY3YmNkLTQyNDAt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"},8267:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAAC0CAIAAACMg2tHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MTA6MTMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjU4OjM1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjU4OjM1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA5M2EzYzkwLTQzNDEtNGE0OC04ZjZhLTFkY2QyN2M1OWZjZiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowOTNhM2M5MC00MzQxLTRhNDgtOGY2YS0xZGNkMjdjNTlmY2YiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowOTNhM2M5MC00MzQxLTRhNDgtOGY2YS0xZGNkMjdjNTlmY2YiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjA5M2EzYzkwLTQzNDEtNGE0OC04ZjZhLTFkY2QyN2M1OWZjZiIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNlQyMjoxMDoxMyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pmi7V6wAACFWSURBVHic7Z1PbBvXncd/lEpZqVKFLlWZ9Spjz6rLWIHczWRVuFwdGPjC5qDLIAABAT7o5jvPOvnMe24+CDBCICBQCEWgRdeoDqrWWKNTbKIqS9RLi0iztGrCjBwmsrkS9zAz5Px5b+bN8I9GyveDAA5H897vvd9785v3Z+Y7MUmSCAAAQHDGzroAAABwXkEABQCAkCCAAgBASBBAAQAgJAigAAAQEgRQAAAICQIoAACEBAEUAABCggAKAAAhQQAFAICQIIACAEBIEEABACAkwgFUyeXVrEREJGXVfE4ZeEmU3DBy7YNejcMQwEvhDPVXvKFgL5KSy+d9iyhciz57nZRVGYZ8rUfQyYCi1HA/EjpLyqrpqfruVo2I6NVwSqLt19WMmm2Ut2tepym5fDrR/dWslLY09/HeYc/U7fquhzVtvy4vyRLVbGcoubx87JUsOGxDRCRl1Uwq7l3KAcB23RAqyoBZd3sr6c00Ousgari7YnQaTiSAStmlFNV3h3wpUW27nMzll7JSzc+SeZFLWTWTz1Fpq6EH+JJQEa2pM2qWuDGiVm0sZRYUqjFj8QDhGJLkJNUr9aQ8zJ4iBXFdILStkoDjOHV33TWGM5oYWRODwRKZhhMIoMoCK3x2RwndIYs+XiIia/e3HGSeaR8ravt1OYBbatvVhXx6lqTpZLzdqAYMAXrATnfNKbl8OmErT227upCXs5LmG12YdScfL/UOMg1JcjLeqmpVst5rrcmpXedYV3L52eP6VCoVb9crjWSaP4yVZLfrLNll8vmMWdJGVs1MVi3VMH4witQ7ZPOnZWTZK4+4k5n+ZObJPOjIRM+B7XkhJzvP9LoQ9DHUY1rS/9CslLY0Kasu0ePqZIbfQ/RjnNZMMvIUcIj5h6MFZnLxvuSuJrtGnLr79iWzzzG6osa7ZEbfcP4BVJlNtBu7llKOEVEiLdd3S6UaKbl8OqdoW5qUXaDHpVLNKIc+kJSyS6mWczqt5DLmQSnrmLXXqo2lzKxCFOjGUqs2llIpz9Ekm8Zxm5LTEhEvlXbYTPsPAFl1J2J7ieEQtiFJTsabVY1qSitj/sXiOlJyeZln/YgokZqslCqz+XRa/5dTC5bratvlGmPexB4DMouk5yBl1cykxUm9oa6UVTOZnFLT/SDmZJY/G6w82Qd75c3bR9wu66JO5nRv5plEFE9lMs1KqaRJWTUjZ0mrEsVTGWcPYVwdnNY8YuXJdLKSM0cGUlbNpFqV8naNlAVncknbJuG+RDKzz3dr1M2SV3cGDH+yu2KEGs53E0manqLWkbNrNytGdbTDJiVmFaLa9pZZwVq10Y5PJo1TE7P2pX9lNtGsGEWvbVeb8aRsuTRrRy2amhacrym5dKJd3yeqbZdLu3VKZfIC+xYWaket3g9tq1RyhTZtv06pBZ/NC17d3V4icjuEbUiSk/HmoaYn1n0kZeWe6/yst+v7mvVfftnDuc4oJbtIDJSFVLxZNQpa235cb/f8wHByXC9QPp/P9/aOHP5k5sk+aCDr0dN+KdqtB3IyMVqTe2a7vruldY8yajQ1zbw69LTs1nTkya67MpsgvStRrdpoW64ve/JkkL7k1+f9686GfXUwiUTD+Y5Ak5NxxxF7zG0ct2lSr4Bl+EzU1MtUTuby6Xw+3RvmT09RQj/SLZ8jv/Rkkj8mJKJeeuv8TB/16PfdfC7J2UWyI01PER17niI0JmbV3YbpJYZD2IbM8SdR71bLvm0LWPcjjOtC0D5ucP7idrLPzlm31zHz5BiKp1IJatddSz2hm5jdmpzm6C2UmO52lW+SJPK+Ohw481RyrLo3jtuU0utnX7FxFSlIXwrS6/zrbv6Rd3Wwz49Aw/kG0G5X5ZCcjLePNVJymRSZMyPr3M3cSlBy+YyapXKVPDbJzfx4F5qBV/ra9mNZzXjOy7tIcjLOGF47M/Rbo+PWvYelVk6HWGbOPUOSnIxT3HoltWVOABWwLkgQ14UhbrkxOu7LgRZCyfAn0SQ7T46hdn33MS1Z1g7ErQt37+1k+OZo67dyV+9WcsJZMOquUO2olUmZYbnttRss2pe2a0ouP6BeZ4d7dTCJQMP5TuG959RSVk60G8aVbYQiKbuUco5a9UBMpI+DE2nuE33sFYMgCEVFIt23ccugX8lZp4sWunNoDzzrbnjJXiTTIUxDycl4u75bMtmtt+NJqh21zImHlFWtmwKe1sWxua5x3HbX2ugJSs64VfOLxKgbJWRjiUDKygnHbFTEyd1yGr2OlSf7oEltu1xpJtKupYqe9ZBOtrVm8OZQculEu1H1uzr8YDpZn9uaXcl3WCde+D57nbMv2bD5k9kVdc684fw3kbTDZjpt3RnXN5Eck+jafl3OGAeb9Xo7NUnOMXGzokf37TJl1Ux3cGUbq1tnruI49hi9BqiOsos9veN4OCCeMncEjdKz6u60VDbX9d0OcRtKOjbuatXGUkrNNsqVpjHxaFZ26/JSNw3LuhB81+njUaOmzUppS+sdaNcr9XZ6koi0rcqsq0jWaqbz+bSefKtEubxlL5VTd93JLh8z/Vlj5ck82Lv6tK3daTWTyauydY7Ys86sEdPJzNZkXghc3ItRjKvjyCsHO0wn16oLedtkhjs7Fu1LWam/XmftXL2+xL063F3RUeQzbLiYwGeNpayaSTaG/kw1jerh7TCMrGTRdcHwOdu6j9q67VGe0dkZ3dU8Ks604UQepNdvACJPuPdbrt7rTlFD7Knw82Qogpxt3S+q5+3LzcIrXOeHM204sVc5xV8SCo+ykGq55nUAgP6wTG2JyHeFCwRCZAoPAACAge8uPAAAADYIoAAAEBIEUAAACMn4W2+9ddZlCMFMbPXm+Dvxzl+a+u/YR7fG35sbuzk3dnO68/lzjzMjiJRVf/PrXy4uLi7OTew98Xp1b9QouXx2aXFxcXHxnZmX+wffDCjHQWUWHZRc/l/nglYqVKIuUlb9zY1Jof4SzlB/xRsK9iIJ9SXhWgTwpxWxXfh++OC98auX9P89/fJR50+Dy3nije7/dj59dEIU++jW2ITPmRGEpV0UBXoiPhGGK43IQsnl0wn/t6wD5Wl//g6K3QwusmL3kAPoB++NX73UjZuxD64TPR1Evs87D56fDPhMYEeanqLgb4X5MOBn9iwKZkoun/b6oIGSy6epXm9Tkv33MHkSEUNuHIrdNiMXW7F7mAH02vWxq5foxZPuqLPzh6dERDQTW503F1+PTh7sxz68NUZHp5enx+jV6devxq5OEx2dPPh7bHU+9vWzztUrY0REr053/tw5sA4zj04e7BMf1pkzzDztRSLiDpaFRXCD6cgyERWsZd9Qa+LJObh1uFhivaxq+tWnd5JwkZRcPk29vyq5fJpKu8dyol3fNTSr9utyJskLBUpOPt4tbVNWTXlUmcw3yIXy1DNmyo0TERS7u0YusmL3MDeRkm/EiDrff2c/OhNbnR97/ezkwaOTB09OaXr8o+tERJcv0c7np68vjc18f7LzrEPT+tmxq1foy0cnDx6dvr409qvrpM/WHzw6fe1vn3emmeeTU7o09u4MEcU+Mou086xD1Pn6c/5SQzyVkY93S6VSqdI0dB+MMYsu+zHVk6qIpzKZyaouBpKQswIu62HIu+p5UmrJyLNrXc9Sou5MWz9mKhWKJ2eZVvP5fD6d0F/5NSU5zaGEmWfG1LxwVJN3K69tl80yMv3pmdqmqKoPjg8pOdm7NnVNip6IozP9luBcMUCeRIbcOP9bCI3jtre8rZiGCqc1KZF2dkVDKtjA+rEHlyFTcbZ21Or+xdKTS5Wmp/VEarJaqjTjqbT+L6cWtWqjHU9lbPItek+oNKknmMO/lTOLxOpL3P4pLlTj8iczT9vBYQbQ6UuMg+//bIzo9H+eEhHR887Xr2giQUT0utk5+I6IOs8Pbed3B7AtoolE7NogCmYZFNPUm0QzNGHaPfi245daRATXaCxxHVkXwoK1bLncYHq3TtNls7eaKj5bmpciskuXNxAiRSLS9nsGJTlJPS0nPd6nqVKqNMXFuL0RzdNPPAyK3RddsXuYU/ijV3TVFUOZUVWAzvev6HK/JeLwnF7Px974MdF3Rnw/+s4/kY6nCK6gjiwbUcFajlxu3yrLDDhCrQxd3iHQU8+V5CQ1HteIkpbvLRCRlFWpddh/AQLkyVjmsAHFbt30xVXsHmYAbXzfoWkjMHGIvXFJ8DvJsTcuER11DgZXPAeX58dX54ns41NWQWw/dBHcWLPyibNTJO1n+udl+6nk/vXn9L9/FJB3rR21Mj+//E4+n47FYq//94/b+mbwoFSWrXgoIo8A8yKQpo34SY3jNrUbu6bnRbS4fQmWp4/cOBS7HTW9eIrdw5zCHzztvCC6PB973zgQ+/A6/eGrU6Kxf7xOREQzdJnoxVf+WV27HrtM9OLvQynnteuxCTr98tHJg0cnDx6dfPbc8+zuFF/JpROvdRHc10wRXPZigFVH1nGG7WenIyTvKmXlRPO/P/mkVCp98skn1pvqgFSWTfwUkYdPrdpoT00rcrJlTKD09TVjTc6uWq3PwUVmjI4zPfJkFclLbhyK3a5yXjzF7uE+xtT57NHph7fGbtyiG6RveRNRZ+fNzvKV8dUrREQvnpx89jz24Tw3C8vA8OSz5/bt8unx1Vv0+tnJp986D5qb+O4zGSYOnnbevWIWkiy22AiJ4LJvdL46sj35YVF5V/3Tzk653D71bpn4KSL7wKxmsPGiXtdUs7LdPVCmrCm16zkps1pPZfL5DPds8TyJGHLjBMVuGxddsTvKakwzsdX5Mc9YNhjeXxi/Md17bumD98avkvl4k4NRieCKc+HlcqPOgDwOxe4RMIS6D/9NpOhj39cSX5aNBBdeLjfqDEhuHIrdI2AIdUcAJfrDny3rDGR5uv480JdcrmN+ZdLX+5vDyDPajEJuHESUKE/hAQAg0kDODgAAQoIACgAAIUEABQCAkERKUFlc/FjkzJnY6s3xuVedvwq/lxmsDINUnB28cnEI+0KmB6OIPAyxXs88Q8rluiwI112oRXsnRU1Km41/sym5/D9Pi1blIqhrn8EuvEP2uPP156d/sMQ4cfHjaMskB2XosrZE9MN+CnCECGpR64/VCL0eefbPiVp1o7lo+3U14yehOgiCi15bpaMDpvbgrB5jYkp5Qib5rBB/QA6PEQowFC3qs8WtG80myDNd4ftSCNHrVrOZmOr+TDb0l8REUnsSledAxcWPOYLK1lc8rQ9yvhn7aH5swnawl8PrZyefPnUl98ZPcVa/o7EEgIPc6pjSyw1/QWW+dnKDrWKrMbRpOXK5xFZEtgr12NTYXbd4puu8PCDwho9Ycxg45HJ5+tYMgeqqHEQNWkyLWhCO/LBdadhH39pPctvRE5yGmLrRTOVmIteLqT6VCqGuHVD02oj9h5MZWT9gEQ3TDpvptCkNwq2RB1EJoLyPGsWuXul8+ejkTzOx1fmxd2dODp4zzzQUkY1oaOHyFbInj310a2xCj7wzsdX58Q+/PfmMDI3nT5/6RlLLrY+UXF52HpSyxgzmsJlO97TDBjYiiacycn23VKpJWTUjZyVtmyyfTJCyaiaTU2pbDcuZpOTy6ZxS2irXWBM09heZEqnJSqkym0+n9X9lWaJtxpmWvqjk8rOHZgR2O6TGdF2fCDcHEVEibXOIxnkTvzf9lrJqJtXSNSJrzO9WOZujYUYuMl7S7t683G0k2h10F7sbztA5Nq/87qCvq8bX7SJJVo1YXmIbIkM3etcePpe6nneV2F+hj/MdMHf3ZkVFt+g1WTSTHHSHzslchlscvxrxOatd+Onx1Vv6f12tJjZO8WM+E1cYWTmSX7sem6DO1/ro9Dm9ILr8M7vGsydseVemoDJfALg/nPLDTM1X25mG8HOw9yVE5XK7KLk0mU5gOCSAMq44ws2h/8Epl8upCFOgmoejOQJrUfcBT2XZoW9dY9eIrwLOgKMbza2Fp0iVJ2Lq2nqhhESvlYUU1R/zP5SVtqk2BW+XSK2Bhqfzn886y1essk/sdzGTb8SI6OrN8VXLwbAazwbSNFNQmSEAPCRERDDj/Fv0IFByaaqYC1ochwhim5OnBEWRrOkFrHvJeHIEqvukf6FSNxydY7eMN6NGkhykjRhLEh7KzUTUOG6nh9rjBEWvlZzHvpeUVdOJnmqTd414RGUK3y8HT08PnhIZ3wEde3fmhBlAG993aJoc+/4fvNe3edaKiVsAeEiI6BwP4wLuYgufOi6HSKKfhDIXBfpROXI3h318Ysjlsu0ftTIpM7a0BbZNhBi8FrW4zjGrRhIF2X9m33C4ys0D0rb2LI6Q6LUym6A49XTriDL5/EJvMYPquzYPeNSIx4V7kL7a9Pqo0cHTzmuKXbV/Wana7BCNXZkhotiHnltJTHnXWrXRZgoquwSAA+IUl2XC1Hy1oeTSPbVdpoptX0hZtTd5JyKOQ8SVccUJ1hyWEutyuUTkdrK+LGAKDQ/maZxBaFEzG05ccttZI76XWIa8p+Ru5Wa/T0X1ibCQtrZV6mF+xM4SPXnNy9Ci5hGREShbJln8TNvOz+tnuvQy01Ln0yenq/Pjq7eM3y+enHz29FROjF+dH1+dpxdPTl/Mj03xysmUd63xBJVdAsDiMKWXOUViaL5KxBJ+tufr2pzvatMeMszYNm0tisj6tdubDOrKuAyHMF3XJ+LNQUyHMJzMFqgmZt0DlLMvLWq9Vk754f4ktz06rdMQMXSjPZWbrd9bYtOnunYw0WsXykIqTt31ISJq10vlqo8WNQeoMUWCQT8mHT3h5/PCGQhUD7mxBlOjAMl+UC9rXLgpPAD9cPEEqgdTo9r2Y+sX6bno7ytxt70vHBGZwgPzIy2jeaMT8OhLoDoovefbm8MyMbgaCb1jpCykWmFWKM4tmMIDAEBIMIUHAICQIIACAEBIEEABACAkkRJUHgYBBJJF0CVwIyV/66tyO1Sl4WFIIzORsupvfv3LKIoPD14N+8yUhiPYvSNONHbhr10fW74S6/5k6ir1w+Ckl7UtXeUmnyPbXuYZ6t1q+3V5yUvOa6iMzDpHv+fMEdROPh/wujfgEY0AqvPiyclnz+n9hfEbV8Y//Pbks+eDyHQI0ssWCbdIUKs2lvz0Fy+q9TNnKNrJZ6paHbXuHW2iFEB1/vT30xvTY0TGW5t6VNX/33xr06WyLC69zD7TLQN6+uWjng6eJxHQu61tVxfyTvXEESkNb9fc1nnKuAzrLIfwrPu5ny8m7ZSdZjrZJzkHMe1kTrt71ieE0rDDIc2K+8VvJZe3iYMO5LsWP2CisQaaSMSkN2PHLzp//Y7evzY+c6nz4m+dp/HYzZ8aB+nHsZs/jZ20On95Hbv507GfvNn58tHpv72imz8b+8mrzl+JdfA7+svfOp//jd6Zi42/6nyuj2d/zDwz9tHNsZNnJ6W9zlE8Jr1JX3/e2RWVE/jmYH9vb29ibnG6ufvp7/64t7enLyBJ2V9f/stvf/fHvb29lzMLC7+Yfbl/8M3Pf7E4O/P22//3pPTb37+ceeefrs6+3D/4x1z2H44rpd/+fu/lzDtvv/my8um//zcpud9ca1dKv/393t7LmX9+719mX/7H9n8wDRER1afnfnn1J5Y1M0vyvYm5xcv/99X+wTfuPPcP6PrC2zOzRpYTc0vpX0zsPfn++sLbP2oa2b9l/lBY5WRZf+v6wrXUNUeedZZ1hkP29ptM692srT9ZTiaL9a6Pv2EWXjy5u92NNdnkJNFkcrH7ZbiJrPreW3/XG+jlzMLCgjSx96TObHfm+qbenV7OvGOp5luCRbK3u+nk//qv/Ym5X167PtPravrNkNEcgn0edInSLvzl+fHVW+M3Lp3uPLLJzblhqiyLSy87z5yhCeo8PyQiOvjWS8wpCCPUuyUibb9OqQVTXGfUSsN26+48p6a9amR3iFctXfCc7NLlZRdeODnTdEDtZHs1PbWCGYgpDXOcrG3t1im1kLV0i6AdDLCJ0hT+xRPj6xq/un6ii3uOiOf0ej72xo+JvjPU6Y8CfQmZw+j0bolEPqMwTKVhH+vxSZKIZ93tEF4NWJViO1m08KLJg8DRpnRVcwjwm1jXWEq1TNnW/kSvQZcoBVAiouedr+fo6pXY+08FlyAHxuX58dV5Ivv4NDyj1LvVs2EthDoZmtKwt3UjT0aNgg7E7PTn5ADJgzB47eRAsLuNksskG5V60voJSix8DoAoTeF1LPLGRMZk3EfnuE+uXY9N0OmXj04ePDp58Cjc7v+Z6t0aaIfmROwslIZ71m0Ycs4C1m0IiUkTUT9OFk8uziC0kwNg1w/mOlnJpRPN6rbWU1QK2ByAR9RGoEQHTzu/uhK7PBe79ufOlz+jG1fGV6/46RwzERZpPnjaebf7PSUiMh+oCsLZ6t0a9L4nOzKl4RrLOidPTo28fNkTk2ZK8PbpZOHkAehTO3kwSsM2Jx8t6PvuGpl+0D9XIdocwAuoMRG9vzB+Y7r33NIH741fJe5n6QbOYBV8h/dAv0g5lVxePtbFvaMl53wGMsngB0H0RqCjx/5Vztgbl4hejc76YBV8h/cItkg5DevRuyVfPJlkEA0wAiUiin14a+xy9xf/q8jDwf6Ed3SX9oXLGcUPivThZMcT+KHyGEWe4AxAAAUAgJBEbxceAADOCQigAAAQEgRQAAAICQIoAACEBAEUAABCggAKAAAhQQAFAICQIIACAEBIEEABACAkCKAAABASBFAAAAgJAigAAITEV85ueX2joOhKxtVNtXB/6CUCAIBzgs8IdK1YUA43VVVV1c2qvLKxvjyaYgEAQPTxDKDL67flllbWR533y1prKn0bERQAAHQ8A2g6MdWqPNwhIn0sOkVTibRXAgAA+AEhsIm0vL5RLpdXaFPdrNLsHIagAABARP6bSFNKoVDdVNX7RLS8vkGHX+yMolgAABB9PANopdmiVqVobr2nE1OtZmUUpQIAgHOA5xR+52GlNaXc1bfel9dvy90VUQAAAL4fles9B9rSinfuIX4CAIABvsoJAAAhwaucAAAQEgRQAAAICQIoAACEBAEUAABCggAKAAAhQQAFAICQIIACAEBIRALoWrFcLkMKFAAA7PgF0LViubzY1FojKQwAAJwnvAPoWvF2s6gWHo6oMAAAcJ7wlrO7X7hDRITJOwAAuMEmEgAAhAQBFAAAQoIACgAAIUEABQCAkHjrgfbUlA0gqgwAACYQVAYAgJBgCg8AACFBAAUAgJAggAIAQEgQQAEAICQIoAAAEBIEUAAACAkCKAAAhMRbjcn2KH11Uy3cH36JAADgnOA9Al1ev5uuFFVVVdXNqrwCVXoAAOjhPQLduXfHfG/z/hfVlZVEmggvcgIAABFhDRQAAEIjGkDXiitySytjDRQAAEz8NpGIiGh5fWNFrm6q0GECAIAe/iPQ5fWNgkJaETvwAABgwyeAmtETIqAAAODEWw90rVheka0HIKgMAAAmEFQGAICQ4DEmAAAICQIoAACEBAEUAABCggAKAAAhQQAFAICQIIACAEBIEEABACAkPu/CW5+kh6AyAABYEX6Qfnl9o5Cu4D0kAAAwEZ7C73x1OMxyAADAuUM4gK4tyq3KQww/AQDAxFcPtPdVueqmivgJAABdxMVEsAgKAAA2xB9j2nlYaU0l0kMsCwAAnCvEA+iaqkxVv8BzTAAAYOC9BtpbACU8BwoAAHYgqAwAACHBq5wAABASBFAAAAgJAigAAIQEARQAAEKCAAoAACFBAAUAgJCcQQBdXt8o6xTXRm/dl7VieWN92fKrbPm9vL4xpFIzDFmKMWLO1roNe3MESlc+uzqcrXUwOs4ggO7cu6OqalFrjd50FAgbEUC/RNTz+oAiiiUD/viqMf3AuV9QR/P21cgM/UA4W3+KW19ev6scVqvy7HALBIaE76ucd+njh4mC/l2P7sucllc8zWNrxfLtZvFjuqv/obqpFu4vr28UEg8tabo/2LbMPFta8c69Ha5163dGumeLJ/ezTtTS7IecSbsF8HAIw3qld1KhXC50T+YbsprT/9ZPNQVa08hTwLpo8nDWGc0hbIjRcMsczwv3ZJFyunIUePd5ef2uQlrxi0ThtveJIKL4TuGnlMLtZlFVVXWzKq8U14horVhQDjdVVVXVoja70p18TCmFQuKhPj2Xb68HKsfyukofq0aepNw18uxa17NcJqK14opc3VTNVYDqph5FRJMzsdRI3awaB3lLDfKKu0hMhzit6xluVqmlFXVb+gXmuaaxViyvzGpF1bg4+6omszU5eTKt3+16STVjg2fykNaZzSFuyO1PnucFe/IyxzrTIQFWqPTw+TEEIs8x/mugeoQiovtfVGl2jmhtUa5udnvLw+pU+rbR71paUY8IDyutqUSgcuzcK5j9yKabZ1rvHlxblMkQhdp5WGnR7NxykOQsltdv92rkD6tITocEsO7FbT1+dQdbfVXTdqbRmsv8PN3WiYjkRccWGj95WOuc5ghkSAzRnpz2sO5ySADzKsLnuSfgGuhUgpZpluSVcnmle9CcYvU++bFz784OEQVZFrdN2oiqvPMqzRYpi2tE92n5dnrKtCmafAgsz/Ec0idTiiJTS7N+R2Ww1dRDAydPt/Wde3fSxbJeU85sO0iRPK0zGHgT8xvO1ZPZ1tkOEWStuDKrFQsIn+ebgAG01SQi5upOf+OBtWJBIa2o3tshY7WUd+bOV4cFxez2La14bydQ8iHhdsgA9lRbWvFjulsoFNd2zMXfwVaz1bzPz9Nlnai3ObJWLBc21unOvXT4InladzGkJhbsyVzrLoeIBsS1RZmmuiuyRESFclmFYuR5I4CgcnFFblUe0s7DSstYwBJBn2LTWtF6/2Zy+JUxornrcaY+vzOXnaz9VSg5k52vDs2Z2PL6hnV/Six5MIdUmq3eVNE373t3NqvyiuUZl/DVtGG2pmeebusmlaZliS94kTyt85ujz7o7PR+w4Tyt2xwiwv2C2sNcnUX0PHf4j0C7k5zuJOXeHVrfKHSnPvzJy869j29vFArlcoFa2qbWWkmQfS60Ui6v6IOAsna7YBiqalpLSXBKs3PvoVq2TrtaWvHOPeHkbO4XNheNTKubRe32XeKVs8IuE8MhXGMWp7g251mG7heKcxuFQnnjdvFOf9UkYrTmjneeXes76se2SWx1UxVIHso6sznEm5jdwYjh+fvCPZlpfZnlEK51cCHxFlT2e/Ro9DhKhC/dBeBsWzN6fQmAvjlv78KnE9bp0/Lt9JQ5tQIAgBFz3t5EskzviAgfagIAnCH4JhIAAITkvE3hAQAgMiCAAgBASBBAAQAgJAigAAAQEgRQAAAICQIoAACEBAEUAABCggAKAAAhQQAFAICQ/D/GeNjqY6vObwAAAABJRU5ErkJggg=="},2977:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAACVCAIAAABDxLP8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MTI6NTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2ZDI0NzYwLThhOTYt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"}}]); \ No newline at end of file diff --git a/assets/js/71880105.a92b59bc.js b/assets/js/71880105.a92b59bc.js deleted file mode 100644 index 80a2571e..00000000 --- a/assets/js/71880105.a92b59bc.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[5758],{3905:(A,a,n)=>{n.d(a,{Zo:()=>p,kt:()=>m});var e=n(7294);function t(A,a,n){return a in A?Object.defineProperty(A,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):A[a]=n,A}function i(A,a){var n=Object.keys(A);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(A);a&&(e=e.filter((function(a){return Object.getOwnPropertyDescriptor(A,a).enumerable}))),n.push.apply(n,e)}return n}function l(A){for(var a=1;a=0||(t[n]=A[n]);return t}(A,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(A);for(e=0;e=0||Object.prototype.propertyIsEnumerable.call(A,n)&&(t[n]=A[n])}return t}var d=e.createContext({}),b=function(A){var a=e.useContext(d),n=a;return A&&(n="function"==typeof A?A(a):l(l({},a),A)),n},p=function(A){var a=b(A.components);return e.createElement(d.Provider,{value:a},A.children)},c={inlineCode:"code",wrapper:function(A){var a=A.children;return e.createElement(e.Fragment,{},a)}},u=e.forwardRef((function(A,a){var n=A.components,t=A.mdxType,i=A.originalType,d=A.parentName,p=r(A,["components","mdxType","originalType","parentName"]),u=b(n),m=t,o=u["".concat(d,".").concat(m)]||u[m]||c[m]||i;return n?e.createElement(o,l(l({ref:a},p),{},{components:n})):e.createElement(o,l({ref:a},p))}));function m(A,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof A||t){var i=n.length,l=new Array(i);l[0]=u;var r={};for(var d in a)hasOwnProperty.call(a,d)&&(r[d]=a[d]);r.originalType=A,r.mdxType="string"==typeof A?A:t,l[1]=r;for(var b=2;b{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>l,default:()=>c,frontMatter:()=>i,metadata:()=>r,toc:()=>b});var e=n(7462),t=(n(7294),n(3905));const i={sidebar_position:12,title:"A.12. Perulangan \u279c for in",sidebar_label:"A.12. Perulangan \u279c for in"},l=void 0,r={unversionedId:"basic/perulangan-for-in",id:"basic/perulangan-for-in",title:"A.12. Perulangan \u279c for in",description:"for in adalah salah satu keyword untuk operasi perulangan yang ada di Rust selain loop dan while. Pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/perulangan-for-in.md",sourceDirName:"basic",slug:"/basic/perulangan-for-in",permalink:"/basic/perulangan-for-in",draft:!1,tags:[],version:"current",sidebarPosition:12,frontMatter:{sidebar_position:12,title:"A.12. Perulangan \u279c for in",sidebar_label:"A.12. Perulangan \u279c for in"},sidebar:"tutorialSidebar",previous:{title:"A.11. Perulangan \u279c loop, break, continue, label",permalink:"/basic/perulangan-loop-break-continue-label"},next:{title:"A.13. Array",permalink:"/basic/array"}},d={},b=[{value:"A.12.1. Keyword for in",id:"a121-keyword-for-in",level:2},{value:"A.12.2. Label perulangan",id:"a122-label-perulangan",level:2},{value:"A.12.3. Perulangan for in pada array",id:"a123-perulangan-for-in-pada-array",level:2},{value:"A.12.4. Perulangan for in pada tipe iterator lainnya",id:"a124-perulangan-for-in-pada-tipe-iterator-lainnya",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:b};function c(A){let{components:a,...i}=A;return(0,t.kt)("wrapper",(0,e.Z)({},p,i,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"for in")," adalah salah satu keyword untuk operasi perulangan yang ada di Rust selain ",(0,t.kt)("inlineCode",{parentName:"p"},"loop")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"while"),". Pada chapter ini kita akan mempelajarinya."),(0,t.kt)("h2",{id:"a121-keyword-for-in"},"A.12.1. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"for in")),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"for in")," adalah keyword perulangan yang paling sering dipakai untuk meng-iterasi data yang tipe data-nya mengimplementasikan trait ",(0,t.kt)("inlineCode",{parentName:"p"},"Iterator"),". Ada banyak jenis tipe data dengan trait ini, salah satunya adalah tipe data ",(0,t.kt)("strong",{parentName:"p"},"range")," yang akan kita bahas pada chapter ini."),(0,t.kt)("blockquote",null,(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,t.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai trait ",(0,t.kt)("inlineCode",{parentName:"li"},"Iterator")," dibahas pada chapter ",(0,t.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator")))),(0,t.kt)("p",null,"Tipe data range dibuat dengan notasi penulisan ",(0,t.kt)("inlineCode",{parentName:"p"},"a..b"),". Mari lanjut dengan praktik agar lebih jelas. Silakan coba kode sederhana berikut lalu jalankan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'for i in 0..5 {\n println!("{i}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"perulangan for in",src:n(2472).Z,width:"446",height:"169"})),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"for in")," jika digunakan pada notasi iterator ",(0,t.kt)("inlineCode",{parentName:"p"},"a..b")," maka akan menghasilkan sebuah perulangan dari angka ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," hingga angka dibawah ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,t.kt)("p",null,"Pada contoh di atas, ",(0,t.kt)("inlineCode",{parentName:"p"},"0..5")," artinya adalah objek iterator yang dimulai dari angka ",(0,t.kt)("inlineCode",{parentName:"p"},"0")," hingga dibawah ",(0,t.kt)("inlineCode",{parentName:"p"},"5")," (yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"4"),"). Object iterator tersebut kemudian diiterasi, dan ditiap perulangan di-print menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},'println!("{i}")'),". Dengan ini, nilai ",(0,t.kt)("inlineCode",{parentName:"p"},"i")," muncul di layar console dimulai angka ",(0,t.kt)("inlineCode",{parentName:"p"},"0")," hingga ",(0,t.kt)("inlineCode",{parentName:"p"},"4"),"."),(0,t.kt)("p",null,"Jika ingin melakukan perulangan dari ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"b")," (bukan dari ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke angka dibawah ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),") gunakan notasi iterator ",(0,t.kt)("inlineCode",{parentName:"p"},"a..=b"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'for i in 0..=5 {\n println!("{i}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"perulangan for in",src:n(1154).Z,width:"445",height:"192"})),(0,t.kt)("h2",{id:"a122-label-perulangan"},"A.12.2. Label perulangan"),(0,t.kt)("p",null,"Penambahan label pada perulangan ",(0,t.kt)("inlineCode",{parentName:"p"},"for in")," juga bisa dilakukan. Caranya dengan cukup menambahkan sintaks ",(0,t.kt)("inlineCode",{parentName:"p"},"'namaLabel: ")," sebelum statement ",(0,t.kt)("inlineCode",{parentName:"p"},"for in"),". Contohnya seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'\'perulangan: for i in 0..=5 {\n if i > 3 {\n println!("perulangan dihentikan paksa pada iterasi {i}");\n break \'perulangan;\n }\n\n println!("{i}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"label perulangan for in",src:n(8267).Z,width:"448",height:"180"})),(0,t.kt)("p",null,"Selain ",(0,t.kt)("inlineCode",{parentName:"p"},"break"),", keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"continue")," juga bisa digunakan pada perulangan ",(0,t.kt)("inlineCode",{parentName:"p"},"for in"),"."),(0,t.kt)("h2",{id:"a123-perulangan-for-in-pada-array"},"A.12.3. Perulangan ",(0,t.kt)("inlineCode",{parentName:"h2"},"for in")," pada array"),(0,t.kt)("p",null,"Perulangan menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"for in")," adalah yang paling praktis digunakan untuk mengiterasi elemen array. Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let array = ["jason", "grayon", "drake", "damian"];\nfor name in array {\n println!("{name}");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"label perulangan for in",src:n(2977).Z,width:"445",height:"149"})),(0,t.kt)("p",null,"Perihal apa itu ",(0,t.kt)("inlineCode",{parentName:"p"},"array")," akan dibahas pada chapter selanjutnya, yaitu ",(0,t.kt)("a",{parentName:"p",href:"/basic/array"},"Array"),"."),(0,t.kt)("h2",{id:"a124-perulangan-for-in-pada-tipe-iterator-lainnya"},"A.12.4. Perulangan ",(0,t.kt)("inlineCode",{parentName:"h2"},"for in")," pada tipe iterator lainnya"),(0,t.kt)("p",null,"Di Rust ada banyak cara membuat object iterator. Mengenai topik satu ini kita akan bahas seiring berjalannya proses pembelajaran. Akan berpotesi makin membingungkan jika dibahas terlalu detail pada chapter ini."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/perulangan_for_in"},"github.com/novalagung/dasarpemrogramanrust-example/../perulangan_for_in")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/loop-expr.html"},"https://doc.rust-lang.org/reference/expressions/loop-expr.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.in.html"},"https://doc.rust-lang.org/std/keyword.in.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.for.html"},"https://doc.rust-lang.org/std/keyword.for.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"))))}c.isMDXComponent=!0},2472:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAACpCAIAAADbS88pAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjE6NTE6NDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjU3OjQyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjU3OjQyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU4YjE4OWUxLTllMjIt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"},1154:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAADACAIAAAAfhyq4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MDY6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjU2OjU4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjU2OjU4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU3ZDY3YmNkLTQyNDAtMzA0Yi1iNDM2LWQ1MTVkY2RmNGYzNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1N2Q2N2JjZC00MjQwLTMwNGItYjQzNi1kNTE1ZGNkZjRmMzUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1N2Q2N2JjZC00MjQwLTMwNGItYjQzNi1kNTE1ZGNkZjRmMzUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjU3ZDY3YmNkLTQyNDAtMzA0Yi1iNDM2LWQ1MTVkY2RmNGYzNSIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNlQyMjowNjowNyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pk8d3O0AAB1zSURBVHic7d1NbBvnmQfwh1Qpy1FKU6UicbXOWKy6jBnIqcerwuXqwCAXxgdfCAMDCOjBt9x91qln3/eWgwEDBAwCgVEYWnSD6OCqwhpl0USRl6iXEpEatCLCjBw6slmKe5gZztc7w/fl50j8/1AgNUXO+zHDh/PFPwOSJBEAAHALjroDAACnDOomAIAY1E0AADGomwAAYlA3AQDEoG4CAIhB3QQAEIO6CQAgRrBuyhklm5aIiKR0VsnIfe+PnBnEUntgjLgbArPUXUO9dW8grF2SM4rSsYvco+hxq5PSWUZDHVv34SQDjXTF/UzguVI6m5iubG2UiYjeDKI3RIXdSjaVTVfzm2Wvp8kZJRFp/6tWzG0UnI8bD3u+ulHZ8mitsFuJr8QlKlueIWeU+LHXy8SxGyIiKZ1NxULevewD9tQNYKAMzLFb15K6mobXOviNc1Mc4Yrjr5tSeiVGla0Bv4OovJmPZpSVtFTu1JL+3pbS2ZSSodxGVa3rOa4uml+dyqbJtTSUS9WVVFKmMrME95FLQ1I8SpViJRof5AYiiUydkMJGjmPiXMbu+LAYzE7f0FYx9NfoVhx33ZSTrKrZ3ido76Coe0dEZN7qTQ8yn2ndMyzsVuICs1HeLCWVxBxJ4WioUS0JvvPVOp1oNydnlETE0p/yZimpxNNSoWNRYY6dOsyS8SCzISkeDdVLhRKZP1nNL6dGxaV1OaPMHVemY7FQo1KsRhPuO61S3Dl1psWlFCWl97SazqamSqZhaP9gdMl4yDKfpv1Ioz/8k8ycT+YymQ/aFqIugT3zXJNsf6bXG0HdY3pCK+ofasXcRkFKZ1foSWkq5b6FqI+5rM0oY5kcE6L/4SjJfDn/tuQcJntELmPvuC3p2xxjUyy4vWWGsOJ466Y8F2lUt0ydCxJRJBGvbOVyZZIzSiIjFzYKUjpJT3K5sta8utsopVdidfsxs5xJ6Q9KaduheblUXUnNyURCHyPlUnUlFvPcd2SrHjcoGpaI3F5VOKglOu/uscZOxJ4lxoSwG5Li0VCtVKCyXE/pfzFNHckZJe7W+hFRJDZVzBXnlERC/a/LKFhTV97MlxkHR+w9PmaX1CVI6WxqyjRJxo6tlM6mUhm5rM4D3ySz5rPKWib7QaO/inX/2tE67yS7bN7MZxJRKJZK1Yq5XEFKZ1PxNBVKRKFYyr6FMN4dLmvziLVM5iTLGX2HQEpnU7F6Mb9ZJjlpf7lU2CTubYnizG2+PaL2It3GzsCYT/amOMoVx3ldSApPU/3IvkXXitooCgc1iszJROXNDX1c5VK1EZqKak+NzFnP5stzkVpR63F5s1QLReOmd2T5qE7TYc6DMjmTiDQqu0TlzXxuq0KxlMJxKcKkfFQ3/lHYyOUcFa2wW6FYssP1CLexO2eJyDkh7IakeDRUOyioL1bnSErHjanr1Hqjslsw/9e9791NndZLdpcY5GQsVCtpHS1vPqk0jHlgTHJI7ZCiKIpxOcg2n8xlsh/UxNWiaX0HWlsXmmRirE3XZzYqWxuF9qOMEU2Hme8O9bXstWlbJnvs8lyE1E2JyqVqw/T+sr48KrItddrmO4+djf3uYBrNiuPc34xOhWyPWAtu9bhBU2q/TfvIRDW1K/loRkkoSsLYlw9PU0R9pN0t2/ISU1H3PUAiMl5vPghT93HUT1klE3W5MGQlhaeJjj2fwrUHzBq7hT5LjAlhN6TvbRIZH6zsD2mO1jvpZuq60DiuuvzFOckdLoa1tzrmMl0aCsViEWpUHOdzul7F7LXpsjqMsyH6dDv6N0USeb87bOzLlDOssVePGxRTx2c9LePoksi2JLLVdR67/ke3dwf7+aNYcZx1s72FuohOhRrHBZIzqRjphz/mAzT96oCcUVLZNOVL5HG5W1+e2/tL4/X68uaTeDblefDdJsWjIcbOtH2Bnc6/uY7dYBqVfUJMh8dGQ1I8GqKQ+Q3UiLvUTY7WOYlMXTdCps9D28ex0ElO0uaTaIq9TJeGGpWtJ7RiOkHA3zr35r0Z7X51NNRPcMfWLWe4F8EYu0zlo3oqplfjhtcFXt5tabMsZ5Q+bXVWru8OplGsOM7jdO8DZykdjzSq2htaq0BSeiVm30dV6y+RurMbSbjeicc+LSCCqxgSqVMaMu3ZyxnzMaFJ+0DZg+fYtVmydkmfEGZD0alQo7KV021VGqEolY/q+tGFlM6az/N7ts7PMnXV44Zz1NqWIGe0D2b3LjHGRpG4dh5ASscjtkNOnklu91Pb6ljLZD+oK2/mi7VIwnE+wmi9y0m2rE3x1SFnEpFGtdTp3dEJc5LVA1h9U+q4E8ff+R63Ovu2ZGGZT+amqBr+iuO9LlQ4qCUS5mvc6nUh25FyebcST2kP1iqVRmyK7Du+taJayzfzlM6m2rtSlh1y8+EpP9vVQq/dUVvf+W6/sV3mD8X0a3ta71ljt7eU10/VOyfE2VDUdi2uXKquxLLpar5Y044uasWtSnyl/RpW61zcp07d+9RGWivmNgrGA41KsdJITBFRYaM45+iSeZgJRUmoL9/IUUYxXRV1Gbs6yY45Zs5nmbVM5oPGm66wsRXOplJKNm4+EDRaZ46IOcnMtcl8I7hynnFivDuOvJZgxZzkcimpWA5dXA+BebeltNTbVmfeuIxtyfXd4dwUbV0e5ooLcP9OhpTOpqLVgd8CTcO617obQ+uZf6dg8EY79mG3brkXZ3jtDO/dPCzDXXH8972r5Z7nhvSeWL6U5Dd8N3GfpoZ8aLRjP6szbz2VzH0a6/QY7ooT+Z4l/1d5uicnY3XHwRsA9MZ0/EpEHU9jgTf+43QAACBCjhwAgCjUTQAAMaibAABiJi5cuDDqPnRtNrB2ZeKDUOvbmvrvwK3rE1cvBq9cDF4Jt74+9HimD0np7Ke//Wh5eXn54uTOM6/v1Q2bnFHSK8vLy8vLH8y+2t3/oU9L7NfC/EPOKP9xUXRQXb2oTUpnP708xbW9dNdQb90bCGuXuLYl7lHwzqfI9fRefHx1YuGc+n9Pnm63/tK/JU+eb//f1oPtJlHg1vXgZIdn+hArPcgPjBgdH3PNJGSRM0oi0vmbz0LLtN5Ah2BshjMVjD2Uuvnx1YmFc+1yGfh4kWivH8s9bN0/bPb5mWAlhadJ/LtbHfT5XjtTdJicURJePxcgZ5QEVSoNirL/3s0yiYiR6o1gbEsjZywYe/B189JicOEcvXzW3sdsfbVHRESzgbUl/fTqUfP+buDG9SAdncyEg/Tm5Pmb4EKY6Kh5//vA2lLg+YvWwnyQiOjNyeO/tvbNO5VHzfu75I71zFnmMq1dInLdNebOmhWLa2XizYVlf3yW+V/uwpmExcrEZQ2z03iMJ3F3Sc4oCTL+KmeUBOW2juORRmVLS43arcRTUbcKIGfix1u5TUpnYx5DJv1b3VzLVBfMTPUmIgRjtxs5U8HYg78uFD0fIGr99Nr66GxgbSn49kXz/nbz/rMTCk/cWiQimjlHj78+eXsuOPtT8/GLFoXVZwcW5unpdvP+9snbc8HfLJJ6SH5/++Rt5/bdnqkv89kJnQt+OEtEgVt6lx6/aBG1nn/tfj4hFEvFj7dyuVyuWNMiGLQ9FDWBY9pIjQjFUqmpkprLEYmnOabMoKWoqsuk2Iq2zHbr6iIlah9Oq4/pAYj8L2c1nVUURUlE1O9P6xGY+o6DvsyUHj9hG6bbB3d5M6/3kTmfnq+2JJiqu8IHFJ0y3pJqPIQRmmh//QbnAaHAMom0VG/3XxqoHje842T54kxc1iZFEvZNUUvk1Zh/SsHRkJ7wWj6qt/9i2pJzxZpn65HYVClXrIViCfW/LqMol6qNUCxlSVJRt4RijYzsGvdPcGaXWNuS6/bJnxnjmE/GMgdfN8PnGA9eey9IdPJ/e0REdNh6/oYmI0REb2ut/ddE1Do8sDy/vbtaJ5qMBC71o2OmXWCafpdolib1dvd/bHV6NU/WrLaO+ONaHbhzYdmptGKxsvam8/pGqufobBS8gocd8bdCeLpEVNg1GpTiUTLSlNQyn6Birljjz7z2xrvMTvFdCMY+c8HYgz9OP3pDC47SySymHFo/vaGZXnvk4pDeLgXOv0P0WivrR687v0jlmTXLGdfKxpsL65JK23OYMYNLMCoj/nYAjJBaKR6l6pMyUdT0IwZEJKWzVD/ovQMCy2Scy7BAMLba9BkKxh583az+1KKwVo9cBM6f4/xh4cD5c0RHrf3+dc9mZmlibYnIujfakVvWLHW8/OCNP42YmUrbvzBjM4/g4SHQt30prJVNqh43qFHd0meeJ/K6I7Fldkj1RjC2baRnIBh78Mfp+3utl0QzS4Fr2gOBG4v01XcnRMFfLhIR0SzNEL38rvOiLi0GZohefj+Qfl5aDEzSydPt5v3t5v3t5qPDzi8h6jpr1jOu1YIrF9Y9lbZPYca6TsHDg1cuVRvTYTkerWuHTuq5M+18mzUcWj3Q5jkstD3TY5msLnmleiMY29HPMxCMPYz7kFqPtk9uXA9evk6XSb14TUStx++2Vucn1uaJiF4+az46DNxYcl2EaTew+ejQeuE7PLF2nd6+aD740f6gfjne+UxGE/t7rQ/n9U6SqS02rqxZ9sdax7hWI+WXNxdW/S1keyptj7GyTJ2ChztgDlNs71Ada6xW3Gw/kKe0nmjreeRlbj2WUpSU67P5l0nESPUmBGNbnLlgbP/nIc0G1paCniWsP64lJy6HjRuPPr46sUD6/Uk2w8qa5XfmU2n9rk8zjmDsIejH2If1fSH/s16q4j/l6gtnPpXW7/qU6o1g7CHox9hRN3Vf/dV0MoFMN8OfBj2l0toOonQ9fblyEMv0t2GkeoNf+P84HQDAX5AjBwAgBnUTAEAM6iYAgBgf5hbzZwzzPHM2sHZl4uKb1t+5vzQp1od+Brv2PyC4i/a5mu5P8PAgMnE9lymQ8uvZAvfYudao8SS/JVazdV5tckb5dZh3KKcyxHpk19Nt6cKt51+ffGUqbfwZw/5OIxY18PRYIhrvu/eGiDPyWb0vhuu7i6O/v9Mcz+yqsFvJpjpFlvaDeLZ0O6HZ9nV7EnvvjfY+JGZ0JtKIR4X/xjbc/sdhIJHPo+WMZ2YTuSmr+22pi2zpeq0Wmda7aHqunFESJHDHs7/u3+TPGHbJLTZ//9J8A+a7gVtLwUnLg8YS3r5oPthzvNxbp2BX9dOPlbMrcgcjM+G42jm32D2iuMoOiy0wImBdUmmJHTxs+ew2Z507dgeYU+c1Axzfw+FbHRpbKq1bjDQjB7oUFwld5ot85uSS8msN9O0QI90p2dq2JdgbYsYzMwOSiRzfGu0wqC5CrAWzpbWSfzCVijv/KM8Zi3IdkZm/6qbbDwQFFuZbT7ebf5kNrC0FP5xt7h8yn6kFD2tF0GRmnqwvD9y6HpxUC+5sYG1p4saPzUekRSk/2OtYQE0fdCRnlLj9QSmtHaYc1BIJI7Srb/sfoVgqXtnK5cpSOpuKp6XCJpl+h0BKZ1OpjFzeqJqeSXJGSWTk3Ea+zDoKY/+6USQ2VcwV55REQv1vPC7RJuOZps9uOaPMHeiF1zkhZebU9Yh7dRARRRKWCSm4fDveOMaW0tlUrK5mMpaZvwFlXx1VvWCR9sXp9meWcx3xbg7qFDtXnBYnrKcUtXfx2jF47U0kyhoRa5bYDZEWz7xlrZor7Zl39LhzNJ7Lb2o5N29WMXRmS5MptcimvaMczaQYf4xHaqVcO7TEbUQmo72eHp5Yu67+r52WxGbPGHY3Oc9YlO3llxYDk9R6ru6LHtJLopn3rFHKntgpqszcYvec3d7YU35Z0arWZ2r5ymJfcuBNpW2TMwnSJ4ExIQIBtPy4V4f6B3sqrctAmDnQbmyrQzjyuQduYca2GOkye0TuYdsMLvHMrqPwjInyxBdirXaKK1taTsao8sRl915OxqxvTI714sPzm91r/c+L1uq8OXiJ/UXJ6PkAES1cmVgzPdhtlLJGCjNzixk5uwPCEzoZcv9A7gc5k6CifrLKZUI4WQ68Y5yxRObXc7TuFZvpkgPdo96DQZ1c4oSdadmMEUlxkXXEOO/gEZBMRNXjRmKgWxxntrSc8biUpabFtfeivUfU5q/j9F7t753s7xFpv6AZ/HC2yayb1Z9aFCbbFfyPr/bcPOtsiDNnd0B44oQH8b5ts1RNlWNCJN6fV9KP/HvJGXKuDuveiJZKy26flQPds/5HPveWbC2RSGQA+3PGNSC5TxHSnt3hypaW5yIUIiMwjiilKEn9vE4yFqoVLavXY0RtZ/S+91LN6weC9vdabymwYP2VolKtRRScnyWiwA3Pq0PMFFXX3GJHzq4groRjVrSq9RlavrJHWGxPpHTWOEInIpcJ4Q+g5Se2Okw9VlNpicg5ye450N3rR+Qzc8V1n2ztPkushryPu50ByZ1+dqlH3HnVhY2cQf8dOP0yoMdqYEQ+t/lqf5OdRsz/TMvFnLcv1IRjZkutB89O1pYm1q5r/375rPlo7yQemVhYmlhbopfPTl4uBafd+slMUS275RY7cnb5MROOXbrEiGuViJWvbF2u4zJ7OwL2gNGM9bY3I3hYfcsaR3xqAC1jQphT1yP+1UHMCWFMMjsHmphjF+hnT5HP6qjsKb+9JVt7bLT2hogRz+wZkGz+7SK2HkOsxbKlme2v2Hc2O0U+65CH5CP9vqvZf/nKp8UIcqAHvLL6MyKBl53t71ac0eN0gF6cvRzo/oyovPnE/MvtrtRvFbldwD4DfHWcDvoPngzn65bgpqccaFHG7ei1QTXRvxFxfRNITsbq3ZyGOD1wnA4AIAbH6QAAYlA3AQDEoG4CAIjxYW7xIAjkEPNQk2Z9lTLbMUx2oIG+g0ggZpLS2U9/+5EfM377Hzo9skBfH27efuOn6+mXFoOr84H2P5nJRr3oX8JxYUPNmVEyZLkqOcJY2cJuJb7ilaM1UENr3SVBZ+Q4I4pPB7fNG9r8VDdVL581Hx3SteTE5fmJGz82Hx32Y6EDSDi25p6OXrlUXemUd3hWWx+5gUQUjzQc2m+bt8/4r26q/vL9yeVwkEj7SqVaTNX/r3+l0hFmzJ9wzH6mM3bz5Om2EUDnyQexsuXNUlKxpxUOKdB3s+xs3S2AltE6a0LcWu80/e6ZzfZ0Z+Ykd3i5C76IYpf17jmeLgJ9bRNiytwk/bZgOaNYwjj5f2oCiMhf5zcjkYD0buD4Zevvr+napYnZc62X/2jthQJXfqE9SO8Ervwi0Ky3vn0buPKL4M/fbT3dPvmvN3TlveDP37T+TqwHX9O3/2h9/Q/64GJg4k3ra3Xv9R3mMwO3rgSbL5q5ndZRKCC9S8+/bm25f7Pf6of93Z2dncmLy+Ha1oM//GlnZ0c9OSSlfzvz7Rd/+NPOzs6r2WTyV3Ovdvd/+JdfLc/Nvv/+P5/lvvjjq9kP/m1h7tXu/i8z6X89Lua++OPOq9kP3n/3VfHBf/8vyZlPLzWKuS/+uLPzavbXV/997tWfN//MbIiIqBK++NHCz03nw0wv35m8uDzzz+92939wLnN3nxaT78/OaYucvLiS+NXkzrOfFpPv/6ymLf6C/g+Z1U9W6xcWk5dil2zLrLBaZ0zIzm6N2Xp70eZ/siaZTK235/gHZuf5X+5c79r51ugU0VR0uf3japPp7NUL36sr6NVsMpmUJneeVZjrnXnuUt2cXs1+YBrmBc4uWde7Psl/+9vu5MWPLi3OGpua+hnIWB2c2/w489/19JmlibXrE5fPnTzetuS8OTHDjPkTju3PnKVJah0eEBHt/+gVpyRiiLGyRFTYrVAsqcfbDDvQ19q6c5nTYa8RWSfEa5QObpPsiL9ld5775cymBSOKrcP0jORl4Av0dZnkwsZWhWLJtGmzEN3AQOO/4/SXz7SfrPjNYlMN0xySQ3q7FDj/DtFrLfv9SOing10ML1aWiOe3CQYZ6Nuh9dAUSeTWunNC3EbAGhR7knk7z/tyES5ZkI5hDoD7KlZTjmJ1PSa1t2zpcea/uklEdNh6fpEW5gPX9jhPL/bNzNLE2hKRdW+0e8OMlVUXwzrJaTewQF/v1rVlMkYkuttl1dskC7xcRP8jioWwNxs5k4pWi5Wo+acfcVKzG/47TleZUoSJtCPuDnHCPbq0GJikk6fbzfvbzfvb3V3HH2msrKZwoB9tjSLQ12jdQktN5mjdgiuzmYh6mWT+l/PrR0SxAGtMr+sky5lEpFbaLBiZRoKrA9r8ub9JtL/X+s18YOZi4NJfW0/fo8vzE2vzneKEmbizkPf3Wh+2f5uIiPQ7okSMNlZWY/wA69ACfcus1l2W6TIir7k0MpuZSbc9TjL3ywX0GFHcn0BfyyQfJdUr6AXS50H9DQje1QEWyEPSXUtOXA4bNx59fHVigVx/2a3v+huUO7j773n6KWeU+HEuX/JdavII0ojhbPLr/ubwWX/PMnD+HNGb4bXe36Dcwd0xzdNPrXX/fR6fvTRiGBHsbxoCN64HZ9r/cv8Z4cGw3pDt37P13P3046909DDJthvmu1rGMJYJw4C6CQAgxq/X0wEA/Ap1EwBADOomAIAY1E0AADGomwAAYlA3AQDEoG4CAIhB3QQAEIO6CQAgBnUTAEAM6iYAgBjUTQAAMZw5cqvr9+7IamBw6WH2zucD7BEAgL9x7W/evntHPniYzWaz2Yel+M1766uD7hYAgG9x1M3V9U/i9UJe3cf8PF+oTyc+QeEEgLHFUTcTkel68cvHRKTueU7TdCTR4TUAAGcW93Wh1fV7+Xz+Jj3MPizR3EXscALAuOK7LjQt37lTepjNfk5Eq+v36OCbx4PtFgCAb3HUzWKtTvXiXf0ieiIyXa8VB9srAAD/4jhOf/xlsT4tf6ZeRF9d/yTePtsJADCGOH+Xzbh/s164+7vfo2wCwPjC71kCAIjB9ywBAMSgbgIAiEHdBAAQg7oJACAGdRMAQAzqJgCAGNRNAAAx/HXz9t18Po/oTQAYe3x18/bdfH65VqgPuDMAAKcAT928ffeT2t3snS8H3hkAgFOAJ0fu8zu/IyLCEToAAOG6EACAKNRNAAAxqJsAAGJQNwEAxPDkbxqhxRpkFwPAGENuMQCAGBynAwCIQd0EABCDugkAIAZ1EwBADOomAIAY1E0AADGomwAAYnjykCx3vpceZu98PsgeAQD4G8/+5ur6Z4ni3Ww2m80+LMVvIvMdAMYaz/7m49//Tv9S5efflG7ejCSI8C1LABhXOL8JACBGrG7evnszXi/kcX4TAMYY33UhIiJaXb93M156mEUSEgCMNd79zdX1e3dkKtzFtXQAGHdcdVMvmgjdBADgyt+8fTd/M25+ALnFADDGkFsMACAG9yEBAIhB3QQAEIO6CQAgBnUTAEAM6iYAgBjUTQAAMaibAABiuL6fbr7xHbnFADDmBO97X12/dydRxLeFAGCMCR6nP/7uYDD9AAA4LQTr5u3leL34JXY2AWCMceZvGj/MVnqYRdkEgHEmmuuBE5wAMO5E70N6/GWxPh1JDKQvAACngWjdvJ2Vp0vf4EYkABhfPOc3jZObhPs3AWDsIbcYAEAMvmcJACAGdRMAQAzqJgCAGNRNAAAxqJsAAGJQNwEAxKBuAgCIEambq+v38vn8vfXVgfUGAMD/+Ovm6vpn8kGpNMC+AACcBrx1c3X9M5kK+W8G2hkAgFOAr26qVfM/ER4HAMBXN29nUTUBADQcdfP23ZtzqJoAAJrOeUjmHwFuQ5ocAIwtwRy523fzn9TwKxkAMM5w3zsAgBjkFgMAiMH+JgCAGNRNAAAxqJsAAGJQNwEAxKBuAgCIQd0EABCDugkAIOZnPE9aXb93R55u/xNfsgSAccZVN4moXsC3KwEAiHCcDgAgCnUTAEAM73H6tHwnn79DhLObADDuRHM9Vtfv3ZEPUDoBYHyJHqc//rJYH0hHAABOCcG6ubr+mTxd+gY7mwAwvnjOb5pv36wX7mZxPxIAjDPkFgMAiMF9SAAAYlA3AQDEoG4CAIhB3QQAEIO6CQAgBnUTAEAM6iYAgBjUTQAAMaibAABiUDcBAMSgbgIAiPl/GSIP/OXqVSQAAAAASUVORK5CYII="},8267:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcAAAAC0CAIAAACMg2tHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MTA6MTMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjU4OjM1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjU4OjM1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjA5M2EzYzkwLTQzNDEt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"},2977:(A,a,n)=>{n.d(a,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAACVCAIAAABDxLP8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MTI6NTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2ZDI0NzYwLThhOTYtODU0NS1iMDhmLTc0M2U2YTUzNDg5YSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkNmQyNDc2MC04YTk2LTg1NDUtYjA4Zi03NDNlNmE1MzQ4OWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkNmQyNDc2MC04YTk2LTg1NDUtYjA4Zi03NDNlNmE1MzQ4OWEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2ZDI0NzYwLThhOTYtODU0NS1iMDhmLTc0M2U2YTUzNDg5YSIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNlQyMjoxMjo1NiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnJMBkMAABl1SURBVHic7Z1PbBvXncd/lEpFKVOZLhWZ61XGnirLWIXcZrIqXK4OLHRhc9CFCEBAgA+6+c6zTjrz7psOAgIQCAgEQhFo0RWWB1U11ugUTRRliXppEWnAqCbMyGEqh5W5h5nh/Hsz8x7/S/l+YMDi8P39vTc/vn/znZAkSQQAAICbiVEXAAAALhnwmwAAIAb8JgAAiAG/CQAAYsBvAgCAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACAG/CYAAIjB7TeVdDaTkoiIpFQmm1b6XhIlPYhUe8CscTcIWKm7jHor3kCwF0lJZ7OBReSuRY+9TkplGBkF5j6GRgY0Bg33I65QUiqTiNQO96pERC8HUxL1uJZJZlL1YqnqF0xJZxPRzqdGubCnuq+bl31jt2qHPrmpxzV5WZaoaguhpLPyuV80cdgZEZGUyiTjYf9S9gG26QZQUQbMuttbSWum4eUOxg13Vxx5w/H4TSm1HKfa4YDvIKqWirF0djklVYNyMu5tKZVJZtNU2Ktrfr3AVURr7GQmRZ6uoVqpLycXFaoyXXAf8chIkmNUK9di8iA7iCRiOiHUvQKH4Tzq7vqxGMzYYWhNDPrLqBuOw28qiyyv2RkTdAYo2uiIiKy93nKRGdI+MlSPa7KANaqlymI2MUfSTCzcqlcE73zNTyc62SnpbCJqK0+1VFnMyilJDXQqzLpTgJXMi8yMJDkWblbUCll/Wa3RqVXzyF1JZ+fOa5F4PNyqleuxhPegVZLdprMkl8xmk0ZJ66lMcrpiqYb+gVEk85LNnpZxpFkefiMz7clMk3nRkYiWAtvyXEZ2hvS7EbQR02Na1r5olAt7qpTKLNPjynTSu4do1zxaM8ZIk8Mgxhdni8zo/H3JXU12jTzqHtiXjD7H6Iqq1y0ztIYL9pvKXLRVP7QUboKIogm5dlgoVElJZxNpRd1TpdQiPS4Uqnr22rBRSi3Hm845s5JOGhellGNqXq3Ul5NzCpHQz0i1Ul+Ox33Hjmzq5y2KzUhEXrHU00YieLjHqjsR20oMg7AzkuRYuFFRqao0k8Y3FtORks7KXrmfEUXj0+VCeS6bSGj/e9SCZbpqqVhlTI7YIz5mkbQUpFQmOW0xkjmwlVKZZDKtVDU78BmZZc86K032RbO8Wfv42pU7r5E9ujczJBGF48lko1woqFIqk5RTpFaIwvGks4cw7g6P1jxjpck0spI2BgRSKpOMN8vFUpWURWd0SS0Rd18imdnnOzXqJOlVdwYMe7K74ugbLnBfSJqJUPPM2aMbZb0W6mmDonMKUbW0Z9SrWqm3wtMxPWh0zr6ar8xFG2W9xNVSpRGOyZY7snrWpMgM56RMSSeirdoxUbVULBzWKJ7McmxFWKieNc0P6l6h4PJo6nGN4osB+xFedXdbichtEHZGkhwLN05VLbJmIyklm6YLyr1VO1at/3uXvTvT6aVkF4mBshgPNyp6Qaulx7WWaQeGkcNagbLZbNbcDnLYk5km+6KOrDlN+x1oz13IyMRoTc+Qrdrhntq5yqhRZIZ5d2hx2a3pSJNdd2UuSlpXomql3rLcX/boMZG+FNTng+vOhn13MBllwwWON2PTYccVu6utn7doWiu3ZYxM1NCKUoyls4lsNmGO5WciFNWudIrlSC8xHfMeARKRGd86CdPGONqvbDYd89gYsiPNRIjOfYNwjYBZdbdhWIlhEHZGxmiTyPxhZf9Ic+QeRDem64LWed3jG7eRAzbDOr2OmaZHRuF4PEqtmms9p+smZremR3OYqyGGuV3lmyaJ/O8OB840lTSr7vXzFsW1+tmXZVxFEulLIr0uuO7Gl153Bzv86Bou0G92eqgHselw61wlJZ2MkzH9sU7QjN0BJZ1NZlJUrJDPdreRntf9ZdTIJ3619FjOJH0n3x0kORZmDKadCQatv3nW3cRSK6dBLNNjMyNJjoUpbL2BWrKH3+TInRMR03VD2PJ76Pg5FlrkJN2eRNPsND0yatUOH9OyZYGAP3fu7l2Kdd8cLe0X3NW7lTR3Eoy6K1Q9aybjhjdu+W3w8valUlVJZ/vU6+x43h1MRtdwgfN0/4mzlJKjrbp+Q+seSEotx51jVM3/EmmD3WjC8yQee1lABC5nSKSZNGwZ2Stp65zQQmei7INv3XUr2YtkGISZUWw63KodFgwOa61wjKpnTWN2IaUy1nV+39z5sZmuft5y11rvCUpa/2H2LhKjbhSV9XUAKSVHHVNOHiN3yqn3Olaa7IsG1VKx3IgmXOsRZu5dGtnWmuLNoaQT0Va9EnR3BME0sjaBNbpS4CCOv/A99jpnX7JhsyezK2qMquGC94XU00YiYd3j1vaFHDPl6nFNTuoXG7VaKz5NzoFvo6z58lKRUplkZyhlG5Bbp6f8OHYL/YajjrLzHb9xbPOH48benl56Vt2dORWNpXq3QdwZxRx7cdVKfTmeSdWL5YY+u2iUD2vycicOK3cuvE2njT71mjbKhT3VvNCqlWutxDQRqXvlOVeRrNVMZLMJLfpegdJZy66oR901I7tszLRnlZUm86J506l7hzOZZDKbka0TQTN3Zo2YRma2JvNG8MS94sS4O878UrDDNHK1spi1TV08p8C8fSkl9dbrrJ3L7Eued4e7KzqKPPyGC3G8z1JKZZKx+sCPQNOwzlp3w9BKNr4mGDyjrfuwc7edxRlePsO7m4fFKBqO59y75u55DqT3WhzzoaRxg+8Q92XKaAwZbd2vquXtS8ncy1iXh1E0HN9zlvyP8nSPshhvuiZvAIDesMxfiShwGQvwwDNPBwAAYBK4nw4AAMAG/CYAAIgBvwkAAGJMXrt2bdRl6DAbWr87+U64/XmjHyFnQ+t3J+dftv/63WDKQEo6+x/zL45PvhFJ3zOp1PLS0tLS0juz/Umxi/y5suYPGZBKv0zHl6aUyvz2zvTRE7+nFnly4K47V4uageaneizbUAhuNiWd/eUMb1X605dGAt9+el8JfXBvYsr82P7q01f/bXFtU6/zJsQf8jIwcHliIhr1EckfDKYCkS/aCRquxxRHf4CY65wgp/p473hqUXKHVNLZRLTbu24EfpOIiM4uPjx2XXzW/vDZBVd0/pCAB/4jcFf1lCMP3HWXZiIk/tjbWMMrXi5yZLH7vmSRjFPS2YSPo2aHVNLZBNVqLYoxIwUzKr/pxDII7bjU2dD6Quirr9s3b0wQEb18dfDn9gkzpB7YWKzVQxIR0RuhDxYmpmwXzRS+//rio6eu6P4EaaN2tGYTZP66OT7y5eISdq17KN26pWoZCrJeErAMjWEPqVpiqBE7NGRY8rcegX2Ffoj7uRa+5tBxyB57qecyVH4rMrPuzOZgiYgFSClz1tCh3cups0vMGpWqTit5Z8QUL2dK/xLxqY+zlK297emKLEdbtUPVzC3mId/KCkkUS8vnh4USpTJxj0IFDmLHxW+2P3p04ZrCE1Ho5o32F48u/jQbWl+Y+PnsxckzZsjQBwsTphO0cP0G2aOHPrg3MaU53NnQ+sLk+99efEKh9U70AAfK1EZlKTGfNhIJUxWub+MPty4secj0OjVxC3tsCViWxjBbqrbECNkRINO87anheBnS1EzT9Qh3cxCxZI890mSo/FKVZSVXc9QNh0X6k/md3ywPzWYOPGSkeXV2JbUUY+oWM6zkKRLsEi9naQybJQ7Wd2P3Og/ZYyexaVMMT5cF8ZCeZIVUqLRXJHKJ2fnVyMWo9tNnJtfvaf9C7/kGfP6k/Sfj78gbfiGnbjCSckS/dTs0Re2vtLHoM3pOdP1Neu/NCaJX//c0uNRsbVSmErN6bCrzSnKMAuSDuXHqwnrL9Do0ccUeb+CVPe6gpBNkGIElvsuvcMwPd3NoXzhljz0q4qnyy8LRHNVSsVAoFMoNIkOCaE/11WzuHk6d3Sq7Rv7y4Q48VMo8ayGkPm6DLXvMLlQqk81mE1QulAP6N39I7nYZq/XN7mn/z9ftlRsTd+7RHbLP0+3EXg8R0c27k+uWizOv9ZS3hxKz+aMryTGqPx7cOnmgXinZZRkHgJJOUNlYrAqSpvbHNvHWVZFEZrY8ufuJynqq/PYETxuJwq2zy6iRJIu0EWPdwV9jmEd9vCc6g2oiklIZap56ZcUdUkg1eVzm6b1y8vTVyVMiot+8O3nztYmfz14w/Wb9H22aIccO/m/e7Tl71mqI4TilmcG6TT894A6DuG872LymhssgUoozMWPm34tuj7s57GMMXfaYnT+3yq8IPG0kBr9eNatGEok8qM7+nfHRGOZRH++e+nmLWvVDy2qyV2b8IYlIRDX5yp17rzTaPt+ePG1/T6Gbt9xRJm7MElHofd/dIaY2qqfWbLVSb0VmFDnWrHR18/kKuxr4yvSSFj9hqib7SMB2iZTKmDN0IvIwCL/CMT9izWEpsUVs22lkQZVfLoI0m3lgNhyXzi6zRt5WYmXkP+92K3D3rj7uS7VSb4Xjy5pB7aLg2pS8o0vtE9IPhqa4gzEZb1p3Y2Ym1+/R919ffPQtf0jbZs73X1988oxolplT+6Mnr9YXJtfv6Z+fP7n45OkrOTp5c2FyfYGeP3n1fGEi4lVOpjZq1UuJWXtPcbxRLvFbQocp7OpRJA+ZXo+3MDkkYC3b7B2N4VNGNrbtV1ONuK7dsuaMT1M4ZhiEaboe4W8OYhqEYWStzZwqv8Ssu0A5/TWbOXBr9/Lq7LJr5NNpGSLBLvFyXwXuYPVxdl8SMEaRUkYhfefUzJDW3OPJbDbZqhWKlQBNcTvQQxoL+n2qeViauFePEaj8Drix+lMjgWg/hGcrrtw8HYBeuHoqv/2pUbX0uEbGjNcH7amix1faadLYzNOB8Uad4TxuCbwYqsqveRy9Mags+lcjrieBfijq45inAwCAGJinAwCAGPCbAAAgBvwmAACIMVa6xYNAQIeYB01pdqxUZgPFZAcq6DsIBWImUirz21//Yhw1fvsvOj0yQd8x7N7jyXjsp9+6PbFyI9T5yFQ26oX+KRyre5rOTDZNtl3JEcrKqsc1edlDR2vwDC13DwWdkcMpUXw58OrewMF4+E2N508uPnlG7y1O3rkx+f63F58860eiA1A4tminjQXVSn05SO/wquY+cgYiUTxScehx695jyTj5TY0//f3VnZkJIv2RSs2Zan8bj1S6xIz5FY7ZId2ym6++eGQK0PkyBrKy1VJlMetUKxySoG+p6s7dS4CWkTvLIF65B5nfW7PZqe7MNHJAdA/4JIo92t23Pl0I+joMYtHcJONYsJLO2sQ4uV41AZyMx/pmNBqS3gidP2//9Tt679bk7Gvt539rPw2H7v5Uv0g/Dt39aeii2f78+9Ddn0785I32F49e/edLuvvmxE9etv9KrIvf0ed/a3/6N3pnPjT5sv2pNnr9MTNk6IO7ExdfXxSO2mfhkPQGffVp+zDoyX6Db06Oj46OpuaXZhqHH/3uD0dHR9rikJT69fXPP/7dH46Ojl7MLi6+Pffi+OSbf3l7aW72rbf++aTw8e9fzL7zbzfnXhyf/Cyd+tfzcuHj3x+9mH3nrTdelD/6r/8lJf3bW61y4ePfHx29mP3lu/8+9+KPpT8yMyIiqs3M/+LmTyzrYZboR1PzS9f/+eXxyTfuNI9P6PbiW7NzepJT88uJt6eOnvzj9uJbP2royV8zPiiscrJyv3Z78Vb8liPNGit3hkGOjhvM3DtJWz+yjEyW3Ds2/oZZeP7o7nbX11tj00TTsaXOy9WmUpl3r/1da6AXs4uLi9LU0ZMas92Za5dad3ox+46lmtc4i2Rvd8PIf/nL8dT8L27dnjW7mvYbyGgOzj4Pxmk//frC5Pq9yTuvvTp4ZNN5c8MUM+ZXOHaGnKUpaj87JSI6+dZPTkmEIcrKEpF6XKP4oiFvM2xBX3vu7jQjM341shvEr5YuvIzskr9lF547OjNrQYliezVFX2zDJ+jrYWR177BG8cWUpVuIdjBgY5zm6c+f6K+s+NXtC01Mc0g8o+8XQq//mOg7Xfv9TOjVwR4MT1aWiOfdBIMU9A3IPTxNEnnl7jaIVw1YlWIbmbfwvNFF8FB4dFVzAHg3saZyFG8aMqm9aUuDcfKbRETP2l/N080bofeeci4v9o3rC5PrC0T20Wj3DFNWVkuGtcjpZGCCvv6562kyatTt+wQ1ejOyQHQR+i9RLAS72yjpZKxersWsr37Eomb3jNM8XcOiIkykz7gD5IR75Nbt0BS9+uLRxYePLj581N0+/khlZXXUU2O2NQpBXzN3G7pqMkfuNrg0m4moFyPzR+enHxLFAjBkellGVtKJaKNSUk1NI8HmAA7GbbxJdPK0/asboevzoVt/bn/xJt25Mbl+I0hOmAm3FvLJ0/bPO+8mIiLjRJQIo5WV1TFfwDo0Qd8qK3ePND1q5GdLU7OZqXTbo5G5owvQo0RxfwR9bUY+W9R20FUy7KC9A4K3OQAD6CERvbc4eWfGPHj0m3cnb5Lnm936Tn+Fcgd3/p6nnEo6K59r0tnjpZo8AjVicJUZv/Hm8LG/zzL0+mtEL4eXe3+Fcgd3YpqnnHru4/dLfPXUiMFIwXiTiCj0/r2J651P3q8RHgz2A9nju1rPXc5xfEtHD0Z2HJjvKo1hpAmGB/wmAACIMX776QAAMN7AbwIAgBjwmwAAIAb8JgAAiAG/CQAAYsBvAgCAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACAGp99c2dwpFnc2VwZbGAAAuARgvAkAAGJADwkAAMTw1y1e2dzJKZ23UzTV/P2tA8d15kWq7GZy20REG/nimmyLvrK584Ae7kdz2vVOSAAAuBz4z9MPtu5nNPJqs3N1ZTNDD43LpDzYXCGilc0HyumuHlp3hSubO2tzar4TMpffICKiiJJbbeS1VOVVrJoCAC4V3axvHmzltBEm0cF+uRmJGm+7kpc2rOE2Mkqksq8HPdh6qDblJe2byq42RrVHBwCAy0BX7xeyT9+pQkR0sHU/kS+uFYtr1rl7s1HuSzEBAGBs6MJvbuRzCqn5zNYBaS40qn+xncsYa5q5nU26/yVRJJog0semiajYe3wBAGAs6fIc0umX+lbQA8XtDMsNbS10+7MKdZYvVzZX5aZa7LKYAAAwNnQx3twuqqs5bUJOFVVtKlFyTt0ru5mtA6KDXIbyxVyxmLNcxC4QAOByw3t+c2VzJxfdx5EhAADgnKdvZJQI9ngAAIAC5umOk+zG4SMAAPghg+csAQBADOh6AACAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACBG4HOWFuFhIk3q6MtMcbWRf0gPtMOdhvKwS8x4I19cI1OW2PwIMWMAwCUmYLy5kV+TK7sd4WJDN5MiSi4X3bcqDzPEjLc/q1gkOTeWZKp8tg0xYwDAJcffbxq+jjSJYZqbN9xZU83ntsmiPMwSM94uqk3DcW4syU21uA0xYwDAZcd/nl5uNElZ2iDappXVRKRZ3tddo/nXwdZ97S+mmPF++UFuaYNoe2NJruxnDogSEDMGAFxuAt4v9OUpkbxWLBaLOYXUh95PqBtixo6XER3sl5vy0gZtLMn6uJV0MWMdiBkDAC4bAboeq7LAFo1NzLiiXTvY2s8UV3fmSH2opbL9WWVtbXVzZXvrwBAzzvdQfgAAGDa+fvNgaz+jvzJIw3xxkBOmmLH2zWeVtbU51ZjX0zbEjAEAlxpfPSSHWPHK5k4uUfbynJ5s5IurDeFYAAAwpviON+2LjyuriYgxF+dHP8kEpwkAuCoE6G/aT72LHUfX43rP7QEA4DIC3WIAABADz6cDAIAY8JsAACAG/CYAAIgh4Dc38sUdMbmNlc0d0SgAADDuYLwJAABiwG8CAIAYgbrFNpmjpkpkPAAUrFtsS0c7zamFtYSEQjEA4LIRqFucU053NZWj3Yp5nUu32JpMUdMqzm3b0syrc2tYAAUAXC58/aamh8QcD3LpFmusak7TGIBuLJlpHmztVyKJVThOAMAlInCezoZTt5iIIooiU9OUQ1qZnyPZqrGkT/4BAOCS0KXfdGHoFm8dkK6jpH/RVPMP6UEul9846AxcsagJALjE+M7TD748NV6strK5Y32tJRObbrE1ma37uxVZX8g82C835bX8BjMFAAAYf/zHm9u53SVduLiym1dXH3iH9NQt1hPKz+/kcsWd1fz9rfu0uZPrzNShlwQAuFxADwkAAMTAuXcAABADfhMAAMSA3wQAADHgNwEAQAz4TQAAEAN+EwAAxBiobnEnXhHyxQCAKwPGmwAAIEa/nk/3YTuXwcPoAICrQze6xQyJ4o18camhzilKpKnulhNrSqSp5u9vUSecTcrDrXC8srnzgB7uR3PaQ/AQ/gAAjC/d6BazJYplJbqf2a1ElDXt/8TqCh1s3de0ja1peigcR5TcaiNvlUIGAIBxpBvdYrZEcVMtblv/98RL4biyq+l7OGSPAQBgvOhqfdNDonhI0QEAYKR0sZ9uSBTrM+1mcIx+RgcAgBHTpW6xl0QxJz1GBwCAEdKFbnGARHGHrQPrhHytWFzT9sk5owMAwHgC3WIAABADzwsBAIAY8JsAACAG/CYAAIgBvwkAAGLAbwIAgBjwmwAAIAb8JgAAiAG/CQAAYsBvAgCAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACAG/CYAAIgBvwkAAGL8P8WW/mrC7FDtAAAAAElFTkSuQmCC"}}]); \ No newline at end of file diff --git a/assets/js/7390b81e.18c2ce22.js b/assets/js/7390b81e.18c2ce22.js new file mode 100644 index 00000000..f122c95e --- /dev/null +++ b/assets/js/7390b81e.18c2ce22.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4274],{3905:(a,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>g});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var d=t.createContext({}),p=function(a){var e=t.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},u=function(a){var e=p(a.components);return t.createElement(d.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},o=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,d=a.parentName,u=m(a,["components","mdxType","originalType","parentName"]),o=p(n),g=i,c=o["".concat(d,".").concat(g)]||o[g]||k[g]||r;return n?t.createElement(c,l(l({ref:e},u),{},{components:n})):t.createElement(c,l({ref:e},u))}));function g(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=o;var m={};for(var d in e)hasOwnProperty.call(e,d)&&(m[d]=e[d]);m.originalType=a,m.mdxType="string"==typeof a?a:i,l[1]=m;for(var p=2;p{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>m,toc:()=>p});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:19,title:"A.19. Module System \u279c Package & Crate",sidebar_label:"A.19. Module System \u279c Package & Crate"},l=void 0,m={unversionedId:"basic/package-crate",id:"basic/package-crate",title:"A.19. Module System \u279c Package & Crate",description:"Chapter ini membahas mengenai konsep package dan path dalam Rust programming. Pembelajaran dimulai dari pembahasan mengenai konsep crate terlebih dahulu, kemudian masuk ke package.",source:"@site/docs/basic/package-crate.md",sourceDirName:"basic",slug:"/basic/package-crate",permalink:"/basic/package-crate",draft:!1,tags:[],version:"current",sidebarPosition:19,frontMatter:{sidebar_position:19,title:"A.19. Module System \u279c Package & Crate",sidebar_label:"A.19. Module System \u279c Package & Crate"},sidebar:"tutorialSidebar",previous:{title:"A.18. Module System \u279c Path & Item",permalink:"/basic/path-item"},next:{title:"A.20. Module System \u279c Module",permalink:"/basic/module-basic"}},d={},p=[{value:"A.19.1. Rust Crate",id:"a191-rust-crate",level:2},{value:"\u25c9 Binary crate",id:"-binary-crate",level:3},{value:"\u25c9 Library crate",id:"-library-crate",level:3},{value:"A.19.2. Rust Package",id:"a192-rust-package",level:2},{value:"\u25c9 Naming convention package",id:"-naming-convention-package",level:3},{value:"\u25c9 File Cargo.toml",id:"-file-cargotoml",level:3},{value:"\u25c9 Website crates.io",id:"-website-cratesio",level:3},{value:"\u25c9 Menambahkan dependency atau external crate",id:"-menambahkan-dependency-atau-external-crate",level:3},{value:"\u25c9 Command cargo add",id:"-command-cargo-add",level:3},{value:"A.19.3. Praktik membuat program menampilkan angka random",id:"a193-praktik-membuat-program-menampilkan-angka-random",level:2},{value:"\u25c9 Fungsi generate_random_number",id:"-fungsi-generate_random_number",level:3},{value:"\u25c9 Statement rand::thread_rng().gen_range(0..100)",id:"-statement-randthread_rnggen_range0100",level:3},{value:"\u25c9 Fungsi main",id:"-fungsi-main",level:3},{value:"A.19.4. Pembahasan lanjutan",id:"a194-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:p};function k(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},u,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas mengenai konsep package dan path dalam Rust programming. Pembelajaran dimulai dari pembahasan mengenai konsep crate terlebih dahulu, kemudian masuk ke package."),(0,i.kt)("h2",{id:"a191-rust-crate"},"A.19.1. Rust Crate"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Crate")," adalah satu unit kompilasi di Rust. Eksekusi command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo build"),", atau ",(0,i.kt)("inlineCode",{parentName:"p"},"rustc")," men-",(0,i.kt)("em",{parentName:"p"},"trigger")," proses kompilasi, dan unit (yang di sini disebut dengan crate) akan di-compile."),(0,i.kt)("p",null,"Crate bisa berisi banyak ",(0,i.kt)("em",{parentName:"p"},"module"),". Sebuah module definisinya bisa berada di banyak file. Agar lebih jelas silakan perhatikan contoh berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"XYZ")," adalah sebuah crate, isinya ada dua module, yaitu module ",(0,i.kt)("inlineCode",{parentName:"li"},"Mod_ABC")," dan module ",(0,i.kt)("inlineCode",{parentName:"li"},"Mod_DEF"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Mod_ABC")," adalah module yang didefinisikan dalam crate ",(0,i.kt)("inlineCode",{parentName:"li"},"XYZ"),", source code-nya berada di file bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"modul_a.rs"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Mod_DEF")," adalah module yang didefinisikan dalam crate ",(0,i.kt)("inlineCode",{parentName:"li"},"XYZ"),", source code-nya berada di beberapa file ",(0,i.kt)("inlineCode",{parentName:"li"},"module_b_one.rs")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"module_b_two.rs"),".")),(0,i.kt)("p",null,"Dari contoh di atas, crate ",(0,i.kt)("inlineCode",{parentName:"p"},"XYZ")," adalah 1 unit kompilasi, yang mana di dalam crate tersebut ada dua modules yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Mod_ABC")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Mod_DEF")),(0,i.kt)("p",null,"Rust mengkategorikan crate menjadi 2 jenis, ",(0,i.kt)("em",{parentName:"p"},"binary crate")," dan ",(0,i.kt)("em",{parentName:"p"},"library crate")),(0,i.kt)("h3",{id:"-binary-crate"},"\u25c9 Binary crate"),(0,i.kt)("p",null,"Binary crate adalah program yang dikompilasi ke bentuk ",(0,i.kt)("em",{parentName:"p"},"executable"),", untuk kemudian dijalankan, seperti program-program yang sudah kita buat menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo create")," dan run menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run")," itu adalah contoh dari binary crate."),(0,i.kt)("p",null,"Binary crate berada dalam sebuah package yang dibuat menggunakan command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo create ")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo create --bin "),", kedua command ini menjalankan perintah yang sama."),(0,i.kt)("p",null,"Ciri khas dari binary crate adalah memiliki fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", sebuah fungsi yang merupakan ",(0,i.kt)("em",{parentName:"p"},"entrypoint")," program."),(0,i.kt)("h3",{id:"-library-crate"},"\u25c9 Library crate"),(0,i.kt)("p",null,"Library crate berbeda dengan binary crate. Library crate tidak di-compile ke bentuk ",(0,i.kt)("em",{parentName:"p"},"executable")," dan tidak memiliki fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". Library crate digunakan untuk mendefinisikan set ",(0,i.kt)("em",{parentName:"p"},"functionality")," yang ",(0,i.kt)("em",{parentName:"p"},"reusable")," atau bisa digunakan di banyak project/package."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Library crate di-import/digunakan dalam binary crate. Dalam proses kompilasinya, yang di-compile adalah binary crate. Library crate juga akan ikut dalam kompilasi tersebut.")),(0,i.kt)("p",null,"Sebagai contoh item ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration")," (yang sudah dipraktikkan pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/perulangan-while"},"Perulangan \u279c while"),") dan ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin")," (pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/path-item"},"Module System \u279c Path & Item"),") adalah dua buah item milik crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"std"),". Crate ",(0,i.kt)("inlineCode",{parentName:"p"},"std")," ini akan sangat sering kita gunakan dalam package/project, isinya banyak sekali functionality untuk keperluan standar dalam Rust programming."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di komunitas Rust, ketika ada kata ",(0,i.kt)("em",{parentName:"p"},"library")," atau ",(0,i.kt)("em",{parentName:"p"},"crate")," maka yang dimaksud biasanya adalah ",(0,i.kt)("em",{parentName:"p"},"library crate"))),(0,i.kt)("p",null,"Kita bisa membuat library crate kemudian di-publish ke ",(0,i.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io")," agar bisa digunakan banyak orang. Command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo new --lib ")," digunakan untuk membuat library crate."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai library crate dibahas terpisah pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/library-crate"},"Library Crate"))),(0,i.kt)("h2",{id:"a192-rust-package"},"A.19.2. Rust Package"),(0,i.kt)("p",null,"Istilah package dalam Rust programming masih sama dengan package dalam pemrograman lain. Package adalah sebuah set yang berisi banyak ",(0,i.kt)("em",{parentName:"p"},"functionality"),". Satu buah package bisa berisi satu atau banyak crates."),(0,i.kt)("p",null,"Package di-manage oleh Cargo, yang merupakan package manager Rust. Command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo new ")," digunakan untuk membuat package. Command tersebut menghasilkan beberapa file yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"src/main.rs")," yang isinya adalah kode program, dan juga file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," yang isinya adalah informasi mengenai package tersebut."),(0,i.kt)("p",null,"Ok, sekalian praktik mungkin lebih pas. Silakan jalankan command berikut, kemudian ikuti penjelasan selanjutnya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new belajar_package_crate\n")),(0,i.kt)("h3",{id:"-naming-convention-package"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Naming convention")," package"),(0,i.kt)("p",null,"Khusus untuk penamaan package dan juga crate, tidak ada rekomendasi dari dokumentasi official Rust. Pada ebook ini penulis menggunakan ",(0,i.kt)("em",{parentName:"p"},"snake case")," sebagai naming convention dalam pembuatan package."),(0,i.kt)("p",null,"Referensi: ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html")),(0,i.kt)("h3",{id:"-file-cargotoml"},"\u25c9 File ",(0,i.kt)("inlineCode",{parentName:"h3"},"Cargo.toml")),(0,i.kt)("p",null,"File ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," menampung beberapa informasi penting milik package, di antaranya adalah nama package, versi package dan juga versi rust, serta ",(0,i.kt)("em",{parentName:"p"},"dependencies")," atau ",(0,i.kt)("em",{parentName:"p"},"3rd-party")," yang digunakan dalam package (dalam konteks Rust adalah ",(0,i.kt)("em",{parentName:"p"},"crate"),")."),(0,i.kt)("p",null,"Command yang sebelumnya di-run menghasilkan file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-toml",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'[package]\nname = "belajar_package_crate"\nversion = "0.1.0"\nedition = "2021"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\n')),(0,i.kt)("p",null,"Blok ",(0,i.kt)("inlineCode",{parentName:"p"},"package")," berisi berisi 3 buah field:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"name")," isinya adalah nama package, sesuai dengan argument command ",(0,i.kt)("inlineCode",{parentName:"li"},"cargo new "),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"version")," default-nya selalu ",(0,i.kt)("inlineCode",{parentName:"li"},"0.1.0"),", namun kita bisa ubah nilainya seiring berjalannya proses pengembangan aplikasi."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"edition")," di sini me-refer ke edisi rust yang dipakai. Di ebook ini, rust versi ",(0,i.kt)("strong",{parentName:"li"},"1.65.0")," digunakan, dan edisi untuk versi tersebut adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"2021"),".")),(0,i.kt)("p",null,"Blok ",(0,i.kt)("inlineCode",{parentName:"p"},"dependencies")," default-nya berisi kosong. Jika kita menambahkan external dependencies atau crates, maka detailnya tercatat pada blok ",(0,i.kt)("inlineCode",{parentName:"p"},"dependencies")," ini."),(0,i.kt)("h3",{id:"-website-cratesio"},"\u25c9 Website ",(0,i.kt)("a",{parentName:"h3",href:"https://crates.io/"},"crates.io")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"crates.io")," merupakan official website dari Rust untuk pencarian dan juga ",(0,i.kt)("em",{parentName:"p"},"managing")," dependency. Silakan manfaatkan website tersebut untuk mencari crates sesuai kebutuhan."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("a",{parentName:"p",href:"https://crates.io/"},"https://crates.io/"))),(0,i.kt)("h3",{id:"-menambahkan-dependency-atau-external-crate"},"\u25c9 Menambahkan dependency atau external crate"),(0,i.kt)("p",null,"proses pembelajaran akan dilanjutkan sambil praktik. Pada bagian ini kita akan buat program sederhana yang di dalamnya memanfaatkan sebuah dependency atau external crate."),(0,i.kt)("p",null,"Pertama-tama buka ",(0,i.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io"),", lalu gunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," dalam pencarian, hasilnya adalah dependency bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"rand"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"package crate",src:n(6637).Z,width:"814",height:"429"})),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"rand")," merupakan crate yang isinya banyak fungsi untuk keperluan ",(0,i.kt)("em",{parentName:"p"},"generate")," data random."),(0,i.kt)("p",null,"Sekarang buka file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),", dan tambahkan dependency ",(0,i.kt)("inlineCode",{parentName:"p"},"rand"),". Sesuaikan dengan versi yang muncul di layar masing-masing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-toml",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'[package]\nname = "package_crate"\nversion = "0.1.0"\nedition = "2021"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrand = "0.8.5"\n')),(0,i.kt)("p",null,"Jalankan command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo build")," untuk memaksa Cargo agar mendownload depdency yang sudah ditambahkan ke file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cargo download dependency",src:n(2002).Z,width:"440",height:"172"})),(0,i.kt)("p",null,"Sukses! Sekarang dependency ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," sudah bisa digunakan dalam package yang sudah dibuat."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Jika pembaca menemui error ",(0,i.kt)("inlineCode",{parentName:"p"},"failed to authenticate when downloading repository"),", jalankan beberapa command berikut secara berurutan:"),(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ssh-agent -s")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ssh-add")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"cargo build")))),(0,i.kt)("p",null,"Jadi kurang lebih seperti itu cara menambahkan dependency di Rust. Seiring berjalannya proses pembelajaran penulis yakin pembaca akan terbiasa dengan flow dan juga command di atas."),(0,i.kt)("h3",{id:"-command-cargo-add"},"\u25c9 Command ",(0,i.kt)("inlineCode",{parentName:"h3"},"cargo add")),(0,i.kt)("p",null,"Selain cara di atas, ada cara lain yang lebih ringkas untuk penambahan package, yaitu menggunakan command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo add "),". Command ini secara otomatis menambahkan package yang diinginkan ke file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," kemudian mengunduhnya."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Menambahkan package ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," versi terbaru"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"cargo add rand\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Menambahkan package ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," versi ",(0,i.kt)("inlineCode",{parentName:"p"},"0.8.5")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"cargo add rand@0.8.5\n")))),(0,i.kt)("h2",{id:"a193-praktik-membuat-program-menampilkan-angka-random"},"A.19.3. Praktik membuat program menampilkan angka random"),(0,i.kt)("p",null,"Ok, sekarang kita lanjutkan praktik pembuatan program sederhana untuk menampilkan angka random."),(0,i.kt)("p",null,"Angka random di sini akan di-generate menggunakan fungsi yang ada dalam dependency ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," yang sudah ditambahkan ke package."),(0,i.kt)("p",null,"Silakan tulis kode berikut ke file ",(0,i.kt)("inlineCode",{parentName:"p"},"src/main.rs"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use rand::Rng;\n\nfn generate_random_number() -> i32 {\n rand::thread_rng().gen_range(0..100)\n}\n\nfn main() {\n for i in 0..5 {\n println!("random number {}: {}", i, generate_random_number());\n }\n}\n')),(0,i.kt)("p",null,"Jalankan program, lalu lihat hasilnya. Sejumlah data angka random muncul di layar output."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rand crate",src:n(8240).Z,width:"455",height:"158"})),(0,i.kt)("p",null,"Silakan coba untuk run beberapa kali, angka random berbeda setiap kali run."),(0,i.kt)("h3",{id:"-fungsi-generate_random_number"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"generate_random_number")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"generate_random_number")," adalah fungsi yang kita buat, yang tugasnya mengembalikan sebuah nilai numerik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),". Angka tersebut berasal dari proses ",(0,i.kt)("em",{parentName:"p"},"generate random")," hasil eksekusi statement ",(0,i.kt)("inlineCode",{parentName:"p"},"rand::thread_rng().gen_range(0..100)"),"."),(0,i.kt)("h3",{id:"-statement-randthread_rnggen_range0100"},"\u25c9 Statement ",(0,i.kt)("inlineCode",{parentName:"h3"},"rand::thread_rng().gen_range(0..100)")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"rand::thread_rng().gen_range")," digunakan untuk generate data random. Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"gen_range")," menerima argument bertipe range, dan angka random akan di-generate sesuai range tersebut. Sebagai contoh, range ",(0,i.kt)("inlineCode",{parentName:"p"},"0..100")," menghasilkan angka random antara ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"99"),"."),(0,i.kt)("p",null,"O iya, penggunaan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"gen_range")," mewajibkan kita untuk import path ",(0,i.kt)("inlineCode",{parentName:"p"},"rand::Rng"),". Itulah kenapa ada statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use rand::Rng"),"."),(0,i.kt)("h3",{id:"-fungsi-main"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"main")),(0,i.kt)("p",null,"Dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", isinya sebuah perulangan sederhana yang menampilkan angka random hasil eksekusi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"generate_random_number")," di setiap iterasinya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for i in 0..5 {\n println!("random number {}: {}", i, generate_random_number());\n}\n')),(0,i.kt)("h2",{id:"a194-pembahasan-lanjutan"},"A.19.4. Pembahasan lanjutan"),(0,i.kt)("p",null,"Sekian pembahasan mengenai package dan crate. Semoga membantu, silakan diulang-ulang jika perlu agar tidak bingung, ",(0,i.kt)("strong",{parentName:"p"},"module system")," merupakan salah satu hal yang sangat penting di Rust."),(0,i.kt)("p",null,"Masih dalam topik ",(0,i.kt)("em",{parentName:"p"},"module system"),", penulis anjurkan untuk lanjut ke chapter berikutnya karena berkaitan."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/package_crate"},"github.com/novalagung/dasarpemrogramanrust-example/../package_crate")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-01-packages-and-crates.html"},"https://doc.rust-lang.org/book/ch07-01-packages-and-crates.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/crates.html"},"https://doc.rust-lang.org/rust-by-example/crates.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/rust-lang/cargo/issues/3381"},"https://github.com/rust-lang/cargo/issues/3381"))))}k.isMDXComponent=!0},6637:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/package-crate-1-bc29d1ca7bd36fcd767c54466152bf67.png"},2002:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbgAAACsCAIAAACGmC7dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTNUMTc6NTc6MTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEzVDE4OjUxOjM3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEzVDE4OjUxOjM3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJhZGI4NDFiLTNhZmUtZGU0Mi04OTIwLWNjMDg1MTJhNzZkYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2YzlkNDQ2Yi0xMDhlLTYyNDUtYjI4My0zNDVhM2JjMTgwMDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2YzlkNDQ2Yi0xMDhlLTYyNDUtYjI4My0zNDVhM2JjMTgwMDEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZjOWQ0NDZiLTEwOGUtNjI0NS1iMjgzLTM0NWEzYmMxODAwMSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xM1QxNzo1NzoxMCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyYWRiODQxYi0zYWZlLWRlNDItODkyMC1jYzA4NTEyYTc2ZGEiIHN0RXZ0OndoZW49IjIwMjItMTAtMTNUMTg6NTE6MzcrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ubH5UAAAVyElEQVR42u2dO44ctxaGvZKWfR3cyImUCc4u4HRiQZAyxaNEmYQGnHoJDShSNoGWIChwNokxi9AKnN+uNx/nkIf16u6q74cAzVTzVeyqbw7J4l8/HRBCCCX1E12AEEKAEiGEACVCCAFKhBAClAghBCgRQghQIoQQoEQIIUAp6u7dh/dvfq9++v3N+w/v7mZvwLmCBUoVVLW/PRW0ql6dvj8+HO3pjw+Pj4/fT6/c/I2UUs4ZnOQIrQxKjy0LgdIIsLuV6rkODX+eAKWhFECJLgjKgCxLgdLGBUB50XB8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"},8240:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAccAAACeCAIAAADIaFZuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTNUMTg6MDM6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEzVDE4OjQ3OjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEzVDE4OjQ3OjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIxZGM0OTQ1LTgxODct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"}}]); \ No newline at end of file diff --git a/assets/js/7390b81e.686f428e.js b/assets/js/7390b81e.686f428e.js deleted file mode 100644 index 40f9865d..00000000 --- a/assets/js/7390b81e.686f428e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4274],{3905:(a,e,n)=>{n.d(e,{Zo:()=>u,kt:()=>g});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var d=t.createContext({}),p=function(a){var e=t.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},u=function(a){var e=p(a.components);return t.createElement(d.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},o=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,d=a.parentName,u=m(a,["components","mdxType","originalType","parentName"]),o=p(n),g=i,c=o["".concat(d,".").concat(g)]||o[g]||k[g]||r;return n?t.createElement(c,l(l({ref:e},u),{},{components:n})):t.createElement(c,l({ref:e},u))}));function g(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=o;var m={};for(var d in e)hasOwnProperty.call(e,d)&&(m[d]=e[d]);m.originalType=a,m.mdxType="string"==typeof a?a:i,l[1]=m;for(var p=2;p{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>m,toc:()=>p});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:19,title:"A.19. Module System \u279c Package & Crate",sidebar_label:"A.19. Module System \u279c Package & Crate"},l=void 0,m={unversionedId:"basic/package-crate",id:"basic/package-crate",title:"A.19. Module System \u279c Package & Crate",description:"Chapter ini membahas mengenai konsep package dan path dalam Rust programming. Pembelajaran dimulai dari pembahasan mengenai konsep crate terlebih dahulu, kemudian masuk ke package.",source:"@site/docs/basic/package-crate.md",sourceDirName:"basic",slug:"/basic/package-crate",permalink:"/basic/package-crate",draft:!1,tags:[],version:"current",sidebarPosition:19,frontMatter:{sidebar_position:19,title:"A.19. Module System \u279c Package & Crate",sidebar_label:"A.19. Module System \u279c Package & Crate"},sidebar:"tutorialSidebar",previous:{title:"A.18. Module System \u279c Path & Item",permalink:"/basic/path-item"},next:{title:"A.20. Module System \u279c Module",permalink:"/basic/module-basic"}},d={},p=[{value:"A.19.1. Rust Crate",id:"a191-rust-crate",level:2},{value:"\u25c9 Binary crate",id:"-binary-crate",level:3},{value:"\u25c9 Library crate",id:"-library-crate",level:3},{value:"A.19.2. Rust Package",id:"a192-rust-package",level:2},{value:"\u25c9 Naming convention package",id:"-naming-convention-package",level:3},{value:"\u25c9 File Cargo.toml",id:"-file-cargotoml",level:3},{value:"\u25c9 Website crates.io",id:"-website-cratesio",level:3},{value:"\u25c9 Menambahkan dependency atau external crate",id:"-menambahkan-dependency-atau-external-crate",level:3},{value:"\u25c9 Command cargo add",id:"-command-cargo-add",level:3},{value:"A.19.3. Praktik membuat program menampilkan angka random",id:"a193-praktik-membuat-program-menampilkan-angka-random",level:2},{value:"\u25c9 Fungsi generate_random_number",id:"-fungsi-generate_random_number",level:3},{value:"\u25c9 Statement rand::thread_rng().gen_range(0..100)",id:"-statement-randthread_rnggen_range0100",level:3},{value:"\u25c9 Fungsi main",id:"-fungsi-main",level:3},{value:"A.19.4. Pembahasan lanjutan",id:"a194-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:p};function k(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},u,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas mengenai konsep package dan path dalam Rust programming. Pembelajaran dimulai dari pembahasan mengenai konsep crate terlebih dahulu, kemudian masuk ke package."),(0,i.kt)("h2",{id:"a191-rust-crate"},"A.19.1. Rust Crate"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Crate")," adalah satu unit kompilasi di Rust. Eksekusi command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo build"),", atau ",(0,i.kt)("inlineCode",{parentName:"p"},"rustc")," men-",(0,i.kt)("em",{parentName:"p"},"trigger")," proses kompilasi, dan unit (yang di sini disebut dengan crate) akan di-compile."),(0,i.kt)("p",null,"Crate bisa berisi banyak ",(0,i.kt)("em",{parentName:"p"},"module"),". Sebuah module definisinya bisa berada di banyak file. Agar lebih jelas silakan perhatikan contoh berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"XYZ")," adalah sebuah crate, isinya ada dua module, yaitu module ",(0,i.kt)("inlineCode",{parentName:"li"},"Mod_ABC")," dan module ",(0,i.kt)("inlineCode",{parentName:"li"},"Mod_DEF"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Mod_ABC")," adalah module yang didefinisikan dalam crate ",(0,i.kt)("inlineCode",{parentName:"li"},"XYZ"),", source code-nya berada di file bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"modul_a.rs"),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Mod_DEF")," adalah module yang didefinisikan dalam crate ",(0,i.kt)("inlineCode",{parentName:"li"},"XYZ"),", source code-nya berada di beberapa file ",(0,i.kt)("inlineCode",{parentName:"li"},"module_b_one.rs")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"module_b_two.rs"),".")),(0,i.kt)("p",null,"Dari contoh di atas, crate ",(0,i.kt)("inlineCode",{parentName:"p"},"XYZ")," adalah 1 unit kompilasi, yang dimana di dalam crate tersebut ada dua modules yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Mod_ABC")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Mod_DEF")),(0,i.kt)("p",null,"Rust mengkategorikan crate menjadi 2 jenis, ",(0,i.kt)("em",{parentName:"p"},"binary crate")," dan ",(0,i.kt)("em",{parentName:"p"},"library crate")),(0,i.kt)("h3",{id:"-binary-crate"},"\u25c9 Binary crate"),(0,i.kt)("p",null,"Binary crate adalah program yang dikompilasi ke bentuk ",(0,i.kt)("em",{parentName:"p"},"executable"),", untuk kemudian dijalankan, seperti program-program yang sudah kita buat menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo create")," dan run menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run")," itu adalah contoh dari binary crate."),(0,i.kt)("p",null,"Binary crate berada dalam sebuah package yang dibuat menggunakan command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo create ")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo create --bin "),", kedua command ini menjalankan perintah yang sama."),(0,i.kt)("p",null,"Ciri khas dari binary crate adalah memiliki fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", sebuah fungsi yang merupakan ",(0,i.kt)("em",{parentName:"p"},"entrypoint")," program."),(0,i.kt)("h3",{id:"-library-crate"},"\u25c9 Library crate"),(0,i.kt)("p",null,"Library crate berbeda dengan binary crate. Library crate tidak di-compile ke bentuk ",(0,i.kt)("em",{parentName:"p"},"executable")," dan tidak memiliki fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". Library crate digunakan untuk mendefinisikan set ",(0,i.kt)("em",{parentName:"p"},"functionality")," yang ",(0,i.kt)("em",{parentName:"p"},"reusable")," atau bisa digunakan di banyak project/package."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Library crate di-import/digunakan dalam binary crate. Dalam proses kompilasinya, yang di-compile adalah binary crate. Library crate juga akan ikut dalam kompilasi tersebut.")),(0,i.kt)("p",null,"Sebagai contoh item ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration")," (yang sudah dipraktikkan pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/perulangan-while"},"Perulangan \u279c while"),") dan ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin")," (pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/path-item"},"Module System \u279c Path & Item"),") adalah dua buah item milik crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"std"),". Crate ",(0,i.kt)("inlineCode",{parentName:"p"},"std")," ini akan sangat sering kita gunakan dalam package/project, isinya banyak sekali functionality untuk keperluan standar dalam Rust programming."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di komunitas Rust, ketika ada kata ",(0,i.kt)("em",{parentName:"p"},"library")," atau ",(0,i.kt)("em",{parentName:"p"},"crate")," maka yang dimaksud biasanya adalah ",(0,i.kt)("em",{parentName:"p"},"library crate"))),(0,i.kt)("p",null,"Kita bisa membuat library crate kemudian di-publish ke ",(0,i.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io")," agar bisa digunakan banyak orang. Command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo new --lib ")," digunakan untuk membuat library crate."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai library crate dibahas terpisah pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/library-crate"},"Library Crate"))),(0,i.kt)("h2",{id:"a192-rust-package"},"A.19.2. Rust Package"),(0,i.kt)("p",null,"Istilah package dalam Rust programming masih sama dengan package dalam pemrograman lain. Package adalah sebuah set yang berisi banyak ",(0,i.kt)("em",{parentName:"p"},"functionality"),". Satu buah package bisa berisi satu atau banyak crates."),(0,i.kt)("p",null,"Package di-manage oleh Cargo, yang merupakan package manager Rust. Command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo new ")," digunakan untuk membuat package. Command tersebut menghasilkan beberapa file yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"src/main.rs")," yang isinya adalah kode program, dan juga file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," yang isinya adalah informasi mengenai package tersebut."),(0,i.kt)("p",null,"Ok, sekalian praktik mungkin lebih pas. Silakan jalankan command berikut, kemudian ikuti penjelasan selanjutnya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"cargo new belajar_package_crate\n")),(0,i.kt)("h3",{id:"-naming-convention-package"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Naming convention")," package"),(0,i.kt)("p",null,"Khusus untuk penamaan package dan juga crate, tidak ada rekomendasi dari dokumentasi official Rust. Pada ebook ini penulis menggunakan ",(0,i.kt)("em",{parentName:"p"},"snake case")," sebagai naming convention dalam pembuatan package."),(0,i.kt)("p",null,"Referensi: ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html")),(0,i.kt)("h3",{id:"-file-cargotoml"},"\u25c9 File ",(0,i.kt)("inlineCode",{parentName:"h3"},"Cargo.toml")),(0,i.kt)("p",null,"File ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," menampung beberapa informasi penting milik package, di antaranya adalah nama package, versi package dan juga versi rust, serta ",(0,i.kt)("em",{parentName:"p"},"dependencies")," atau ",(0,i.kt)("em",{parentName:"p"},"3rd-party")," yang digunakan dalam package (dalam konteks Rust adalah ",(0,i.kt)("em",{parentName:"p"},"crate"),")."),(0,i.kt)("p",null,"Command yang sebelumnya di-run menghasilkan file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-toml",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'[package]\nname = "belajar_package_crate"\nversion = "0.1.0"\nedition = "2021"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\n')),(0,i.kt)("p",null,"Blok ",(0,i.kt)("inlineCode",{parentName:"p"},"package")," berisi berisi 3 buah field:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"name")," isinya adalah nama package, sesuai dengan argument command ",(0,i.kt)("inlineCode",{parentName:"li"},"cargo new "),"."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"version")," default-nya selalu ",(0,i.kt)("inlineCode",{parentName:"li"},"0.1.0"),", namun kita bisa ubah nilainya seiring berjalannya proses pengembangan aplikasi."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"edition")," di sini me-refer ke edisi rust yang dipakai. Di ebook ini, rust versi ",(0,i.kt)("strong",{parentName:"li"},"1.65.0")," digunakan, dan edisi untuk versi tersebut adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"2021"),".")),(0,i.kt)("p",null,"Blok ",(0,i.kt)("inlineCode",{parentName:"p"},"dependencies")," default-nya berisi kosong. Jika kita menambahkan external dependencies atau crates, maka detailnya tercatat pada blok ",(0,i.kt)("inlineCode",{parentName:"p"},"dependencies")," ini."),(0,i.kt)("h3",{id:"-website-cratesio"},"\u25c9 Website ",(0,i.kt)("a",{parentName:"h3",href:"https://crates.io/"},"crates.io")),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"crates.io")," merupakan official website dari Rust untuk pencarian dan juga ",(0,i.kt)("em",{parentName:"p"},"managing")," dependency. Silakan manfaatkan website tersebut untuk mencari crates sesuai kebutuhan."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("a",{parentName:"p",href:"https://crates.io/"},"https://crates.io/"))),(0,i.kt)("h3",{id:"-menambahkan-dependency-atau-external-crate"},"\u25c9 Menambahkan dependency atau external crate"),(0,i.kt)("p",null,"proses pembelajaran akan dilanjutkan sambil praktik. Pada bagian ini kita akan buat program sederhana yang di dalamnya memanfaatkan sebuah dependency atau external crate."),(0,i.kt)("p",null,"Pertama-tama buka ",(0,i.kt)("a",{parentName:"p",href:"https://crates.io/"},"crates.io"),", lalu gunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," dalam pencarian, hasilnya adalah dependency bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"rand"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"package crate",src:n(6637).Z,width:"814",height:"429"})),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"rand")," merupakan crate yang isinya banyak fungsi untuk keperluan ",(0,i.kt)("em",{parentName:"p"},"generate")," data random."),(0,i.kt)("p",null,"Sekarang buka file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),", dan tambahkan dependency ",(0,i.kt)("inlineCode",{parentName:"p"},"rand"),". Sesuaikan dengan versi yang muncul di layar masing-masing."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-toml",metastring:'title="Cargo.toml"',title:'"Cargo.toml"'},'[package]\nname = "package_crate"\nversion = "0.1.0"\nedition = "2021"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\nrand = "0.8.5"\n')),(0,i.kt)("p",null,"Jalankan command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo build")," untuk memaksa Cargo agar mendownload depdency yang sudah ditambahkan ke file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"cargo download dependency",src:n(2002).Z,width:"440",height:"172"})),(0,i.kt)("p",null,"Sukses! Sekarang dependency ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," sudah bisa digunakan dalam package yang sudah dibuat."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Jika pembaca menemui error ",(0,i.kt)("inlineCode",{parentName:"p"},"failed to authenticate when downloading repository"),", jalankan beberapa command berikut secara berurutan:"),(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ssh-agent -s")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"ssh-add")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"cargo build")))),(0,i.kt)("p",null,"Jadi kurang lebih seperti itu cara menambahkan dependency di Rust. Seiring berjalannya proses pembelajaran penulis yakin pembaca akan terbiasa dengan flow dan juga command di atas."),(0,i.kt)("h3",{id:"-command-cargo-add"},"\u25c9 Command ",(0,i.kt)("inlineCode",{parentName:"h3"},"cargo add")),(0,i.kt)("p",null,"Selain cara di atas, ada cara lain yang lebih ringkas untuk penambahan package, yaitu menggunakan command ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo add "),". Command ini secara otomatis menambahkan package yang diinginkan ke file ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml")," kemudian mengunduhnya."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Menambahkan package ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," versi terbaru"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"cargo add rand\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Menambahkan package ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," versi ",(0,i.kt)("inlineCode",{parentName:"p"},"0.8.5")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"cargo add rand@0.8.5\n")))),(0,i.kt)("h2",{id:"a193-praktik-membuat-program-menampilkan-angka-random"},"A.19.3. Praktik membuat program menampilkan angka random"),(0,i.kt)("p",null,"Ok, sekarang kita lanjutkan praktik pembuatan program sederhana untuk menampilkan angka random."),(0,i.kt)("p",null,"Angka random di sini akan di-generate menggunakan fungsi yang ada dalam dependency ",(0,i.kt)("inlineCode",{parentName:"p"},"rand")," yang sudah ditambahkan ke package."),(0,i.kt)("p",null,"Silakan tulis kode berikut ke file ",(0,i.kt)("inlineCode",{parentName:"p"},"src/main.rs"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use rand::Rng;\n\nfn generate_random_number() -> i32 {\n rand::thread_rng().gen_range(0..100)\n}\n\nfn main() {\n for i in 0..5 {\n println!("random number {}: {}", i, generate_random_number());\n }\n}\n')),(0,i.kt)("p",null,"Jalankan program, lalu lihat hasilnya. Sejumlah data angka random muncul di layar output."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rand crate",src:n(8240).Z,width:"455",height:"158"})),(0,i.kt)("p",null,"Silakan coba untuk run beberapa kali, angka random berbeda setiap kali run."),(0,i.kt)("h3",{id:"-fungsi-generate_random_number"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"generate_random_number")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"generate_random_number")," adalah fungsi yang kita buat, yang tugasnya mengembalikan sebuah nilai numerik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),". Angka tersebut berasal dari proses ",(0,i.kt)("em",{parentName:"p"},"generate random")," hasil eksekusi statement ",(0,i.kt)("inlineCode",{parentName:"p"},"rand::thread_rng().gen_range(0..100)"),"."),(0,i.kt)("h3",{id:"-statement-randthread_rnggen_range0100"},"\u25c9 Statement ",(0,i.kt)("inlineCode",{parentName:"h3"},"rand::thread_rng().gen_range(0..100)")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"rand::thread_rng().gen_range")," digunakan untuk generate data random. Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"gen_range")," menerima argument bertipe range, dan angka random akan di-generate sesuai range tersebut. Sebagai contoh, range ",(0,i.kt)("inlineCode",{parentName:"p"},"0..100")," menghasilkan angka random antara ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," hingga ",(0,i.kt)("inlineCode",{parentName:"p"},"99"),"."),(0,i.kt)("p",null,"O iya, penggunaan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"gen_range")," mewajibkan kita untuk import path ",(0,i.kt)("inlineCode",{parentName:"p"},"rand::Rng"),". Itulah kenapa ada statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use rand::Rng"),"."),(0,i.kt)("h3",{id:"-fungsi-main"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"main")),(0,i.kt)("p",null,"Dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", isinya sebuah perulangan sederhana yang menampilkan angka random hasil eksekusi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"generate_random_number")," di setiap iterasinya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for i in 0..5 {\n println!("random number {}: {}", i, generate_random_number());\n}\n')),(0,i.kt)("h2",{id:"a194-pembahasan-lanjutan"},"A.19.4. Pembahasan lanjutan"),(0,i.kt)("p",null,"Sekian pembahasan mengenai package dan crate. Semoga membantu, silakan diulang-ulang jika perlu agar tidak bingung, ",(0,i.kt)("strong",{parentName:"p"},"module system")," merupakan salah satu hal yang sangat penting di Rust."),(0,i.kt)("p",null,"Masih dalam topik ",(0,i.kt)("em",{parentName:"p"},"module system"),", penulis anjurkan untuk lanjut ke chapter berikutnya karena berkaitan."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/package_crate"},"github.com/novalagung/dasarpemrogramanrust-example/../package_crate")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-01-packages-and-crates.html"},"https://doc.rust-lang.org/book/ch07-01-packages-and-crates.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/crates.html"},"https://doc.rust-lang.org/rust-by-example/crates.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/rust-lang/cargo/issues/3381"},"https://github.com/rust-lang/cargo/issues/3381"))))}k.isMDXComponent=!0},6637:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/package-crate-1-bc29d1ca7bd36fcd767c54466152bf67.png"},2002:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbgAAACsCAIAAACGmC7dAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTNUMTc6NTc6MTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEzVDE4OjUxOjM3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEzVDE4OjUxOjM3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJhZGI4NDFiLTNhZmUtZGU0Mi04OTIwLWNjMDg1MTJhNzZkYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2YzlkNDQ2Yi0xMDhlLTYyNDUtYjI4My0zNDVhM2JjMTgwMDEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2YzlkNDQ2Yi0xMDhlLTYyNDUtYjI4My0zNDVhM2JjMTgwMDEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZjOWQ0NDZiLTEwOGUtNjI0NS1iMjgzLTM0NWEzYmMxODAwMSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xM1QxNzo1NzoxMCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyYWRiODQxYi0zYWZlLWRlNDItODkyMC1jYzA4NTEyYTc2ZGEiIHN0RXZ0OndoZW49IjIwMjItMTAtMTNUMTg6NTE6MzcrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4ubH5UAAAVyElEQVR42u2dO44ctxaGvZKWfR3cyImUCc4u4HRiQZAyxaNEmYQGnHoJDShSNoGWIChwNokxi9AKnN+uNx/nkIf16u6q74cAzVTzVeyqbw7J4l8/HRBCCCX1E12AEEKAEiGEACVCCAFKhBAClAghBCgRQghQIoQQoEQIIUAp6u7dh/dvfq9++v3N+w/v7mZvwLmCBUoVVLW/PRW0ql6dvj8+HO3pjw+Pj4/fT6/c/I2UUs4ZnOQIrQxKjy0LgdIIsLuV6rkODX+eAKWhFECJLgjKgCxLgdLGBUB50XB8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"},8240:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAccAAACeCAIAAADIaFZuAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTNUMTg6MDM6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEzVDE4OjQ3OjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEzVDE4OjQ3OjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmIxZGM0OTQ1LTgxODct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"}}]); \ No newline at end of file diff --git a/assets/js/7794a932.0807e2e7.js b/assets/js/7794a932.0807e2e7.js deleted file mode 100644 index aa62b125..00000000 --- a/assets/js/7794a932.0807e2e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8358],{3905:(e,a,n)=>{n.d(a,{Zo:()=>u,kt:()=>s});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function r(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var d=t.createContext({}),o=function(e){var a=t.useContext(d),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},u=function(e){var a=o(e.components);return t.createElement(d.Provider,{value:a},e.children)},k={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},m=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,r=e.originalType,d=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=o(n),s=i,c=m["".concat(d,".").concat(s)]||m[s]||k[s]||r;return n?t.createElement(c,l(l({ref:a},u),{},{components:n})):t.createElement(c,l({ref:a},u))}));function s(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=m;var p={};for(var d in a)hasOwnProperty.call(a,d)&&(p[d]=a[d]);p.originalType=e,p.mdxType="string"==typeof e?e:i,l[1]=p;for(var o=2;o{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>p,toc:()=>o});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:39,title:"A.39. Tipe Data \u279c Result",sidebar_label:"A.39. Tipe Data \u279c Result"},l=void 0,p={unversionedId:"basic/result-type",id:"basic/result-type",title:"A.39. Tipe Data \u279c Result",description:"Chapter ini membahas tentang tipe data Result. Tipe data ini digunakan untuk menampung nilai hasil suatu proses yang isinya adalah bisa sukses (Ok) atau error (Err).",source:"@site/docs/basic/result-type.md",sourceDirName:"basic",slug:"/basic/result-type",permalink:"/basic/result-type",draft:!1,tags:[],version:"current",sidebarPosition:39,frontMatter:{sidebar_position:39,title:"A.39. Tipe Data \u279c Result",sidebar_label:"A.39. Tipe Data \u279c Result"},sidebar:"tutorialSidebar",previous:{title:"A.38. Tipe Data \u279c Option",permalink:"/basic/option-type"},next:{title:"A.40. Pattern Matching",permalink:"/basic/pattern-matching"}},d={},o=[{value:"A.39.1. Konsep Result",id:"a391-konsep-result",level:2},{value:"A.39.2. Pattern matching pada tipe Result",id:"a392-pattern-matching-pada-tipe-result",level:2},{value:"\u25c9 Tips pattern matching",id:"-tips-pattern-matching",level:3},{value:"A.39.3. Method tipe data Result",id:"a393-method-tipe-data-result",level:2},{value:"\u25c9 Method is_ok & unwrap",id:"-method-is_ok--unwrap",level:3},{value:"\u25c9 Method as_ref",id:"-method-as_ref",level:3},{value:"\u25c9 Method is_err & err",id:"-method-is_err--err",level:3},{value:"\u25c9 Method ok",id:"-method-ok",level:3},{value:"\u25c9 Method unwrap_or_default",id:"-method-unwrap_or_default",level:3},{value:"\u25c9 Method unwrap_or",id:"-method-unwrap_or",level:3},{value:"\u25c9 Method unwrap_or_else",id:"-method-unwrap_or_else",level:3},{value:"A.39.4. Error handling tipe Result",id:"a394-error-handling-tipe-result",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:o};function k(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,t.Z)({},u,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Tipe data ini digunakan untuk menampung nilai hasil suatu proses yang isinya adalah bisa sukses (",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),") atau error (",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),")."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," biasa digunakan untuk menampung hasil eksekusi proses dan error handling."),(0,i.kt)("h2",{id:"a391-konsep-result"},"A.39.1. Konsep ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," adalah enum dengan isi 2 buah enum value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Result::Ok")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok"),"), digunakan untuk menandai bahwa data isinya adalah kabar baik (oke / mantab / jos / sukses)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Result::Err")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"Err"),"), digunakan untuk menandai bawah data berisi kabar buruk.")),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"E")," merupakan parameter generic. Lebih jelasnya mengenai generic dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics"),"."))),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," memiliki notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," digunakan pada enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," digunakan enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),"."),(0,i.kt)("p",null,"Cara penerapan tipe data ini bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nenum MathError {\n DivisionByZero,\n InfinityNumber,\n OtherError,\n}\n\nfn main() {\n let result1 = divider(10.0, 5.0);\n println!("result: {:?}", result1);\n\n let result2: Result = divider(10.0, 0.0);\n println!("result: {:?}", result2);\n}\n\nfn divider(a: f64, b: f64) -> Result {\n if b == 0.0 {\n return Err(MathError::DivisionByZero);\n }\n\n let result = a / b;\n return Ok(result);\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," di atas tugasnya adalah melakukan operasi aritmatika pembagian angka numerik ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),", parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"a")," dibagi ",(0,i.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,i.kt)("p",null,"Pada fungsi tersebut terdapat pengecekan apabila nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", maka yang dikembalikan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," berisi pesan error, selainnya maka hasil operasi pembagian dikembalikan dibungkus dalam enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),"."),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Dari tipe data yang digunakan nantinya bisa diprediksi pasti akan ada 2 potensi value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Return value adalah enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"Err"),", muncul ketika nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"0")),(0,i.kt)("li",{parentName:"ul"},"Return value adalah nilai hasil numerik yang dibungkus oleh enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok"))),(0,i.kt)("p",null,"Output program di atas saat di-run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Result type",src:n(1463).Z,width:"454",height:"112"})),(0,i.kt)("h2",{id:"a392-pattern-matching-pada-tipe-result"},"A.39.2. Pattern matching pada tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Dalam penerapannya, ketika ada data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," artinya data tersebut berpotensi untuk berisi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", pasti antara 2 nilai tersebut."),(0,i.kt)("p",null,"Umumnya penggunaan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," selalu diikuti dengan pattern matching menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),". Selain itu keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," sebenarnya juga bisa diterapkan pada pattern matching tipe data ini, namun kurang dianjurkan."),(0,i.kt)("p",null,"Mari kita praktikkan. Ubah isi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," dengan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nmatch result {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(2565).Z,width:"450",height:"89"})),(0,i.kt)("p",null,"Bisa dilihat pada kode di atas mudahnya pengambilan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"m")," dari ",(0,i.kt)("inlineCode",{parentName:"p"},"Err(m)")," dan juga ",(0,i.kt)("inlineCode",{parentName:"p"},"r")," dari ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok(r)"),". Penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk seleksi kondisi biasa disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"pattern matching")," dan teknik ini sangat fleksibel dan advance."),(0,i.kt)("p",null,"Sebagai contoh, dengan penerapan match yang seperti ini kita bisa meng-handle 5 skenario seleksi kondisi:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nmatch result {\n Err(MathError::DivisionByZero) => println!("ERROR! unable to divide number by 0"),\n Err(MathError::InfinityNumber) => println!("ERROR! result is infinity number (\u221e)"),\n Err(_) => println!("ERROR! unknown error"),\n Ok(2.0) => println!("the result is 2"),\n Ok(x) => println!("result: {x:.2}"),\n}\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-1: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::DivisionByZero)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"ERROR! unable to divide number by 0"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-2: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::InfinityNumber)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"ERROR! result is infinity number (\u221e)"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-3: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Err")," selain dari ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::DivisionByZero)")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::InfinityNumber)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"ERROR! unknown error"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-4: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok(2.0)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"the result is 2"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-5: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok")," selain dari ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok(2.0)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"result: {x:.2}"),".")),(0,i.kt)("h3",{id:"-tips-pattern-matching"},"\u25c9 Tips pattern matching"),(0,i.kt)("p",null,"Silakan perhatikan kode yang sudah kita praktikkan berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nmatch result {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n}\n')),(0,i.kt)("p",null,"Penerapan pattern matching seperti contoh di atas memiliki konsekuensi, yaitu variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"r")," hanya bisa diakses pada block ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok(r)")," saja."),(0,i.kt)("p",null,"Adakalanya kita butuh untuk mengeluarkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"r")," ke luar block. Hal seperti ini mudah untuk dilakukan, dan ada beberapa cara yang bisa dipilih, namun menurut penulis yang paling elegan adalah cara berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result: f64 = match divider(10.0, 5.0) {\n Err(m) => {\n println!("ERROR! {:?}", m);\n 0.0\n },\n Ok(r) => r,\n };\n\n println!("result: {:?}", result);\n}\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10.0, 5.0)")," mengembalikan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Data tersebut digunakan pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," seperti biasa. Namun pada contoh di atas ada yang berbeda, yaitu return value dari statement ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," ditampung ke variabel (",(0,i.kt)("inlineCode",{parentName:"p"},"result"),")."),(0,i.kt)("p",null,"Isi dari pattern matching ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," sendiri ada dua:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(m)")," match, error di-print kemudian nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"0.0")," dijadikan return statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),"."),(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok")," match, data ",(0,i.kt)("inlineCode",{parentName:"li"},"r")," dijadikan return value statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),".")),(0,i.kt)("p",null,"Dengan penerapan pattern matching seperti di atas, maka variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," akan selalu berisi data hasil operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10.0, 5.0)"),". Dengan pengecualian ketika ada error, pesan errornya dimunculkan kemudian hasil operasi pembagian di-set sebagai ",(0,i.kt)("inlineCode",{parentName:"p"},"0.0"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai pattern matching dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h2",{id:"a393-method-tipe-data-result"},"A.39.3. Method tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("h3",{id:"-method-is_ok--unwrap"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_ok")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap")),(0,i.kt)("p",null,"Isi dari enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok")," bisa diakses tanpa menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," dengan cara memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Sebelum mengakses method tersebut sangat dianjurkan untuk mengecek apakah data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok atau tidak"),", karena jika data adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," menghasilkan error."),(0,i.kt)("p",null,"Pengecekan nilai ok atau tidak bisa dilakukan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_ok"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nif result.is_ok() {\n let number = result.unwrap();\n println!("result: {}", number);\n // result: 2\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Result type",src:n(5086).Z,width:"447",height:"88"})),(0,i.kt)("h3",{id:"-method-as_ref"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"as_ref")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," digunakan untuk mengakses reference ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," pada ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Method ini sering kali dibutuhkan untuk menghindari terjadinya ",(0,i.kt)("em",{parentName:"p"},"move semantics")," pada owner data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),"."),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," mengembalikan data dalam tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result<&T, &E>"),". Jadi reference yang dipinjam bukan milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),"-nya melainkan milik ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"E"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let result: Result = divider(10.0, 0.0);\nlet result_borrow: Result<&f64, &MathError> = result.as_ref();\n")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"p"},"move semantics")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership#a334-copy-semantics-vs-move-semantics"},"Ownership"))),(0,i.kt)("h3",{id:"-method-is_err--err"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_err")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"err")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"err")," mengembalikan data dalam tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),". Pada pengaksesan method ini, pastikan untuk mengecek apakah ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," berisi data error atau ok dengan via method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_err"),". Selain itu, wajib untuk menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," sebelum method ",(0,i.kt)("inlineCode",{parentName:"p"},"err")," agar ownership data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," tidak berpindah (",(0,i.kt)("em",{parentName:"p"},"move semantics"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nif result.is_err() {\n let err = result.as_ref().err();\n let message = err.unwrap();\n println!("error: {:?}", message);\n // error: DivisionByZero\n}\n')),(0,i.kt)("h3",{id:"-method-ok"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"ok")),(0,i.kt)("p",null,"Aturan yang sama juga berlaku pada pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"ok")," yang mengembalikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),". Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," harus diakses terlebih dahulu sebelum memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"ok")," agar tidak terjadi ",(0,i.kt)("em",{parentName:"p"},"move semantics"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nif result.is_ok() {\n let data = result.as_ref().ok();\n let number = data.unwrap();\n println!("result: {:?}", number);\n // result: 2\n}\n')),(0,i.kt)("h3",{id:"-method-unwrap_or_default"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_default")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_default")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", namun jika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," maka yang dikembalikan adalah ",(0,i.kt)("em",{parentName:"p"},"default value")," dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nlet number = result.unwrap_or_default();\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("h3",{id:"-method-unwrap_or"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", namun jika data ternyata isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," maka yang dikembalikan adalah argument pemanggilan method tersebut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nlet number = result.unwrap_or(0.0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("h3",{id:"-method-unwrap_or_else"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_else")),(0,i.kt)("p",null,"Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", namun jika data isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," maka yang dikembalikan adalah hasil eksekusi closure yang disisipkan saat memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_else"),". Contoh pengaplikasiannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nlet number = result.unwrap_or_else(|_| 0.0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("p",null,"Closure harus dalam notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"FnOnce(E) -> T")," dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," pada konteks ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai closure dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/closures"},"Closures"),".")),(0,i.kt)("h2",{id:"a394-error-handling-tipe-result"},"A.39.4. Error handling tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," banyak digunakan pada fungsi milik Rust standard library, dan kita selaku programmer pastinya juga akan menggunakannya dalam ",(0,i.kt)("em",{parentName:"p"},"real life")," project."),(0,i.kt)("p",null,"Tipe ini dipakai salah satunya untuk manajemen error. Lebih jelasnya mengenai topik tersebut dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/error-handling-panic"},"Error Handling & Panic")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/result_type"},"github.com/novalagung/dasarpemrogramanrust-example/../result_type")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/closures"},"Closures"))),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Operator ",(0,i.kt)("inlineCode",{parentName:"li"},"?"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html"},"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/result/index.html"},"https://doc.rust-lang.org/std/result/index.html"))))}k.isMDXComponent=!0},1463:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcYAAABwCAIAAAAL5EeiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTg6MDI6MzArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjM4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjM4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg4NWNiNmQ1LTU0NDct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"},2565:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABZCAIAAAAirLMmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTg6MTg6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjA2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjA2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJlYzQ3ZDllLTAxOGMt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"},5086:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABYCAIAAADqR26rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTg6MzA6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjU1OjI5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjU1OjI5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQxZjYzMTA3LTZjNjQtNGM0MS05NzQ2LTg4MmUzMjBhMGMzNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5ZWE3NmRmOS0yYTE0LWMyNDgtOGQ0Mi00MGRhNzVjYTFiMzgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5ZWE3NmRmOS0yYTE0LWMyNDgtOGQ0Mi00MGRhNzVjYTFiMzgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjllYTc2ZGY5LTJhMTQtYzI0OC04ZDQyLTQwZGE3NWNhMWIzOCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xOVQxODozMDoxNCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MWY2MzEwNy02YzY0LTRjNDEtOTc0Ni04ODJlMzIwYTBjMzUiIHN0RXZ0OndoZW49IjIwMjItMTItMjFUMTQ6NTU6MjkrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz71jOtVAAANFElEQVR42u2du47cNhiF/SS7awQwYmAbp9643cqZNClcjIEtFil3EMCAp3Ix3b6CHyFP4T4PlRF14+X85E+Jus2cAwP2yJR4nU8/SenMmxuKoigqX2/YBBRFUaQnRVEU6UlRFEV6UhRFkZ4URVEU6UlRFEV6UhRFkZ4URVGkJ0VRFOlZSsfXD6+nd5+mzGL3/PWs51065cP+8LWWJvU6dK7dYf+QVU1wsqm6cK65cJNsQNNXZ5qGjRVt0y0vVPN8dDuVGVz39Rbw62xFXJSer++fps4m+fX10m7xO5xZ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"}}]); \ No newline at end of file diff --git a/assets/js/7794a932.f8711f2e.js b/assets/js/7794a932.f8711f2e.js new file mode 100644 index 00000000..eb2dd46a --- /dev/null +++ b/assets/js/7794a932.f8711f2e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8358],{3905:(e,a,n)=>{n.d(a,{Zo:()=>u,kt:()=>s});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function r(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var d=t.createContext({}),o=function(e){var a=t.useContext(d),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},u=function(e){var a=o(e.components);return t.createElement(d.Provider,{value:a},e.children)},k={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},m=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,r=e.originalType,d=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),m=o(n),s=i,c=m["".concat(d,".").concat(s)]||m[s]||k[s]||r;return n?t.createElement(c,l(l({ref:a},u),{},{components:n})):t.createElement(c,l({ref:a},u))}));function s(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=m;var p={};for(var d in a)hasOwnProperty.call(a,d)&&(p[d]=a[d]);p.originalType=e,p.mdxType="string"==typeof e?e:i,l[1]=p;for(var o=2;o{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>p,toc:()=>o});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:39,title:"A.39. Tipe Data \u279c Result",sidebar_label:"A.39. Tipe Data \u279c Result"},l=void 0,p={unversionedId:"basic/result-type",id:"basic/result-type",title:"A.39. Tipe Data \u279c Result",description:"Chapter ini membahas tentang tipe data Result. Tipe data ini digunakan untuk menampung nilai hasil suatu proses yang isinya adalah bisa sukses (Ok) atau error (Err).",source:"@site/docs/basic/result-type.md",sourceDirName:"basic",slug:"/basic/result-type",permalink:"/basic/result-type",draft:!1,tags:[],version:"current",sidebarPosition:39,frontMatter:{sidebar_position:39,title:"A.39. Tipe Data \u279c Result",sidebar_label:"A.39. Tipe Data \u279c Result"},sidebar:"tutorialSidebar",previous:{title:"A.38. Tipe Data \u279c Option",permalink:"/basic/option-type"},next:{title:"A.40. Pattern Matching",permalink:"/basic/pattern-matching"}},d={},o=[{value:"A.39.1. Konsep Result",id:"a391-konsep-result",level:2},{value:"A.39.2. Pattern matching pada tipe Result",id:"a392-pattern-matching-pada-tipe-result",level:2},{value:"\u25c9 Tips pattern matching",id:"-tips-pattern-matching",level:3},{value:"A.39.3. Method tipe data Result",id:"a393-method-tipe-data-result",level:2},{value:"\u25c9 Method is_ok & unwrap",id:"-method-is_ok--unwrap",level:3},{value:"\u25c9 Method as_ref",id:"-method-as_ref",level:3},{value:"\u25c9 Method is_err & err",id:"-method-is_err--err",level:3},{value:"\u25c9 Method ok",id:"-method-ok",level:3},{value:"\u25c9 Method unwrap_or_default",id:"-method-unwrap_or_default",level:3},{value:"\u25c9 Method unwrap_or",id:"-method-unwrap_or",level:3},{value:"\u25c9 Method unwrap_or_else",id:"-method-unwrap_or_else",level:3},{value:"A.39.4. Error handling tipe Result",id:"a394-error-handling-tipe-result",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:o};function k(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,t.Z)({},u,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Tipe data ini digunakan untuk menampung nilai hasil suatu proses yang isinya adalah bisa sukses (",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),") atau error (",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),")."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," biasa digunakan untuk menampung hasil eksekusi proses dan error handling."),(0,i.kt)("h2",{id:"a391-konsep-result"},"A.39.1. Konsep ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," adalah enum dengan isi 2 buah enum value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Result::Ok")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok"),"), digunakan untuk menandai bahwa data isinya adalah kabar baik (oke / mantab / jos / sukses)."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Result::Err")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"Err"),"), digunakan untuk menandai bawah data berisi kabar buruk.")),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"E")," merupakan parameter generic. Lebih jelasnya mengenai generic dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics"),"."))),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," memiliki notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," digunakan pada enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," digunakan enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),"."),(0,i.kt)("p",null,"Cara penerapan tipe data ini bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nenum MathError {\n DivisionByZero,\n InfinityNumber,\n OtherError,\n}\n\nfn main() {\n let result1 = divider(10.0, 5.0);\n println!("result: {:?}", result1);\n\n let result2: Result = divider(10.0, 0.0);\n println!("result: {:?}", result2);\n}\n\nfn divider(a: f64, b: f64) -> Result {\n if b == 0.0 {\n return Err(MathError::DivisionByZero);\n }\n\n let result = a / b;\n return Ok(result);\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," di atas tugasnya adalah melakukan operasi aritmatika pembagian angka numerik ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),", parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"a")," dibagi ",(0,i.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,i.kt)("p",null,"Pada fungsi tersebut terdapat pengecekan apabila nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", maka yang dikembalikan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," berisi pesan error, selainnya maka hasil operasi pembagian dikembalikan dibungkus dalam enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),"."),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Dari tipe data yang digunakan nantinya bisa diprediksi pasti akan ada 2 potensi value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Return value adalah enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"Err"),", muncul ketika nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"0")),(0,i.kt)("li",{parentName:"ul"},"Return value adalah nilai hasil numerik yang dibungkus oleh enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok"))),(0,i.kt)("p",null,"Output program di atas saat di-run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Result type",src:n(1463).Z,width:"454",height:"112"})),(0,i.kt)("h2",{id:"a392-pattern-matching-pada-tipe-result"},"A.39.2. Pattern matching pada tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Dalam penerapannya, ketika ada data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," artinya data tersebut berpotensi untuk berisi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", pasti antara 2 nilai tersebut."),(0,i.kt)("p",null,"Umumnya penggunaan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," selalu diikuti dengan pattern matching menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),". Selain itu keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," sebenarnya juga bisa diterapkan pada pattern matching tipe data ini, namun kurang dianjurkan."),(0,i.kt)("p",null,"Mari kita praktikkan. Ubah isi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," dengan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nmatch result {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(2565).Z,width:"450",height:"89"})),(0,i.kt)("p",null,"Bisa dilihat pada kode di atas mudahnya pengambilan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"m")," dari ",(0,i.kt)("inlineCode",{parentName:"p"},"Err(m)")," dan juga ",(0,i.kt)("inlineCode",{parentName:"p"},"r")," dari ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok(r)"),". Penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk seleksi kondisi biasa disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"pattern matching")," dan teknik ini sangat fleksibel dan advance."),(0,i.kt)("p",null,"Sebagai contoh, dengan penerapan match yang seperti ini kita bisa meng-handle 5 skenario seleksi kondisi:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nmatch result {\n Err(MathError::DivisionByZero) => println!("ERROR! unable to divide number by 0"),\n Err(MathError::InfinityNumber) => println!("ERROR! result is infinity number (\u221e)"),\n Err(_) => println!("ERROR! unknown error"),\n Ok(2.0) => println!("the result is 2"),\n Ok(x) => println!("result: {x:.2}"),\n}\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-1: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::DivisionByZero)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"ERROR! unable to divide number by 0"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-2: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::InfinityNumber)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"ERROR! result is infinity number (\u221e)"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-3: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Err")," selain dari ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::DivisionByZero)")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(MathError::InfinityNumber)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"ERROR! unknown error"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-4: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok(2.0)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"the result is 2"),"."),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-5: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok")," selain dari ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok(2.0)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"result: {x:.2}"),".")),(0,i.kt)("h3",{id:"-tips-pattern-matching"},"\u25c9 Tips pattern matching"),(0,i.kt)("p",null,"Silakan perhatikan kode yang sudah kita praktikkan berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nmatch result {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n}\n')),(0,i.kt)("p",null,"Penerapan pattern matching seperti contoh di atas memiliki konsekuensi, yaitu variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"r")," hanya bisa diakses pada block ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok(r)")," saja."),(0,i.kt)("p",null,"Adakalanya kita butuh untuk mengeluarkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"r")," ke luar block. Hal seperti ini mudah untuk dilakukan, dan ada beberapa cara yang bisa dipilih, namun menurut penulis yang paling elegan adalah cara berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result: f64 = match divider(10.0, 5.0) {\n Err(m) => {\n println!("ERROR! {:?}", m);\n 0.0\n },\n Ok(r) => r,\n };\n\n println!("result: {:?}", result);\n}\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10.0, 5.0)")," mengembalikan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Data tersebut digunakan pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," seperti biasa. Namun pada contoh di atas ada yang berbeda, yaitu return value dari statement ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," ditampung ke variabel (",(0,i.kt)("inlineCode",{parentName:"p"},"result"),")."),(0,i.kt)("p",null,"Isi dari pattern matching ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," sendiri ada dua:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"Err(m)")," match, error di-print kemudian nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"0.0")," dijadikan return statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),"."),(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"Ok")," match, data ",(0,i.kt)("inlineCode",{parentName:"li"},"r")," dijadikan return value statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),".")),(0,i.kt)("p",null,"Dengan penerapan pattern matching seperti di atas, maka variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," akan selalu berisi data hasil operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10.0, 5.0)"),". Dengan pengecualian ketika ada error, pesan errornya dimunculkan kemudian hasil operasi pembagian di-set sebagai ",(0,i.kt)("inlineCode",{parentName:"p"},"0.0"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai pattern matching dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h2",{id:"a393-method-tipe-data-result"},"A.39.3. Method tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("h3",{id:"-method-is_ok--unwrap"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_ok")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap")),(0,i.kt)("p",null,"Isi dari enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok")," bisa diakses tanpa menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," dengan cara memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Sebelum mengakses method tersebut sangat dianjurkan untuk mengecek apakah data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok atau tidak"),", karena jika data adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," menghasilkan error."),(0,i.kt)("p",null,"Pengecekan nilai ok atau tidak bisa dilakukan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_ok"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nif result.is_ok() {\n let number = result.unwrap();\n println!("result: {}", number);\n // result: 2\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Result type",src:n(5086).Z,width:"447",height:"88"})),(0,i.kt)("h3",{id:"-method-as_ref"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"as_ref")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," digunakan untuk mengakses reference ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"E")," pada ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Method ini sering kali dibutuhkan untuk menghindari terjadinya ",(0,i.kt)("em",{parentName:"p"},"move semantics")," pada owner data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),"."),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," mengembalikan data dalam tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result<&T, &E>"),". Jadi reference yang dipinjam bukan milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),"-nya melainkan milik ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"E"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let result: Result = divider(10.0, 0.0);\nlet result_borrow: Result<&f64, &MathError> = result.as_ref();\n")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"p"},"move semantics")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership#a334-copy-semantics-vs-move-semantics"},"Ownership"))),(0,i.kt)("h3",{id:"-method-is_err--err"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_err")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"err")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"err")," mengembalikan data dalam tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),". Pada pengaksesan method ini, pastikan untuk mengecek apakah ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," berisi data error atau ok dengan via method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_err"),". Selain itu, wajib untuk menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," sebelum method ",(0,i.kt)("inlineCode",{parentName:"p"},"err")," agar ownership data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," tidak berpindah (",(0,i.kt)("em",{parentName:"p"},"move semantics"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nif result.is_err() {\n let err = result.as_ref().err();\n let message = err.unwrap();\n println!("error: {:?}", message);\n // error: DivisionByZero\n}\n')),(0,i.kt)("h3",{id:"-method-ok"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"ok")),(0,i.kt)("p",null,"Aturan yang sama juga berlaku pada pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"ok")," yang mengembalikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),". Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_ref")," harus diakses terlebih dahulu sebelum memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"ok")," agar tidak terjadi ",(0,i.kt)("em",{parentName:"p"},"move semantics"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 5.0);\nif result.is_ok() {\n let data = result.as_ref().ok();\n let number = data.unwrap();\n println!("result: {:?}", number);\n // result: 2\n}\n')),(0,i.kt)("h3",{id:"-method-unwrap_or_default"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_default")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_default")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", namun jika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," maka yang dikembalikan adalah ",(0,i.kt)("em",{parentName:"p"},"default value")," dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nlet number = result.unwrap_or_default();\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("h3",{id:"-method-unwrap_or"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", namun jika data ternyata isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," maka yang dikembalikan adalah argument pemanggilan method tersebut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nlet number = result.unwrap_or(0.0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("h3",{id:"-method-unwrap_or_else"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_else")),(0,i.kt)("p",null,"Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),", namun jika data isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Err")," maka yang dikembalikan adalah hasil eksekusi closure yang disisipkan saat memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_else"),". Contoh pengaplikasiannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10.0, 0.0);\nlet number = result.unwrap_or_else(|_| 0.0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("p",null,"Closure harus dalam notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"FnOnce(E) -> T")," yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," pada konteks ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai closure dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/closures"},"Closures"),".")),(0,i.kt)("h2",{id:"a394-error-handling-tipe-result"},"A.39.4. Error handling tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," banyak digunakan pada fungsi milik Rust standard library, dan kita selaku programmer pastinya juga akan menggunakannya dalam ",(0,i.kt)("em",{parentName:"p"},"real life")," project."),(0,i.kt)("p",null,"Tipe ini dipakai salah satunya untuk manajemen error. Lebih jelasnya mengenai topik tersebut dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/error-handling-panic"},"Error Handling & Panic")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/result_type"},"github.com/novalagung/dasarpemrogramanrust-example/../result_type")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/closures"},"Closures"))),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Operator ",(0,i.kt)("inlineCode",{parentName:"li"},"?"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html"},"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/result/index.html"},"https://doc.rust-lang.org/std/result/index.html"))))}k.isMDXComponent=!0},1463:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcYAAABwCAIAAAAL5EeiAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTg6MDI6MzArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjM4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjM4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg4NWNiNmQ1LTU0NDct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"},2565:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABZCAIAAAAirLMmAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTg6MTg6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjA2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAzOjA2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJlYzQ3ZDllLTAxOGMt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"},5086:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABYCAIAAADqR26rAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTg6MzA6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjU1OjI5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjU1OjI5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQxZjYzMTA3LTZjNjQtNGM0MS05NzQ2LTg4MmUzMjBhMGMzNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5ZWE3NmRmOS0yYTE0LWMyNDgtOGQ0Mi00MGRhNzVjYTFiMzgiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5ZWE3NmRmOS0yYTE0LWMyNDgtOGQ0Mi00MGRhNzVjYTFiMzgiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjllYTc2ZGY5LTJhMTQtYzI0OC04ZDQyLTQwZGE3NWNhMWIzOCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xOVQxODozMDoxNCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0MWY2MzEwNy02YzY0LTRjNDEtOTc0Ni04ODJlMzIwYTBjMzUiIHN0RXZ0OndoZW49IjIwMjItMTItMjFUMTQ6NTU6MjkrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz71jOtVAAANFElEQVR42u2du47cNhiF/SS7awQwYmAbp9643cqZNClcjIEtFil3EMCAp3Ix3b6CHyFP4T4PlRF14+X85E+Jus2cAwP2yJR4nU8/SenMmxuKoigqX2/YBBRFUaQnRVEU6UlRFEV6UhRFkZ4URVEU6UlRFEV6UhRFkZ4URVGkJ0VRFOlZSsfXD6+nd5+mzGL3/PWs51065cP+8LWWJvU6dK7dYf+QVU1wsqm6cK65cJNsQNNXZ5qGjRVt0y0vVPN8dDuVGVz39Rbw62xFXJSer++fps4m+fX10m7xO5xZ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"}}]); \ No newline at end of file diff --git a/assets/js/7d03ccaf.46ca6fcc.js b/assets/js/7d03ccaf.a18e440e.js similarity index 78% rename from assets/js/7d03ccaf.46ca6fcc.js rename to assets/js/7d03ccaf.a18e440e.js index 5fb518cf..eb823d10 100644 --- a/assets/js/7d03ccaf.46ca6fcc.js +++ b/assets/js/7d03ccaf.a18e440e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[1059],{3905:(a,e,n)=>{n.d(e,{Zo:()=>s,kt:()=>c});var r=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function i(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,r)}return n}function o(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var p=r.createContext({}),u=function(a){var e=r.useContext(p),n=e;return a&&(n="function"==typeof a?a(e):o(o({},e),a)),n},s=function(a){var e=u(a.components);return r.createElement(p.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return r.createElement(r.Fragment,{},e)}},g=r.forwardRef((function(a,e){var n=a.components,t=a.mdxType,i=a.originalType,p=a.parentName,s=l(a,["components","mdxType","originalType","parentName"]),g=u(n),c=t,d=g["".concat(p,".").concat(c)]||g[c]||m[c]||i;return n?r.createElement(d,o(o({ref:e},s),{},{components:n})):r.createElement(d,o({ref:e},s))}));function c(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var p in e)hasOwnProperty.call(e,p)&&(l[p]=e[p]);l.originalType=a,l.mdxType="string"==typeof a?a:t,o[1]=l;for(var u=2;u{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=n(7462),t=(n(7294),n(3905));const i={sidebar_position:2,title:"Pengenalan Rust Programming",sidebar_label:"Pengenalan Rust Programming"},o=void 0,l={unversionedId:"pengelanan-rust-programming",id:"pengelanan-rust-programming",title:"Pengenalan Rust Programming",description:"Rust adalah sebuah bahasa pemrograman general purpose yang fokus pada performance, type safety, dan concurrency. Bahasa ini diciptakan sebagai alternatif bahasa pemrograman yang berfokus pada hal-hal yang cukup low-level tapi tetap men-support fitur yang sifatnya high-level.",source:"@site/docs/pengelanan-rust-programming.md",sourceDirName:".",slug:"/pengelanan-rust-programming",permalink:"/pengelanan-rust-programming",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Pengenalan Rust Programming",sidebar_label:"Pengenalan Rust Programming"},sidebar:"tutorialSidebar",previous:{title:"Dasar Pemrograman Rust",permalink:"/"},next:{title:"Contribution & Tech Stack",permalink:"/CONTRIBUTING"}},p={},u=[],s={toc:u};function m(a){let{components:e,...n}=a;return(0,t.kt)("wrapper",(0,r.Z)({},s,n,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Rust adalah sebuah bahasa pemrograman general purpose yang fokus pada performance, type safety, dan concurrency. Bahasa ini diciptakan sebagai alternatif bahasa pemrograman yang berfokus pada hal-hal yang cukup low-level tapi tetap men-support fitur yang sifatnya high-level."),(0,t.kt)("p",null,"Rust dikembangkan oleh ",(0,t.kt)("a",{parentName:"p",href:"https://twitter.com/graydon_pub"},"Graydon Hoare")," sewaktu ia masih bekerja di Mozilla pada tahun 2009, kemudian di-maintain dibawah naungan Rust Foundation hingga sekarang."),(0,t.kt)("p",null,"Rust memiliki beberapa kelebihan dibanding bahasa system-programming lainnya, yang di antaranya adalah:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Keamanan memory yang sangat bagus, dengan pengecekan ada di waktu kompilasi"),(0,t.kt)("li",{parentName:"ul"},"Ownership memory management"),(0,t.kt)("li",{parentName:"ul"},"Type system (traits, generic, struct, dan lainnya)"),(0,t.kt)("li",{parentName:"ul"},"Macros untuk metaprogramming"),(0,t.kt)("li",{parentName:"ul"},"Tooling dan ",(0,t.kt)("inlineCode",{parentName:"li"},"std")," library yang lengkap"),(0,t.kt)("li",{parentName:"ul"},"Built-in package management tool (cargo & crates.io)"),(0,t.kt)("li",{parentName:"ul"},"Efisien dan memiliki performa tinggi"),(0,t.kt)("li",{parentName:"ul"},"Dukungan komunitas yang bagus. Banyak library open source yang tersedia")),(0,t.kt)("p",null,"Pada buku ini (terutama semua serial chapter A) kita akan belajar tentang dasar pemrograman Rust, mulai dari 0."))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[1059],{3905:(a,e,n)=>{n.d(e,{Zo:()=>s,kt:()=>c});var r=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function i(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);e&&(r=r.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,r)}return n}function o(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var p=r.createContext({}),u=function(a){var e=r.useContext(p),n=e;return a&&(n="function"==typeof a?a(e):o(o({},e),a)),n},s=function(a){var e=u(a.components);return r.createElement(p.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return r.createElement(r.Fragment,{},e)}},g=r.forwardRef((function(a,e){var n=a.components,t=a.mdxType,i=a.originalType,p=a.parentName,s=l(a,["components","mdxType","originalType","parentName"]),g=u(n),c=t,d=g["".concat(p,".").concat(c)]||g[c]||m[c]||i;return n?r.createElement(d,o(o({ref:e},s),{},{components:n})):r.createElement(d,o({ref:e},s))}));function c(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var i=n.length,o=new Array(i);o[0]=g;var l={};for(var p in e)hasOwnProperty.call(e,p)&&(l[p]=e[p]);l.originalType=a,l.mdxType="string"==typeof a?a:t,o[1]=l;for(var u=2;u{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>o,default:()=>m,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var r=n(7462),t=(n(7294),n(3905));const i={sidebar_position:2,title:"Pengenalan Rust Programming",sidebar_label:"Pengenalan Rust Programming"},o=void 0,l={unversionedId:"pengelanan-rust-programming",id:"pengelanan-rust-programming",title:"Pengenalan Rust Programming",description:"Rust adalah sebuah bahasa pemrograman general purpose yang fokus pada performance, type safety, dan concurrency. Bahasa ini diciptakan sebagai alternatif bahasa pemrograman yang berfokus pada hal-hal yang cukup low-level tapi tetap men-support fitur yang sifatnya high-level.",source:"@site/docs/pengelanan-rust-programming.md",sourceDirName:".",slug:"/pengelanan-rust-programming",permalink:"/pengelanan-rust-programming",draft:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2,title:"Pengenalan Rust Programming",sidebar_label:"Pengenalan Rust Programming"},sidebar:"tutorialSidebar",previous:{title:"Dasar Pemrograman Rust",permalink:"/"},next:{title:"Contribution & Tech Stack",permalink:"/CONTRIBUTING"}},p={},u=[],s={toc:u};function m(a){let{components:e,...n}=a;return(0,t.kt)("wrapper",(0,r.Z)({},s,n,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Rust adalah sebuah bahasa pemrograman general purpose yang fokus pada performance, type safety, dan concurrency. Bahasa ini diciptakan sebagai alternatif bahasa pemrograman yang berfokus pada hal-hal yang cukup low-level tapi tetap men-support fitur yang sifatnya high-level."),(0,t.kt)("p",null,"Rust dikembangkan oleh ",(0,t.kt)("a",{parentName:"p",href:"https://twitter.com/graydon_pub"},"Graydon Hoare")," sewaktu ia masih bekerja di Mozilla pada tahun 2009, kemudian di-maintain di bawah naungan Rust Foundation hingga sekarang."),(0,t.kt)("p",null,"Rust memiliki beberapa kelebihan dibanding bahasa system-programming lainnya, yang di antaranya adalah:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Keamanan memory yang sangat bagus, dengan pengecekan ada di waktu kompilasi"),(0,t.kt)("li",{parentName:"ul"},"Ownership memory management"),(0,t.kt)("li",{parentName:"ul"},"Type system (traits, generic, struct, dan lainnya)"),(0,t.kt)("li",{parentName:"ul"},"Macros untuk metaprogramming"),(0,t.kt)("li",{parentName:"ul"},"Tooling dan ",(0,t.kt)("inlineCode",{parentName:"li"},"std")," library yang lengkap"),(0,t.kt)("li",{parentName:"ul"},"Built-in package management tool (cargo & crates.io)"),(0,t.kt)("li",{parentName:"ul"},"Efisien dan memiliki performa tinggi"),(0,t.kt)("li",{parentName:"ul"},"Dukungan komunitas yang bagus. Banyak library open source yang tersedia")),(0,t.kt)("p",null,"Pada buku ini (terutama semua serial chapter A) kita akan belajar tentang dasar pemrograman Rust, mulai dari 0."))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/82a9b669.402fdaf8.js b/assets/js/82a9b669.402fdaf8.js new file mode 100644 index 00000000..d1f80607 --- /dev/null +++ b/assets/js/82a9b669.402fdaf8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[3257],{3905:(e,a,t)=>{t.d(a,{Zo:()=>m,kt:()=>c});var n=t(7294);function i(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(i[t]=e[t]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var p=n.createContext({}),o=function(e){var a=n.useContext(p),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},m=function(e){var a=o(e.components);return n.createElement(p.Provider,{value:a},e.children)},A={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},k=n.forwardRef((function(e,a){var t=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,m=d(e,["components","mdxType","originalType","parentName"]),k=o(t),c=i,u=k["".concat(p,".").concat(c)]||k[c]||A[c]||r;return t?n.createElement(u,l(l({ref:a},m),{},{components:t})):n.createElement(u,l({ref:a},m))}));function c(e,a){var t=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=t.length,l=new Array(r);l[0]=k;var d={};for(var p in a)hasOwnProperty.call(a,p)&&(d[p]=a[p]);d.originalType=e,d.mdxType="string"==typeof e?e:i,l[1]=d;for(var o=2;o{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>l,default:()=>A,frontMatter:()=>r,metadata:()=>d,toc:()=>o});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:48,title:"A.48. Trait \u279c Iterator",sidebar_label:"A.48. Trait \u279c Iterator"},l=void 0,d={unversionedId:"basic/trait-iterator",id:"basic/trait-iterator",title:"A.48. Trait \u279c Iterator",description:"Iterator adalah salah satu trait dan tipe data custom penting pada Rust programming, gunanya untuk iterasi data. Di chapter ini kita akan mempelajarinya beserta beberapa module item lainnya yang masih relevan dengan topik Iterator.",source:"@site/docs/basic/trait-iterator.md",sourceDirName:"basic",slug:"/basic/trait-iterator",permalink:"/basic/trait-iterator",draft:!1,tags:[],version:"current",sidebarPosition:48,frontMatter:{sidebar_position:48,title:"A.48. Trait \u279c Iterator",sidebar_label:"A.48. Trait \u279c Iterator"},sidebar:"tutorialSidebar",previous:{title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",permalink:"/basic/trait-function"},next:{title:"A.49. Attributes",permalink:"/basic/attributes"}},p={},o=[{value:"A.48.1. Iterator & IntoIterator",id:"a481-iterator--intoiterator",level:2},{value:"\u25c9 Trait Iterator & IntoIterator",id:"-trait-iterator--intoiterator",level:3},{value:"\u25c9 Struct Iterator",id:"-struct-iterator",level:3},{value:"A.48.2. Pemanfaatan tipe data Iterator",id:"a482-pemanfaatan-tipe-data-iterator",level:2},{value:"\u25c9 Praktik ke-1",id:"-praktik-ke-1",level:3},{value:"\u25c9 Praktik ke-2",id:"-praktik-ke-2",level:3},{value:"A.48.3. Method tipe data Iterator",id:"a483-method-tipe-data-iterator",level:2},{value:"\u25c9 Method iter, iter_mut, into_iter",id:"-method-iter-iter_mut-into_iter",level:3},{value:"\u25c9 Method collect",id:"-method-collect",level:3},{value:"\u25c9 Method map",id:"-method-map",level:3},{value:"\u25c9 Method rev",id:"-method-rev",level:3},{value:"\u25c9 Method filter",id:"-method-filter",level:3},{value:"\u25c9 Method cloned",id:"-method-cloned",level:3},{value:"\u25c9 Method copied",id:"-method-copied",level:3},{value:"\u25c9 Method cmp",id:"-method-cmp",level:3},{value:"\u25c9 Method count",id:"-method-count",level:3},{value:"\u25c9 Method eq, ne, gt, ge, lt, le",id:"-method-eq-ne-gt-ge-lt-le",level:3},{value:"\u25c9 Method find",id:"-method-find",level:3},{value:"\u25c9 Method last",id:"-method-last",level:3},{value:"\u25c9 Method fold",id:"-method-fold",level:3},{value:"\u25c9 Method inspect",id:"-method-inspect",level:3},{value:"\u25c9 Method sum",id:"-method-sum",level:3},{value:"\u25c9 Method reduce",id:"-method-reduce",level:3},{value:"\u25c9 Method min, max",id:"-method-min-max",level:3},{value:"A.48.4. Method lainnya",id:"a484-method-lainnya",level:2},{value:"\u25c9 Method sort milik Vec<T>",id:"-method-sort-milik-vect",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:o};function A(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},m,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Iterator adalah salah satu trait dan tipe data custom penting pada Rust programming, gunanya untuk iterasi data. Di chapter ini kita akan mempelajarinya beserta beberapa module item lainnya yang masih relevan dengan topik Iterator."),(0,i.kt)("h2",{id:"a481-iterator--intoiterator"},"A.48.1. ",(0,i.kt)("inlineCode",{parentName:"h2"},"Iterator")," & ",(0,i.kt)("inlineCode",{parentName:"h2"},"IntoIterator")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," adalah sebuah nama yang dipakai sebagai nama module item dalam ",(0,i.kt)("strong",{parentName:"p"},"Rust Standard Library")," maupun ",(0,i.kt)("strong",{parentName:"p"},"Rust Core Library"),", digunakan untuk iterasi data dan operasi lain yang berhubungan dengannya."),(0,i.kt)("p",null,"Iterator sendiri merupakan istilah untuk object atau trait yang bisa diiterasi, baik menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," ataupun menggunakan method iterator seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each")," (yang juga akan kita bahas di sini)."),(0,i.kt)("h3",{id:"-trait-iterator--intoiterator"},"\u25c9 Trait ",(0,i.kt)("inlineCode",{parentName:"h3"},"Iterator")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"IntoIterator")),(0,i.kt)("p",null,"Dalam perulangan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", tipe data variabel yang digunakan harus memiliki trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),". Jika tidak, pasti error muncul."),(0,i.kt)("p",null,"Tipe data slice di Rust by default mengadopsi trait bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"IntoIterator"),", yang trait ini digunakan untuk konversi data bertipe slice ke bentuk iterator."),(0,i.kt)("p",null,"Dalam praktiknya, tidak perlu mengakses method tertentu untuk mendapatkan object iterator suatu data. Cukup gunakan variabel tipe data slice pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", maka proses konversi ke bentuk iterator akan dilakukan oleh Rust secara otomatis dibalik layar."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// array\nlet data_arr = ["a", "b", "c", "d"];\nfor e in &data_arr {\n print!("{e:?} ")\n}\n\nprintln!();\n\n// vector\nlet data_vec = vec!["a", "b", "c", "d"];\nfor e in &data_vec {\n print!("{e:?} ")\n}\n\nprintln!();\n\n// slice\nlet data_vec = vec!["a", "b", "c", "d"];\nlet data_slice_vec = &data_vec[..];\nfor e in data_slice_vec {\n print!("{e:?} ")\n}\n')),(0,i.kt)("p",null,"Dianjurkan untuk selalu menggunakan teknik ",(0,i.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing")," dalam penggunaan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," pada tipe data yang karakteristiknya adalah ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership#a344-copy-semantics-vs-move-semantics"},"Move Semantics"),", hal ini karena dalam penerapan keyword tersebut, terjadi proses konversi tipe data dengan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"IntoIterator")," ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),"."),(0,i.kt)("p",null,"Jika data yang digunakan bukan data borrow, maka pasti owner berpindah."),(0,i.kt)("h3",{id:"-struct-iterator"},"\u25c9 Struct ",(0,i.kt)("inlineCode",{parentName:"h3"},"Iterator")),(0,i.kt)("p",null,"Selain trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),", ada juga tipe data struct bernama sama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),". Perbedaan antara trait vs struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," adalah tipe struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," memiliki beberapa method untuk keperluan iterasi object. Jadi dengan memanfaatkan method-method tersebut, kita bisa melakukan iterasi data dan operasi sejenisnya tanpa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),"."),(0,i.kt)("p",null,"Semua tipe data slice bisa dikonversi ke tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),", caranya dengan mengakses method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," (atau method ",(0,i.kt)("inlineCode",{parentName:"p"},"chars")," khusus untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),")."),(0,i.kt)("p",null,"Dari object iterator tersebut, perulangan bisa dilakukan via keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", atau dengan memanfaatkan method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),". Perbedaannya pada iterasi menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),", block perulangan dituliskan dalam bentuk closure."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// array\nlet data_arr = ["a", "b", "c", "d"];\nlet iterator_arr = data_arr.iter();\niterator_arr.for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n\n// vector\nlet data_vec = vec!["a", "b", "c", "d"];\ndata_vec.iter().for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n\n// slice from vector\nlet data_vec = vec!["a", "b", "c", "d"];\nlet data_slice_vec = &data_vec[..];\ndata_slice_vec.iter().for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n\n// slice from String\nlet data_str = "abcd".to_string();\nlet data_borrow_str = &data_str;\ndata_borrow_str.chars().for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n')),(0,i.kt)("p",null,"Bisa dilihat pada contoh di atas, data slice diambil objek Iterator-nya menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"chars")," khusus untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"), kemudian di-iterasi menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(3753).Z,width:"456",height:"149"})),(0,i.kt)("h2",{id:"a482-pemanfaatan-tipe-data-iterator"},"A.48.2. Pemanfaatan tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Iterator")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," memiliki cukup banyak method untuk keperluan operasi data iterator, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"map"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"filter"),", dan lainnya."),(0,i.kt)("h3",{id:"-praktik-ke-1"},"\u25c9 Praktik ke-1"),(0,i.kt)("p",null,"Sebagai contoh, kita akan buat sebuah program sederhana yang melakukan operasi kuadrat pada elemen tiap-tiap array."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_arr = [1, 3, 5];\n\nlet doubles: Vec = data_arr\n .iter()\n .map(|e| e * e)\n .collect();\n\nprintln!("{doubles:?}");\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(9339).Z,width:"447",height:"121"})),(0,i.kt)("p",null,"Penjelasan:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"data_arr")," yang bertipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"[i32; 3]")," dikonversi ke tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"iter"),"."),(0,i.kt)("li",{parentName:"ol"},"Object ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," kemudian di-iterasi menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"map")," dan nilai baliknya dijadikan ",(0,i.kt)("em",{parentName:"li"},"replacement")," data elemen tersebut."),(0,i.kt)("li",{parentName:"ol"},"Object ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," kemudian di-collect data-nya ke bentuk ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"collect"),".")),(0,i.kt)("h3",{id:"-praktik-ke-2"},"\u25c9 Praktik ke-2"),(0,i.kt)("p",null,"Contoh lain penerapan method iterator bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec!["1", "2", "3", "4", "a"];\n\nlet numbers: Vec = data_vec\n .iter()\n .map(|e| -> i32 {\n match e.parse::() {\n Ok(n) => n,\n Err(_) => 0,\n }\n })\n .filter(|e| *e > 0 && *e % 2 == 0)\n .rev()\n .collect::>();\n\nprintln!("{numbers:?}");\n')),(0,i.kt)("p",null,"Program di atas melakukan beberapa hal:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Data ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," yang merupakan koleksi string di-konversi menjadi object ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter"),".")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Kemudian method ",(0,i.kt)("inlineCode",{parentName:"p"},"map")," diakses. Setiap elemen ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," di-iterasi, kemudian dikonversi dari ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", lalu dijadikan ",(0,i.kt)("em",{parentName:"p"},"replacement")," data elemen tersebut. Jika proses konversi gagal, maka angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," digunakan sebagai data element tersebut."),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Sampai sini, data yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"li"},'["1", "2", "3", "4", "a"]')," sekarang menjadi ",(0,i.kt)("inlineCode",{parentName:"li"},"[1, 2, 3, 4, 0]"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Selanjutnya, dilakukan proses filtering menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"filter")," dengan kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"*e > 0 && *e % 2 == 0")," yang kurang lebih artinya, jika nilai ",(0,i.kt)("em",{parentName:"p"},"dereference")," ",(0,i.kt)("inlineCode",{parentName:"p"},"e")," lebih besar dari ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," dan nilai tersebut adalah genap, maka filter bernilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Sampai sini, data yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"li"},"[1, 2, 3, 4, 0]")," sekarang menjadi ",(0,i.kt)("inlineCode",{parentName:"li"},"[2, 4]"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Kemudian, data kolektif tersebut dibalik urutan elemennya menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"rev"),"."),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Sampai sini, data yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"li"},"[2, 4]")," sekarang menjadi ",(0,i.kt)("inlineCode",{parentName:"li"},"[4, 2]"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Terakhir data di-collect menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"collect")," dengan ditentukan tipe data masing-masing elemen adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),"."))),(0,i.kt)("p",null,"Hasilnya ketika di run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(6644).Z,width:"447",height:"118"})),(0,i.kt)("h2",{id:"a483-method-tipe-data-iterator"},"A.48.3. Method tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Iterator")),(0,i.kt)("h3",{id:"-method-iter-iter_mut-into_iter"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"iter"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"iter_mut"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"into_iter")),(0,i.kt)("p",null,"Ketiga method ini berguna untuk konversi data slice ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),", perbedannya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," mengembalikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," yang isinya adalah reference (",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),") setiap element. Contoh penerapan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\ndata_vec.iter().for_each(|d| {\n println!("{}", *d * 2)\n});\n\nfor d in &data_vec {\n println!("{}", *d * 2)\n}\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter_mut")," mengembalikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," yang isinya adalah mutable reference (",(0,i.kt)("inlineCode",{parentName:"p"},"&mut T"),") setiap element. Contoh penerapan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut data_vec = vec![1, 2, 3, 4];\n\ndata_vec.iter_mut().for_each(|d| {\n *d = *d * 2;\n});\nprintln!("{:?}", data_vec);\n\nfor d in &mut data_vec {\n *d = *d * 2;\n}\nprintln!("{:?}", data_vec);\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"into_iter")," mengkonversi data slice ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," (",(0,i.kt)("em",{parentName:"p"},"move semantics"),")."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\ndata_vec.into_iter().for_each(|d| {\n println!("{}", d * 2)\n});\n\n// statement di bawah ini menghasilkan error,\n// karena ownership `data_vec` telah berpindah setelah method `into_iter` dipanggil\n\n// println!("{}", data_vec)\n')))),(0,i.kt)("h3",{id:"-method-collect"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"collect")),(0,i.kt)("p",null,"Method ini digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"collecting")," data Iterator ke bentuk tertentu. Contoh penerapannya bisa dilihat pada kode berikut ini."),(0,i.kt)("p",null,"Data ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," yang merupakan vektor bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," dikonversi ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," kemudian di-collect datanya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec: Vec = vec![1, 2, 3, 4];\n\nlet result: Vec<&i32> = data_vec.iter().collect();\nprintln!("{:?}", result);\n// [1, 2, 3, 4]\n')),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," menghasilkan object ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," yang menampung reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&T")," setiap element slice. Hal ini membuat penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"collect")," menghasilkan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec<&i32>")," (bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),")."),(0,i.kt)("h3",{id:"-method-map"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"map")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"map")," digunakan untuk mapping element setiap data iterator ke nilai baru."),(0,i.kt)("p",null,"Sebelumnya kita telah mempelajari method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"collect")," yang keduanya jika dikombinasikan dan digunakan pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," hasilnya adalah data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec<&i32>"),". Dengan memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"map"),", tipe data setiap element bisa di-mapping ke nilai baru dengan tipe data berbeda, misalnya menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec: Vec = vec![1, 2, 3, 4];\n\nlet result1: Vec<&i32> = data_vec.iter().collect();\nprintln!("{:?}", result1);\n// [1, 2, 3, 4]\n\nlet result2: Vec = data_vec\n .iter()\n .map(|d: &i32| -> i32 { *d })\n .collect();\nprintln!("{:?}", result2);\n// [1, 2, 3, 4]\n')),(0,i.kt)("p",null,"Contoh lainnya bisa dilihat pada ",(0,i.kt)("em",{parentName:"p"},"section")," ",(0,i.kt)("a",{parentName:"p",href:"/basic/trait-iterator#a482-pemanfaatan-tipe-data-iterator"},"A.48.2. Pemanfaatan tipe data ",(0,i.kt)("inlineCode",{parentName:"a"},"Iterator")),", di situ terdapat operasi mapping data slice numerik ke bentuk yang sama tapi nilai setiap element adalah kuadrat, dan ke bentuk lain dengan tipe data berbeda."),(0,i.kt)("h3",{id:"-method-rev"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"rev")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"rev")," kependekan dari ",(0,i.kt)("em",{parentName:"p"},"reverse"),", digunakan untuk membalikan urutan data slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nprintln!("{:?}", data_vec);\n// [1, 2, 3, 4]\n\nlet result: Vec<&i32> = data_vec.iter().rev().collect();\nprintln!("{:?}", result);\n// [4, 3, 2, 1]\n')),(0,i.kt)("h3",{id:"-method-filter"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"filter")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"filter")," digunakan untuk memfilter element data slice. Data kolektif diiterasi kemudian dicek menggunakan closure, jika nilai balik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," maka elemen tersebut masuk dalam dalam hasil filter, selebihnya maka dianggap tidak memenuhi kondisi filter dan elemen di-",(0,i.kt)("em",{parentName:"p"},"exclude"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet odd: Vec<&i32> = data_vec.iter().filter(|d| *d % 2 != 0).collect();\nprintln!("odd numbers: {:?}", odd);\n// odd numbers: [1, 3]\n\nlet even: Vec<&i32> = data_vec.iter().filter(|d| *d % 2 == 0).collect();\nprintln!("even numbers: {:?}", even);\n// odd numbers: [2, 4]\n')),(0,i.kt)("h3",{id:"-method-cloned"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"cloned")),(0,i.kt)("p",null,"Digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"cloning")," data slice secara keseluruhan tanpa mengubah tipe data. Hasilnya adalah data dengan skema sama persis (dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),") tapi berbeda owner."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result: Vec = data_vec.iter().cloned().collect();\nprintln!("{:?}", result);\n// [1, 2, 3, 4]\n')),(0,i.kt)("h3",{id:"-method-copied"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"copied")),(0,i.kt)("p",null,"Secara ",(0,i.kt)("em",{parentName:"p"},"high-level")," ",(0,i.kt)("inlineCode",{parentName:"p"},"copied")," menghasilkan output yang sama dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"cloned"),". Namun jika dibahas dari sisi management memory-nya, ada perbedaan yang cukup besar."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result: Vec = data_vec.iter().copied().collect();\nprintln!("{:?}", result);\n// [1, 2, 3, 4]\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai clone vs copy akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/copy-clone-move-drop"},"Copy, Clone, Move, Drop"))),(0,i.kt)("h3",{id:"-method-cmp"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"cmp")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"cmp")," kependekan dari ",(0,i.kt)("em",{parentName:"p"},"compare"),", digunakan untuk membandingkan 2 buah data iterasi dengan nilai balik bertipe enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Ordering"),". Dari tipe data enum tersebut nantinya bisa dicek apakah 2 buah data slice tersebut sama (secara ",(0,i.kt)("em",{parentName:"p"},"Lexicographical"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec1 = vec![1, 2, 3, 4];\nlet data_vec2 = vec![1, 2, 3, 4];\nlet result = data_vec1.iter().cmp(data_vec2.iter());\nprintln!("{:?}", result.is_eq());\n// true\n')),(0,i.kt)("p",null,"Enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Ordering")," memiliki beberapa method, salah satunya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"is_eq")," yang mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," jika dua buah data slice tersebut adalah sama."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai ",(0,i.kt)("inlineCode",{parentName:"p"},"Ordering")," akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/enum-ordering"},"Enum Ordering"))),(0,i.kt)("h3",{id:"-method-count"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"count")),(0,i.kt)("p",null,"Digunakan untuk melihat size dari elemen Iterator."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet length = data_vec.iter().count();\nprintln!("{:?}", length);\n// 4\n')),(0,i.kt)("h3",{id:"-method-eq-ne-gt-ge-lt-le"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"eq"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"ne"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"gt"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"ge"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"lt"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"le")),(0,i.kt)("p",null,"6 Method ini digunakan untuk komparasi dua buah slice. Penggunakan 6 method ini merupakan alternatif selain menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"cmp"),"."),(0,i.kt)("p",null,"Sebagai contoh, penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"eq")," berikut untuk untuk mengecek apakah 2 buah data slice adalah sama (secara ",(0,i.kt)("em",{parentName:"p"},"Lexicographical"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec1 = vec![1, 2, 3, 4];\nlet data_vec2 = vec![1, 2, 3, 4];\nlet result = data_vec1.iter().eq(data_vec2.iter());\nprintln!("{:?}", result);\n// true\n')),(0,i.kt)("p",null,"Kode di atas adalah ekuivalen dengan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec1 = vec![1, 2, 3, 4];\nlet data_vec2 = vec![1, 2, 3, 4];\nlet result = data_vec1.iter().cmp(data_vec2.iter());\nprintln!("{:?}", result.is_eq());\n// true\n')),(0,i.kt)("p",null,"Berikut merupakan kegunaan tiap-tiap method di atas:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"eq")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"equal lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"ne")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"not equal lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"gt")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"greater than lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"ge")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"greater than or equal lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"lt")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"lower than lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"le")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"lower than or equal lexicographical comparison"))),(0,i.kt)("h3",{id:"-method-find"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"find")),(0,i.kt)("p",null,"Digunakan untuk mencari apakah suatu elemen ada atau tidak dengan kondisi pencarian dituliskan dalam bentuk closure. Nilai balik method ini bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("p",null,"Sebagai contoh, perhatikan kode berikut. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"find")," digunakan untuk mencari elemen yang nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"4"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result = match data_vec.iter().find(|d: &&i32| **d == 4) {\n Some(d) => *d,\n None => 0\n};\nprintln!("{:?}", result);\n// 4\n')),(0,i.kt)("h3",{id:"-method-last"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"last")),(0,i.kt)("p",null,"Digunakan untuk mengambil elemen terakhir data Iterator. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"last")," ini mengembalikan nilai balik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result: &i32 = data_vec.iter().last().unwrap();\nprintln!("{:?}", result);\n// 4\n')),(0,i.kt)("p",null,"Satu hal yang unik perihal notasi closure method ",(0,i.kt)("inlineCode",{parentName:"p"},"find"),", parameter closure adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&&T"),". Dari tipe tersebut, untuk mengambil ",(0,i.kt)("em",{parentName:"p"},"underlying value")," gunakan operator ",(0,i.kt)("em",{parentName:"p"},"dereference")," dua kali. Contohnya pada kode di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"d")," bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&&i32"),", untuk mengambil nilai sebenarnya digunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"**d"),"."),(0,i.kt)("h3",{id:"-method-fold"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"fold")),(0,i.kt)("p",null,"Method ini digunakan untuk mengkonversi setiap element ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," menjadi sebuah akumulator yang direpresentasikan oleh 1 buah variabel."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"konsep ",(0,i.kt)("inlineCode",{parentName:"p"},"fold")," milik Rust mirip seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"reduce")," pada bahasa pemrograman lain")),(0,i.kt)("p",null,"Pada contoh berikut, kita coba terapkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"fold")," untuk grouping data vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," menjadi 1 buah data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"NumberCategory"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Data numerik genap elemen ",(0,i.kt)("inlineCode",{parentName:"li"},"data_vec")," masuk ke property ",(0,i.kt)("inlineCode",{parentName:"li"},"even")," milik ",(0,i.kt)("inlineCode",{parentName:"li"},"NumberCategory"),"."),(0,i.kt)("li",{parentName:"ul"},"Data numerik ganjil elemen ",(0,i.kt)("inlineCode",{parentName:"li"},"data_vec")," masuk ke property ",(0,i.kt)("inlineCode",{parentName:"li"},"odd")," milik ",(0,i.kt)("inlineCode",{parentName:"li"},"NumberCategory"),".")),(0,i.kt)("p",null,"Dalam penerapannnya, parameter pertama method ",(0,i.kt)("inlineCode",{parentName:"p"},"fold")," diisi dengan ",(0,i.kt)("em",{parentName:"p"},"initial value"),", dan parameter ke-2 isinya closure untuk akumulasi data."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct NumberCategory {\n even: Vec,\n odd: Vec,\n}\n\nlet data_vec = vec![1, 2, 3, 4];\n\nlet data_grouped = data_vec.iter().fold(\n NumberCategory{ even: Vec::new(), odd: Vec::new() }, \n |mut group, each| {\n if *each % 2 == 0 {\n group.even.push(*each)\n } else {\n group.odd.push(*each)\n }\n group\n }\n);\n\nprintln!("{:?}", data_grouped);\n')),(0,i.kt)("p",null,"Pada kode di atas, data ",(0,i.kt)("inlineCode",{parentName:"p"},"each")," di-cek nilainya, jika genap maka dimasukan dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"group.even"),", dan sisanya masuk ",(0,i.kt)("inlineCode",{parentName:"p"},"group.odd"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(2986).Z,width:"454",height:"122"})),(0,i.kt)("h3",{id:"-method-inspect"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"inspect")),(0,i.kt)("p",null,"Biasanya digunakan sewaktu debugging, untuk inspeksi flow pemanggilan method-method milik Iterator. Contoh penerapannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet result = data_vec.iter()\n .cloned()\n .inspect(|x| println!("about to filter: {x}"))\n .filter(|x| x % 2 == 0)\n .inspect(|x| println!("made it through filter: {x}"))\n .fold(0, |sum, i| sum + i);\n\nprintln!("sum: {:?}", result);\n// sum: 10\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(4695).Z,width:"449",height:"222"})),(0,i.kt)("h3",{id:"-method-sum"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"sum")),(0,i.kt)("p",null,"Digunakan untuk mencari total/summary data slice numerik."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1.1, 2.2, 3.3, 4.5];\nlet result: f64 = data_vec.iter().sum();\nprintln!("sum: {:?}", result);\n// sum: 11.1\n')),(0,i.kt)("h3",{id:"-method-reduce"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"reduce")),(0,i.kt)("p",null,"Method ini digunakan untuk mengiterasi setiap element array dengan setiap iterasi menampilkan data element ke-",(0,i.kt)("inlineCode",{parentName:"p"},"n")," dan element ke-",(0,i.kt)("inlineCode",{parentName:"p"},"n+1"),"."),(0,i.kt)("p",null,"Contoh penerapan sederhananya pada pencarian angka numerik terbesar, yang kode-nya bisa dilihat berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet max_number = data_vec.iter().reduce(|left, right| {\n print!("left ({left}) vs right ({right})");\n\n if *left >= *right { \n println!(" -> left ({left}) is greater");\n left\n } else {\n println!(" -> right ({right}) is greater");\n right\n }\n});\n\nmatch max_number {\n Some(n) => println!("max_number: {:?}", n),\n None => println!("no data found"),\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(1611).Z,width:"449",height:"170"})),(0,i.kt)("h3",{id:"-method-min-max"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"min"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"min")," digunakan untuk mencari elemen terkecil pada Iterator, dan ",(0,i.kt)("inlineCode",{parentName:"p"},"max")," untuk mencari elemen terbesar. Keduanya mengembalikan nilai balik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet min = data_vec.iter().min().unwrap();\nprintln!("min: {min}");\n// min: 1\n\nlet max = data_vec.iter().max().unwrap();\nprintln!("max: {max}");\n// max: 4\n')),(0,i.kt)("h2",{id:"a484-method-lainnya"},"A.48.4. Method lainnya"),(0,i.kt)("h3",{id:"-method-sort-milik-vect"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort")," milik ",(0,i.kt)("inlineCode",{parentName:"h3"},"Vec")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"sort")," bukanlah property Iterator, melainkan milik tipe data vector. Kegunaan method ini adalah untuk sorting urutan elemen vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut data_vec = vec![2, 3, 1, 4];\nprintln!("before: {data_vec:?}");\n// before: [2, 3, 1, 4]\n\ndata_vec.sort();\nprintln!("after: {data_vec:?}");\n// after: [1, 2, 3, 4]\n')),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/trait_iterator"},"github.com/novalagung/dasarpemrogramanrust-example/../trait_iterator")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/vector"},"Vector"))),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Desugar iterator")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/index.html"},"https://doc.rust-lang.org/std/iter/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/trait.Iterator.html"},"https://doc.rust-lang.org/std/iter/trait.Iterator.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://becomebetterprogrammer.com/rust-iter-vs-iter_mut-vs-into_iter/"},"https://becomebetterprogrammer.com/rust-iter-vs-iter_mut-vs-into_iter/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://blog.thoughtram.io/iterators-in-rust/"},"https://blog.thoughtram.io/iterators-in-rust/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://blog.logrocket.com/rust-iterators-closures-deep-dive/"},"https://blog.logrocket.com/rust-iterators-closures-deep-dive/"))))}A.isMDXComponent=!0},3753:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,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"},9339:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB5CAIAAAAmt7g4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjRUMTg6NTY6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc5ODFjYTRmLTJhYjItNDQ0Yy1iMmI5LTZiYzA2ZjRhZWFjMSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3OTgxY2E0Zi0yYWIyLTQ0NGMtYjJiOS02YmMwNmY0YWVhYzEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3OTgxY2E0Zi0yYWIyLTQ0NGMtYjJiOS02YmMwNmY0YWVhYzEiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjFkOGFmM2Q4LTEwNDItNzI0MC1hOTk5LWY5YWY0Mzc2NmI4ZTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjc5ODFjYTRmLTJhYjItNDQ0Yy1iMmI5LTZiYzA2ZjRhZWFjMSIgc3RFdnQ6d2hlbj0iMjAyMy0wMS0yNFQxODo1NjoxNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Ph37Bx8AAA/0SURBVHja7Z09ctw4E4Z9kpGdOXZsO1VmOXHgQM5UTl1bparNfBAfwafY/DvUpyFnSADdDTRIAsMZPW9t1VocEv982ADJl28OCCGE6vWGJkAIIeiJEELQEyGEoCdCCEFPhBBC0BMhhKAnQghBT4QQgp4IIQQ9EUIIQU+EEIKeCCEEPRFCCHoihBD0HPXw9Pzr8ePxXx8ffz0/PWxeqpcMGqS6rkCnGi9RRSsty2hd8Tq02Mtfz8UiumuxctQdD5cZFXPfYSOjy3bcm3VjrxE9jQGuNEuguRzRdrN48dGF3F4KtOCEW3C2qxmd0jBLud340JtuQfoL6KnWPe6lMY0m9DRbHnrunJWX67g360ZeK3r66nw8s865D3Q5/uEDr3Z09iitpi3oaew8jJAHa5hsND7MpltNz+V119JpQ89SstBzr5HmxTruzbqyj+We4oOpCmOklAR1wUZ1z6QByudIyL/TX354JkfHfw41Kp7HerfIujtaKSmJcnk97hFfZcPDpyNE7sdVkMdT4PqQC2DVpovymEsa9U3wh1KkeVPUnkFMGeYp6m6fLbI91TTlxrCe46/nFIyWLzeyZ3gHWb78c/ph2HXs2OwIGbcZvaml6WiQ8w/G4f6xpI55pUZG3Ytj6TzmlKHYr+PW0lMUMppPTvz5+PgUTu3ns0jAMECWPHeL+NTomZ/iZugZ5a/R03tmy7pbrWRVT23mYdfgl7D402Yl93NVgv/n8Kk2nV2gtHQWiOLKhm09TRr0rCx6ivZU08xvPB6a71FvIxu9qe55Iso0Bn49WiNEOTuM3rTSlI08pxk0vDz8Y81YKo35ct3lWLLODmP49ui4lfSUGcVbEh7J5lDCuVzMVQq5kyaKl2OLq5lpacsBflr/0hHn/fVW0hpEzyj485ylSFIW5LTL+bf0/5kylyNCbcRnixT9qFy3YrImU4I02lDaU01T33g6Hx6fnu1GM0Z3Zv9MbyrXmPjGgZqTenZYvamkqdc9Xa6aoZa9l+EfS+qY99e92J7W8O3QcSvpKeloDPwkyBYTCRnvq0FyKfiMzixzDm2lkIs9fQ1pdktunpuwUC+8PRamy70+PmTulfRUm257etpxqWPoK+2ppqlvzF9bw7T9jWz1prZnuUbzGlR6dmTomaaZqfsce87Rbn4JqjCWSmNemzuVx7p6dpjDt33HtY89T9fM/JXsvIODju7Ys/I+iDi6eAlSiqSPWVn3Ig/kFNLu8vEs0pPUcl9GT7E62DD2FN0YHutizYgVkaa+8VyzcnTjb2S9N/U9vTWylrr89NQaOYw4so3sHUueMb+MnmpJMsO3dcc1WfcUE4FkuUafzc/XLBNZleueVgTliT3TdU513dNzZqt1V1upBPkpcYVDv8T6ld3yC+kZNZ0oXxy3PM8npiiSGVyFS3KZuKl0vqmLmPmNxoxVyd3dyHpv6nuWajQVyljrctJTrbtxSlmHe8aSY8yX6SnGknl2FOKhlh23xT33KCX1xlZ0p/AxuBZpkbCewpJ77vY6Wf2836anOvFOnkXM1l25/afnlVzvRR8H9zOne/FK7n565ppO3PwNpr8PU4soRRKRs2w7u+7lNn4WT5VmHv5V7k+qN8q0Ls43stGb2p6Z+2CyRmJ7BT31BtHas7gEVRhLVoP46KmOpczZYT+l07jjVtOz4oGgFg927feRs1fWBLde9965N3xuunQ78rZGWN+OW/muUcte5tFk9FrUi56L1vrRdvTsAfjdveeO0C3Q0367GfWiJ0IIQU+aACGEoCdCCEFPhBCCni314e7fb+/++Tz9fffPt3f/jv/d5/fcgXzGl69Ni25L4mC9rkg4WO+cnj++nLn27e7rpvRMQTky9N6zZ/fTvEDPFmlWjVr3/VhnRlVpagZyOFjLZsfB+nXRc0DnBM27H21jQI2eOwmSWqY5PND3uPRp2eBxQP0lxgUZVaQpTxscrJ1YwcH6lun56fPbl7jv5wcjcpwn2nc/X3a7HzZ+uftxf95+3O3tj8/nnb/cfcpP0lN6anvqacZFMsNky6vVazSr2Qbb/q+Gj7IcPMmL3A6kTX8mh2UTcWdUkaY2/HGwdlAFB+s+DtaXo+fXIwff/nhvL0Se/n2k5xFk74+8e/lpwO5EtBFkp5+yYaZjY5jm8O8B7nPiQ9aizOWz1WU0a19MZZq113HHm1oRh5Q36sNqrMmoMs2cye0BB+sDDtYXdLC+HD2HaXtKogGpc2R33OfLkZ4DvF4odtw/pOc5dD0Tdgt6ntKcOD4GpO+D4LSenh6j2Vp61uCz0qr0HC1FF9z8OVxJT2+aojFwsM4uJONg3dPBemexZ7wS6qfnac8m9Bz2GTcmcHfT02U0W0PPQ8ZHeSk9ozElL7i+iNe3ROBPU3P6xME6D1EcrHs5WO9s3TO5jzRGlN7Y836bmbtKz2nRU1moXUDPXDzqpKea1Cp6ynW65DDHKVy77ukJqjL0xME607o4WB8aO1hfjp4n5IWs/Kyse/78UKanAPGW9BwS9z9NJfHhNZq16ZlFkjus9MUuw02KePlcRamx2qZklO5pp1m77omDtRp84mDdy8H6kvScABrd4B5RGAR6OXqmIWF6c3xauIw2nm/Z63vK2PNnvGch/EwfZvQazZq2wTLNoo+yfffVce/Isp4VZ2JmtiOcsZWDfcsOSiSCg7V+GxwH684O1hem5wrF656N12fTpdhPB9RLGzm74mB983Xv7mANPUtSl2Kh5xXyEyHo2Zee6cx9n+hMpko353X7mgM6BD0RQui2BT0RQgh6IoQQ9EQIIei5QH4nY8+ey246Vbgpb3ifY74ldJk7J3570G2snbu7/G3yAcuaurt6dN7pOm7+lbut6su4V2kTfmF6Rq9FRi/C+52MPXteGT0v+qgi9Nz+GrPSOXRnI6TmXWBvQbtZemeevq8uwB7oed8+H+h5yYxukZ5Vp7Y/t6ugZwUVOxR1gf3209OTfB1ObLxOevqdjA135PC9zHHPkZ6fz/sn/kzTu5vy8Dw9S6/3zS+y5QwXSgNONfMZ30nzuM8qe1o2zIpLrmHcq/nppqlq78I9ZJtuZRDj6w7duNdyTFLeQjTqrnaH2t2G67CDni7/7JzFr14j2Up2RkV/Yuna4HDq8rdndmgUB8pph7gK2kaXH/l+Y0+Pk7GaSOKdnDk8OHDaqBg2e6ZkoV+EeFdXsyLegJ7R0Bde75HRrPT9zcQFwmvHNO416xIseWkN4ipGLT3d3WEa9+a8hIXbj7RgS7ojY/luuA4vjz2dFr8fjRqpfXSwzRJr3Lu9sXexPcttUbTfDlvhl2iwYKOz0Pta9wzNjTxuciY9U58k005pWmk9ud5F77ln6WlaYynmkooV8Rb0VMzhDaNZ1ZXMS0/bwMIYZGEjKA3icbStpqe7O3TjXr2R088q5Z3YTbPPTCiatuAGM/esxa9aI33QHtwfLMo7B1YYRnnaU03dZ78dGTPJOib0dODzqmJPHz0j36Zo5h4f/vX+nXRjit5zr6en5vMYfROgDM919DSMZqVrejt6RudihfGlb6Jq7evuDt24NxPgz5GaXCpbRM/ch1mW0tNt8avUyBq0RbtFbTGiYAXfgp5O+23Vt9A2M/T4kd8iPSeNH0Ce5uPZ2DM8ZB091c5TPxnWOPbUoqrmsWfymIrxKZlOsaf57Uth3JuZuRvY3ib2TFm0jJ5+i1+tRhUfbyqWMOsh3YKebvtt1RtC3SjMys3y3zQ9Zx/ljI38vXHI2S7EXPdUbVnNkF9YEdfRU9jcmjNN1Wg2XIT8ZX2gbj09vbO6nEfv0nVPf3eoxr1aI1es57npWXAddtFTHOa2+LUvJ9agVYPP/PMMC2q0nJ71lt4VC7qlsbdDevqdjB3uyLFxvYCvZro8Rqyx0X121hDZshZ8YR3jKDcvm21uHfeI7S/QKvM9y7BZo6fhp2uZ7GoF0Jtu3T13b3cYDaJ5CRd9f0uf/y3dcy98M9Bx7z29RZ63+NXvuNuDRHteQouXTaOvcoUq2zObQtbS209Prx85b2ruTls/Itf38cZbkvIJqtYPLzburG1qtK/nPS8o6Ak9UXExIDu/vSJ6blWj7d81gp5oqxG+5Xvu0HOLvmj+Anqn99w3q9HG77lDT4QQejWCngghBD0RQgh6IoQQ9NyJKhznPJofXd+Nikv5Ta3bmj2ecpXWufscIeim6Rm9pb4l7Gocl93SHvq4pP1i6dHztsaXRu6rG0ShZ4s0m6jLg04Iegb0HF/7GY08unzGvWcA2DKjAgEb2wbrKXT3P/aQc3gnh6/Go5ulZ2K7qb2pKSyT/T7K+p7yBdDY7K4YZ+zcvLahbbDM3SqnUXellaR1rquR81cQYYbq6tLgLfrYUjJ8vf6ZuTr03FHsOdgg5d5zjz2P/T7KtmXyuFygmjAtCot6mtfKzX1tg5VCyU1q3dVWsmLaSo9eg4t+65HURiS1vbb6CEHP7vRU40GVnq6NNj31ePZ9EJxuQE/1JG9jXpsLFw8XsA226Skt1WwUeulZg08H5MyWH8rzGJtX5a8gCHp2jT2FGVIPeg77BJGvf9qeO3f6mdcK2HS3DZaoU+lpmIHprxF66HnwOdpW0NNu+ZTVuT0R9LzIzH32Ku5Lz8Szbi09e5rXip+62wbLgvnomYtHnfRUk1pHz0zLP8wJ4CUAPXdHTy0ODUyLG9BzyHFBvJk9Lbua1wq69LYNlmyT5Sx88iFoJathsuxzrTwqO6WOkEbLTyWdk+C5JOi5N3qeeDesfk6fIZpNiysDUpfj8pnOq8LPi5rXSuB0sg0urFuWVi3UVrIclw8Fa2efmW5aesVPV7RJbHIdPDVa9Y1lBD1vT8la53HpYP74e3Nta8fb7t6Fp5zcOUHQ83Up+ircGId2pOcF7HhvupwIQc+eimfuHdGpzNz3i6RrKKf6wUQ4j6AnQghBT4QQgp4IIQQ9EUIIQU+EEIKeCCEEPRFCCHoihBD0RAghBD0RQgh6IoQQ9EQIIeiJEELQ09Lvv/876b8/36+ssnPZ//6m6xFC3empYXMA00KergPy9z//CSYG2yQrjz9CT4TQDuh5pN/fPy9MWgq/83FDQr9rDw+PPv072KrnCD0RQhen5++/w9/fl9EzBuY6sM1pQU+E0LXM3FfQMzzKSh16IoSgpx18rlk8DSfu8bpnSkroiRC6BXrGd8Jf/r0IbAMu1SPlL9ATIXQb9IwTWZDGAEjzOAFL6IkQ2jk9x/mzG4dpCr7D8+jUglLoiRDaBT2TZytDlI0/5UmlPa5Zcfg87Z9yj4skwQo9EUJ7ij1Ntq2Yzq88/OCcyiOE0I7oOQaFi9m38nDoiRDaIT15zx0hhPBYQggh6IkQQtATIYSgJ0IIQU+EEELQEyGEoCdCCEFPhBCCngghBD0RQghBT4QQgp4IIQQ9EUIIeiKEEPRECCEEPRFCaLn+DyiB1plsXAGMAAAAAElFTkSuQmCC"},6644:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB2CAIAAADX4QrtAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjRUMjI6MTg6MTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjU2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjU2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFjODNjNWYwLTQ5ZGUt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"},2986:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcYAAAB6CAIAAACqf2TEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjVUMDE6NTM6MjcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU2OjUxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU2OjUxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZhNDdmZjZmLTdhOTIt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"},4695:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAADeCAIAAADKLixFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjVUMDE6NTg6MzkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU3OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU3OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRlYjAxNTkxLTI3YjUt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"},1611:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAACqCAIAAABanWOSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjVUMDI6MDg6MDUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU4OjA0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU4OjA0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMwMDIxNTU5LThlNjEt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"}}]); \ No newline at end of file diff --git a/assets/js/82a9b669.bb49d726.js b/assets/js/82a9b669.bb49d726.js deleted file mode 100644 index c1af1c12..00000000 --- a/assets/js/82a9b669.bb49d726.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[3257],{3905:(e,a,t)=>{t.d(a,{Zo:()=>m,kt:()=>c});var n=t(7294);function i(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(i[t]=e[t]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var p=n.createContext({}),o=function(e){var a=n.useContext(p),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},m=function(e){var a=o(e.components);return n.createElement(p.Provider,{value:a},e.children)},A={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},k=n.forwardRef((function(e,a){var t=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,m=d(e,["components","mdxType","originalType","parentName"]),k=o(t),c=i,u=k["".concat(p,".").concat(c)]||k[c]||A[c]||r;return t?n.createElement(u,l(l({ref:a},m),{},{components:t})):n.createElement(u,l({ref:a},m))}));function c(e,a){var t=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=t.length,l=new Array(r);l[0]=k;var d={};for(var p in a)hasOwnProperty.call(a,p)&&(d[p]=a[p]);d.originalType=e,d.mdxType="string"==typeof e?e:i,l[1]=d;for(var o=2;o{t.r(a),t.d(a,{assets:()=>p,contentTitle:()=>l,default:()=>A,frontMatter:()=>r,metadata:()=>d,toc:()=>o});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:48,title:"A.48. Trait \u279c Iterator",sidebar_label:"A.48. Trait \u279c Iterator"},l=void 0,d={unversionedId:"basic/trait-iterator",id:"basic/trait-iterator",title:"A.48. Trait \u279c Iterator",description:"Iterator adalah salah satu trait dan tipe data custom penting pada Rust programming, gunanya untuk iterasi data. Di chapter ini kita akan mempelajarinya beserta beberapa module item lainnya yang masih relevan dengan topik Iterator.",source:"@site/docs/basic/trait-iterator.md",sourceDirName:"basic",slug:"/basic/trait-iterator",permalink:"/basic/trait-iterator",draft:!1,tags:[],version:"current",sidebarPosition:48,frontMatter:{sidebar_position:48,title:"A.48. Trait \u279c Iterator",sidebar_label:"A.48. Trait \u279c Iterator"},sidebar:"tutorialSidebar",previous:{title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",permalink:"/basic/trait-function"},next:{title:"A.49. Attributes",permalink:"/basic/attributes"}},p={},o=[{value:"A.48.1. Iterator & IntoIterator",id:"a481-iterator--intoiterator",level:2},{value:"\u25c9 Trait Iterator & IntoIterator",id:"-trait-iterator--intoiterator",level:3},{value:"\u25c9 Struct Iterator",id:"-struct-iterator",level:3},{value:"A.48.2. Pemanfaatan tipe data Iterator",id:"a482-pemanfaatan-tipe-data-iterator",level:2},{value:"\u25c9 Praktik ke-1",id:"-praktik-ke-1",level:3},{value:"\u25c9 Praktik ke-2",id:"-praktik-ke-2",level:3},{value:"A.48.3. Method tipe data Iterator",id:"a483-method-tipe-data-iterator",level:2},{value:"\u25c9 Method iter, iter_mut, into_iter",id:"-method-iter-iter_mut-into_iter",level:3},{value:"\u25c9 Method collect",id:"-method-collect",level:3},{value:"\u25c9 Method map",id:"-method-map",level:3},{value:"\u25c9 Method rev",id:"-method-rev",level:3},{value:"\u25c9 Method filter",id:"-method-filter",level:3},{value:"\u25c9 Method cloned",id:"-method-cloned",level:3},{value:"\u25c9 Method copied",id:"-method-copied",level:3},{value:"\u25c9 Method cmp",id:"-method-cmp",level:3},{value:"\u25c9 Method count",id:"-method-count",level:3},{value:"\u25c9 Method eq, ne, gt, ge, lt, le",id:"-method-eq-ne-gt-ge-lt-le",level:3},{value:"\u25c9 Method find",id:"-method-find",level:3},{value:"\u25c9 Method last",id:"-method-last",level:3},{value:"\u25c9 Method fold",id:"-method-fold",level:3},{value:"\u25c9 Method inspect",id:"-method-inspect",level:3},{value:"\u25c9 Method sum",id:"-method-sum",level:3},{value:"\u25c9 Method reduce",id:"-method-reduce",level:3},{value:"\u25c9 Method min, max",id:"-method-min-max",level:3},{value:"A.48.4. Method lainnya",id:"a484-method-lainnya",level:2},{value:"\u25c9 Method sort milik Vec<T>",id:"-method-sort-milik-vect",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:o};function A(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},m,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Iterator adalah salah satu trait dan tipe data custom penting pada Rust programming, gunanya untuk iterasi data. Di chapter ini kita akan mempelajarinya beserta beberapa module item lainnya yang masih relevan dengan topik Iterator."),(0,i.kt)("h2",{id:"a481-iterator--intoiterator"},"A.48.1. ",(0,i.kt)("inlineCode",{parentName:"h2"},"Iterator")," & ",(0,i.kt)("inlineCode",{parentName:"h2"},"IntoIterator")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," adalah sebuah nama yang dipakai sebagai nama module item dalam ",(0,i.kt)("strong",{parentName:"p"},"Rust Standard Library")," maupun ",(0,i.kt)("strong",{parentName:"p"},"Rust Core Library"),", digunakan untuk iterasi data dan operasi lain yang berhubungan dengannya."),(0,i.kt)("p",null,"Iterator sendiri merupakan istilah untuk object atau trait yang bisa diiterasi, baik menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," ataupun menggunakan method iterator seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each")," (yang juga akan kita bahas disini)."),(0,i.kt)("h3",{id:"-trait-iterator--intoiterator"},"\u25c9 Trait ",(0,i.kt)("inlineCode",{parentName:"h3"},"Iterator")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"IntoIterator")),(0,i.kt)("p",null,"Dalam perulangan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", tipe data variabel yang digunakan harus memiliki trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),". Jika tidak, pasti error muncul."),(0,i.kt)("p",null,"Tipe data slice di Rust by default mengadopsi trait bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"IntoIterator"),", yang trait ini digunakan untuk konversi data bertipe slice ke bentuk iterator."),(0,i.kt)("p",null,"Dalam praktiknya, tidak perlu mengakses method tertentu untuk mendapatkan object iterator suatu data. Cukup gunakan variabel tipe data slice pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", maka proses konversi ke bentuk iterator akan dilakukan oleh Rust secara otomatis dibalik layar."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// array\nlet data_arr = ["a", "b", "c", "d"];\nfor e in &data_arr {\n print!("{e:?} ")\n}\n\nprintln!();\n\n// vector\nlet data_vec = vec!["a", "b", "c", "d"];\nfor e in &data_vec {\n print!("{e:?} ")\n}\n\nprintln!();\n\n// slice\nlet data_vec = vec!["a", "b", "c", "d"];\nlet data_slice_vec = &data_vec[..];\nfor e in data_slice_vec {\n print!("{e:?} ")\n}\n')),(0,i.kt)("p",null,"Dianjurkan untuk selalu menggunakan teknik ",(0,i.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing")," dalam penggunaan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," pada tipe data yang karakteristiknya adalah ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership#a344-copy-semantics-vs-move-semantics"},"Move Semantics"),", hal ini karena dalam penerapan keyword tersebut, terjadi proses konversi tipe data dengan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"IntoIterator")," ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),"."),(0,i.kt)("p",null,"Jika data yang digunakan bukan data borrow, maka pasti owner berpindah."),(0,i.kt)("h3",{id:"-struct-iterator"},"\u25c9 Struct ",(0,i.kt)("inlineCode",{parentName:"h3"},"Iterator")),(0,i.kt)("p",null,"Selain trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),", ada juga tipe data struct bernama sama, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),". Perbedaan antara trait vs struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," adalah tipe struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," memiliki beberapa method untuk keperluan iterasi object. Jadi dengan memanfaatkan method-method tersebut, kita bisa melakukan iterasi data dan operasi sejenisnya tanpa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),"."),(0,i.kt)("p",null,"Semua tipe data slice bisa dikonversi ke tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),", caranya dengan mengakses method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," (atau method ",(0,i.kt)("inlineCode",{parentName:"p"},"chars")," khusus untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),")."),(0,i.kt)("p",null,"Dari object iterator tersebut, perulangan bisa dilakukan via keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", atau dengan memanfaatkan method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),". Perbedaannya pada iterasi menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),", block perulangan dituliskan dalam bentuk closure."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// array\nlet data_arr = ["a", "b", "c", "d"];\nlet iterator_arr = data_arr.iter();\niterator_arr.for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n\n// vector\nlet data_vec = vec!["a", "b", "c", "d"];\ndata_vec.iter().for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n\n// slice from vector\nlet data_vec = vec!["a", "b", "c", "d"];\nlet data_slice_vec = &data_vec[..];\ndata_slice_vec.iter().for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n\n// slice from String\nlet data_str = "abcd".to_string();\nlet data_borrow_str = &data_str;\ndata_borrow_str.chars().for_each(|e| {\n print!("{e:?} ")\n});\n\nprintln!();\n')),(0,i.kt)("p",null,"Bisa dilihat pada contoh di atas, data slice diambil objek Iterator-nya menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"chars")," khusus untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"), kemudian di-iterasi menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(3753).Z,width:"456",height:"149"})),(0,i.kt)("h2",{id:"a482-pemanfaatan-tipe-data-iterator"},"A.48.2. Pemanfaatan tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Iterator")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," memiliki cukup banyak method untuk keperluan operasi data iterator, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"for_each"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"map"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"filter"),", dan lainnya."),(0,i.kt)("h3",{id:"-praktik-ke-1"},"\u25c9 Praktik ke-1"),(0,i.kt)("p",null,"Sebagai contoh, kita akan buat sebuah program sederhana yang melakukan operasi kuadrat pada elemen tiap-tiap array."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_arr = [1, 3, 5];\n\nlet doubles: Vec = data_arr\n .iter()\n .map(|e| e * e)\n .collect();\n\nprintln!("{doubles:?}");\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(9339).Z,width:"447",height:"121"})),(0,i.kt)("p",null,"Penjelasan:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"data_arr")," yang bertipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"[i32; 3]")," dikonversi ke tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"iter"),"."),(0,i.kt)("li",{parentName:"ol"},"Object ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," kemudian di-iterasi menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"map")," dan nilai baliknya dijadikan ",(0,i.kt)("em",{parentName:"li"},"replacement")," data elemen tersebut."),(0,i.kt)("li",{parentName:"ol"},"Object ",(0,i.kt)("inlineCode",{parentName:"li"},"Iterator")," kemudian di-collect data-nya ke bentuk ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"collect"),".")),(0,i.kt)("h3",{id:"-praktik-ke-2"},"\u25c9 Praktik ke-2"),(0,i.kt)("p",null,"Contoh lain penerapan method iterator bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec!["1", "2", "3", "4", "a"];\n\nlet numbers: Vec = data_vec\n .iter()\n .map(|e| -> i32 {\n match e.parse::() {\n Ok(n) => n,\n Err(_) => 0,\n }\n })\n .filter(|e| *e > 0 && *e % 2 == 0)\n .rev()\n .collect::>();\n\nprintln!("{numbers:?}");\n')),(0,i.kt)("p",null,"Program di atas melakukan beberapa hal:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Data ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," yang merupakan koleksi string di-konversi menjadi object ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter"),".")),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Kemudian method ",(0,i.kt)("inlineCode",{parentName:"p"},"map")," diakses. Setiap elemen ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," di-iterasi, kemudian dikonversi dari ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", lalu dijadikan ",(0,i.kt)("em",{parentName:"p"},"replacement")," data elemen tersebut. Jika proses konversi gagal, maka angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," digunakan sebagai data element tersebut."),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Sampai sini, data yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"li"},'["1", "2", "3", "4", "a"]')," sekarang menjadi ",(0,i.kt)("inlineCode",{parentName:"li"},"[1, 2, 3, 4, 0]"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Selanjutnya, dilakukan proses filtering menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"filter")," dengan kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"*e > 0 && *e % 2 == 0")," yang kurang lebih artinya, jika nilai ",(0,i.kt)("em",{parentName:"p"},"dereference")," ",(0,i.kt)("inlineCode",{parentName:"p"},"e")," lebih besar dari ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," dan nilai tersebut adalah genap, maka filter bernilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Sampai sini, data yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"li"},"[1, 2, 3, 4, 0]")," sekarang menjadi ",(0,i.kt)("inlineCode",{parentName:"li"},"[2, 4]"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Kemudian, data kolektif tersebut dibalik urutan elemennya menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"rev"),"."),(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Sampai sini, data yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"li"},"[2, 4]")," sekarang menjadi ",(0,i.kt)("inlineCode",{parentName:"li"},"[4, 2]"),"."))),(0,i.kt)("li",{parentName:"ol"},(0,i.kt)("p",{parentName:"li"},"Terakhir data di-collect menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"collect")," dengan ditentukan tipe data masing-masing elemen adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),"."))),(0,i.kt)("p",null,"Hasilnya ketika di run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(6644).Z,width:"447",height:"118"})),(0,i.kt)("h2",{id:"a483-method-tipe-data-iterator"},"A.48.3. Method tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Iterator")),(0,i.kt)("h3",{id:"-method-iter-iter_mut-into_iter"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"iter"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"iter_mut"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"into_iter")),(0,i.kt)("p",null,"Ketiga method ini berguna untuk konversi data slice ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),", perbedannya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," mengembalikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," yang isinya adalah reference (",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),") setiap element. Contoh penerapan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\ndata_vec.iter().for_each(|d| {\n println!("{}", *d * 2)\n});\n\nfor d in &data_vec {\n println!("{}", *d * 2)\n}\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter_mut")," mengembalikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," yang isinya adalah mutable reference (",(0,i.kt)("inlineCode",{parentName:"p"},"&mut T"),") setiap element. Contoh penerapan:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut data_vec = vec![1, 2, 3, 4];\n\ndata_vec.iter_mut().for_each(|d| {\n *d = *d * 2;\n});\nprintln!("{:?}", data_vec);\n\nfor d in &mut data_vec {\n *d = *d * 2;\n}\nprintln!("{:?}", data_vec);\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"into_iter")," mengkonversi data slice ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," (",(0,i.kt)("em",{parentName:"p"},"move semantics"),")."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\ndata_vec.into_iter().for_each(|d| {\n println!("{}", d * 2)\n});\n\n// statement di bawah ini menghasilkan error,\n// karena ownership `data_vec` telah berpindah setelah method `into_iter` dipanggil\n\n// println!("{}", data_vec)\n')))),(0,i.kt)("h3",{id:"-method-collect"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"collect")),(0,i.kt)("p",null,"Method ini digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"collecting")," data Iterator ke bentuk tertentu. Contoh penerapannya bisa dilihat pada kode berikut ini."),(0,i.kt)("p",null,"Data ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," yang merupakan vektor bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," dikonversi ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," kemudian di-collect datanya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec: Vec = vec![1, 2, 3, 4];\n\nlet result: Vec<&i32> = data_vec.iter().collect();\nprintln!("{:?}", result);\n// [1, 2, 3, 4]\n')),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," menghasilkan object ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," yang menampung reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&T")," setiap element slice. Hal ini membuat penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"collect")," menghasilkan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec<&i32>")," (bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),")."),(0,i.kt)("h3",{id:"-method-map"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"map")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"map")," digunakan untuk mapping element setiap data iterator ke nilai baru."),(0,i.kt)("p",null,"Sebelumnya kita telah mempelajari method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"collect")," yang keduanya jika dikombinasikan dan digunakan pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," hasilnya adalah data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec<&i32>"),". Dengan memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"map"),", tipe data setiap element bisa di-mapping ke nilai baru dengan tipe data berbeda, misalnya menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec: Vec = vec![1, 2, 3, 4];\n\nlet result1: Vec<&i32> = data_vec.iter().collect();\nprintln!("{:?}", result1);\n// [1, 2, 3, 4]\n\nlet result2: Vec = data_vec\n .iter()\n .map(|d: &i32| -> i32 { *d })\n .collect();\nprintln!("{:?}", result2);\n// [1, 2, 3, 4]\n')),(0,i.kt)("p",null,"Contoh lainnya bisa dilihat pada ",(0,i.kt)("em",{parentName:"p"},"section")," ",(0,i.kt)("a",{parentName:"p",href:"/basic/trait-iterator#a482-pemanfaatan-tipe-data-iterator"},"A.48.2. Pemanfaatan tipe data ",(0,i.kt)("inlineCode",{parentName:"a"},"Iterator"))," dimana dilakukan mapping data slice numerik ke bentuk yang sama tapi nilai setiap element adalah kuadrat, dan juga ke bentuk lain dengan tipe data berbeda."),(0,i.kt)("h3",{id:"-method-rev"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"rev")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"rev")," kependekan dari ",(0,i.kt)("em",{parentName:"p"},"reverse"),", digunakan untuk membalikan urutan data slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nprintln!("{:?}", data_vec);\n// [1, 2, 3, 4]\n\nlet result: Vec<&i32> = data_vec.iter().rev().collect();\nprintln!("{:?}", result);\n// [4, 3, 2, 1]\n')),(0,i.kt)("h3",{id:"-method-filter"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"filter")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"filter")," digunakan untuk memfilter element data slice. Data kolektif diiterasi kemudian dicek menggunakan closure, jika nilai balik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," maka elemen tersebut masuk dalam dalam hasil filter, selebihnya maka dianggap tidak memenuhi kondisi filter dan elemen di-",(0,i.kt)("em",{parentName:"p"},"exclude"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet odd: Vec<&i32> = data_vec.iter().filter(|d| *d % 2 != 0).collect();\nprintln!("odd numbers: {:?}", odd);\n// odd numbers: [1, 3]\n\nlet even: Vec<&i32> = data_vec.iter().filter(|d| *d % 2 == 0).collect();\nprintln!("even numbers: {:?}", even);\n// odd numbers: [2, 4]\n')),(0,i.kt)("h3",{id:"-method-cloned"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"cloned")),(0,i.kt)("p",null,"Digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"cloning")," data slice secara keseluruhan tanpa mengubah tipe data. Hasilnya adalah data dengan skema sama persis (dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator"),") tapi berbeda owner."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result: Vec = data_vec.iter().cloned().collect();\nprintln!("{:?}", result);\n// [1, 2, 3, 4]\n')),(0,i.kt)("h3",{id:"-method-copied"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"copied")),(0,i.kt)("p",null,"Secara ",(0,i.kt)("em",{parentName:"p"},"high-level")," ",(0,i.kt)("inlineCode",{parentName:"p"},"copied")," menghasilkan output yang sama dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"cloned"),". Namun jika dibahas dari sisi management memory-nya, ada perbedaan yang cukup besar."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result: Vec = data_vec.iter().copied().collect();\nprintln!("{:?}", result);\n// [1, 2, 3, 4]\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai clone vs copy akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/copy-clone-move-drop"},"Copy, Clone, Move, Drop"))),(0,i.kt)("h3",{id:"-method-cmp"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"cmp")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"cmp")," kependekan dari ",(0,i.kt)("em",{parentName:"p"},"compare"),", digunakan untuk membandingkan 2 buah data iterasi dengan nilai balik bertipe enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Ordering"),". Dari tipe data enum tersebut nantinya bisa dicek apakah 2 buah data slice tersebut sama (secara ",(0,i.kt)("em",{parentName:"p"},"Lexicographical"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec1 = vec![1, 2, 3, 4];\nlet data_vec2 = vec![1, 2, 3, 4];\nlet result = data_vec1.iter().cmp(data_vec2.iter());\nprintln!("{:?}", result.is_eq());\n// true\n')),(0,i.kt)("p",null,"Enum ",(0,i.kt)("inlineCode",{parentName:"p"},"Ordering")," memiliki beberapa method, salah satunya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"is_eq")," yang mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," jika dua buah data slice tersebut adalah sama."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai ",(0,i.kt)("inlineCode",{parentName:"p"},"Ordering")," akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/enum-ordering"},"Enum Ordering"))),(0,i.kt)("h3",{id:"-method-count"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"count")),(0,i.kt)("p",null,"Digunakan untuk melihat size dari elemen Iterator."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet length = data_vec.iter().count();\nprintln!("{:?}", length);\n// 4\n')),(0,i.kt)("h3",{id:"-method-eq-ne-gt-ge-lt-le"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"eq"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"ne"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"gt"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"ge"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"lt"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"le")),(0,i.kt)("p",null,"6 Method ini digunakan untuk komparasi dua buah slice. Penggunakan 6 method ini merupakan alternatif selain menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"cmp"),"."),(0,i.kt)("p",null,"Sebagai contoh, penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"eq")," berikut untuk untuk mengecek apakah 2 buah data slice adalah sama (secara ",(0,i.kt)("em",{parentName:"p"},"Lexicographical"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec1 = vec![1, 2, 3, 4];\nlet data_vec2 = vec![1, 2, 3, 4];\nlet result = data_vec1.iter().eq(data_vec2.iter());\nprintln!("{:?}", result);\n// true\n')),(0,i.kt)("p",null,"Kode di atas adalah ekuivalen dengan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec1 = vec![1, 2, 3, 4];\nlet data_vec2 = vec![1, 2, 3, 4];\nlet result = data_vec1.iter().cmp(data_vec2.iter());\nprintln!("{:?}", result.is_eq());\n// true\n')),(0,i.kt)("p",null,"Berikut merupakan kegunaan tiap-tiap method di atas:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"eq")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"equal lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"ne")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"not equal lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"gt")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"greater than lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"ge")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"greater than or equal lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"lt")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"lower than lexicographical comparison")),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"le")," digunakan untuk ",(0,i.kt)("em",{parentName:"li"},"lower than or equal lexicographical comparison"))),(0,i.kt)("h3",{id:"-method-find"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"find")),(0,i.kt)("p",null,"Digunakan untuk mencari apakah suatu elemen ada atau tidak dengan kondisi pencarian dituliskan dalam bentuk closure. Nilai balik method ini bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("p",null,"Sebagai contoh, perhatikan kode berikut. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"find")," digunakan untuk mencari elemen yang nilainya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"4"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result = match data_vec.iter().find(|d: &&i32| **d == 4) {\n Some(d) => *d,\n None => 0\n};\nprintln!("{:?}", result);\n// 4\n')),(0,i.kt)("h3",{id:"-method-last"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"last")),(0,i.kt)("p",null,"Digunakan untuk mengambil elemen terakhir data Iterator. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"last")," ini mengembalikan nilai balik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\nlet result: &i32 = data_vec.iter().last().unwrap();\nprintln!("{:?}", result);\n// 4\n')),(0,i.kt)("p",null,"Satu hal yang unik perihal notasi closure method ",(0,i.kt)("inlineCode",{parentName:"p"},"find"),", parameter closure adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&&T"),". Dari tipe tersebut, untuk mengambil ",(0,i.kt)("em",{parentName:"p"},"underlying value")," gunakan operator ",(0,i.kt)("em",{parentName:"p"},"dereference")," dua kali. Contohnya pada kode di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"d")," bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&&i32"),", untuk mengambil nilai sebenarnya digunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"**d"),"."),(0,i.kt)("h3",{id:"-method-fold"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"fold")),(0,i.kt)("p",null,"Method ini digunakan untuk mengkonversi setiap element ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," menjadi sebuah akumulator yang direpresentasikan oleh 1 buah variabel."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"konsep ",(0,i.kt)("inlineCode",{parentName:"p"},"fold")," milik Rust mirip seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"reduce")," pada bahasa pemrograman lain")),(0,i.kt)("p",null,"Pada contoh berikut, kita coba terapkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"fold")," untuk grouping data vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_vec")," menjadi 1 buah data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"NumberCategory"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Data numerik genap elemen ",(0,i.kt)("inlineCode",{parentName:"li"},"data_vec")," masuk ke property ",(0,i.kt)("inlineCode",{parentName:"li"},"even")," milik ",(0,i.kt)("inlineCode",{parentName:"li"},"NumberCategory"),"."),(0,i.kt)("li",{parentName:"ul"},"Data numerik ganjil elemen ",(0,i.kt)("inlineCode",{parentName:"li"},"data_vec")," masuk ke property ",(0,i.kt)("inlineCode",{parentName:"li"},"odd")," milik ",(0,i.kt)("inlineCode",{parentName:"li"},"NumberCategory"),".")),(0,i.kt)("p",null,"Dalam penerapannnya, parameter pertama method ",(0,i.kt)("inlineCode",{parentName:"p"},"fold")," diisi dengan ",(0,i.kt)("em",{parentName:"p"},"initial value"),", dan parameter ke-2 isinya closure untuk akumulasi data."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct NumberCategory {\n even: Vec,\n odd: Vec,\n}\n\nlet data_vec = vec![1, 2, 3, 4];\n\nlet data_grouped = data_vec.iter().fold(\n NumberCategory{ even: Vec::new(), odd: Vec::new() }, \n |mut group, each| {\n if *each % 2 == 0 {\n group.even.push(*each)\n } else {\n group.odd.push(*each)\n }\n group\n }\n);\n\nprintln!("{:?}", data_grouped);\n')),(0,i.kt)("p",null,"Pada kode di atas, data ",(0,i.kt)("inlineCode",{parentName:"p"},"each")," di-cek nilainya, jika genap maka dimasukan dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"group.even"),", dan sisanya masuk ",(0,i.kt)("inlineCode",{parentName:"p"},"group.odd"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(2986).Z,width:"454",height:"122"})),(0,i.kt)("h3",{id:"-method-inspect"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"inspect")),(0,i.kt)("p",null,"Biasanya digunakan sewaktu debugging, untuk inspeksi flow pemanggilan method-method milik Iterator. Contoh penerapannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet result = data_vec.iter()\n .cloned()\n .inspect(|x| println!("about to filter: {x}"))\n .filter(|x| x % 2 == 0)\n .inspect(|x| println!("made it through filter: {x}"))\n .fold(0, |sum, i| sum + i);\n\nprintln!("sum: {:?}", result);\n// sum: 10\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(4695).Z,width:"449",height:"222"})),(0,i.kt)("h3",{id:"-method-sum"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"sum")),(0,i.kt)("p",null,"Digunakan untuk mencari total/summary data slice numerik."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1.1, 2.2, 3.3, 4.5];\nlet result: f64 = data_vec.iter().sum();\nprintln!("sum: {:?}", result);\n// sum: 11.1\n')),(0,i.kt)("h3",{id:"-method-reduce"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"reduce")),(0,i.kt)("p",null,"Method ini digunakan untuk mengiterasi setiap element array dengan setiap iterasi menampilkan data element ke-",(0,i.kt)("inlineCode",{parentName:"p"},"n")," dan element ke-",(0,i.kt)("inlineCode",{parentName:"p"},"n+1"),"."),(0,i.kt)("p",null,"Contoh penerapan sederhananya pada pencarian angka numerik terbesar, yang kode-nya bisa dilihat berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet max_number = data_vec.iter().reduce(|left, right| {\n print!("left ({left}) vs right ({right})");\n\n if *left >= *right { \n println!(" -> left ({left}) is greater");\n left\n } else {\n println!(" -> right ({right}) is greater");\n right\n }\n});\n\nmatch max_number {\n Some(n) => println!("max_number: {:?}", n),\n None => println!("no data found"),\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait iterator",src:t(1611).Z,width:"449",height:"170"})),(0,i.kt)("h3",{id:"-method-min-max"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"min"),", ",(0,i.kt)("inlineCode",{parentName:"h3"},"max")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"min")," digunakan untuk mencari elemen terkecil pada Iterator, dan ",(0,i.kt)("inlineCode",{parentName:"p"},"max")," untuk mencari elemen terbesar. Keduanya mengembalikan nilai balik bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_vec = vec![1, 2, 3, 4];\n\nlet min = data_vec.iter().min().unwrap();\nprintln!("min: {min}");\n// min: 1\n\nlet max = data_vec.iter().max().unwrap();\nprintln!("max: {max}");\n// max: 4\n')),(0,i.kt)("h2",{id:"a484-method-lainnya"},"A.48.4. Method lainnya"),(0,i.kt)("h3",{id:"-method-sort-milik-vect"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort")," milik ",(0,i.kt)("inlineCode",{parentName:"h3"},"Vec")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"sort")," bukanlah property Iterator, melainkan milik tipe data vector. Kegunaan method ini adalah untuk sorting urutan elemen vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut data_vec = vec![2, 3, 1, 4];\nprintln!("before: {data_vec:?}");\n// before: [2, 3, 1, 4]\n\ndata_vec.sort();\nprintln!("after: {data_vec:?}");\n// after: [1, 2, 3, 4]\n')),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/trait_iterator"},"github.com/novalagung/dasarpemrogramanrust-example/../trait_iterator")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/vector"},"Vector"))),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Desugar iterator")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/index.html"},"https://doc.rust-lang.org/std/iter/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/trait.Iterator.html"},"https://doc.rust-lang.org/std/iter/trait.Iterator.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://becomebetterprogrammer.com/rust-iter-vs-iter_mut-vs-into_iter/"},"https://becomebetterprogrammer.com/rust-iter-vs-iter_mut-vs-into_iter/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://blog.thoughtram.io/iterators-in-rust/"},"https://blog.thoughtram.io/iterators-in-rust/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://blog.logrocket.com/rust-iterators-closures-deep-dive/"},"https://blog.logrocket.com/rust-iterators-closures-deep-dive/"))))}A.isMDXComponent=!0},3753:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,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"},9339:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB5CAIAAAAmt7g4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjRUMTg6NTY6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjc5ODFjYTRmLTJhYjIt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"},6644:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB2CAIAAADX4QrtAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjRUMjI6MTg6MTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjU2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU1OjU2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFjODNjNWYwLTQ5ZGUt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"},2986:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcYAAAB6CAIAAACqf2TEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjVUMDE6NTM6MjcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU2OjUxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU2OjUxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZhNDdmZjZmLTdhOTIt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"},4695:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAADeCAIAAADKLixFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjVUMDE6NTg6MzkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU3OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU3OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRlYjAxNTkxLTI3YjUtOTE0Zi04NTlmLTZhNTQyN2FlYzg2MyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkZWIwMTU5MS0yN2I1LTkxNGYtODU5Zi02YTU0MjdhZWM4NjMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkZWIwMTU5MS0yN2I1LTkxNGYtODU5Zi02YTU0MjdhZWM4NjMiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjFkOGFmM2Q4LTEwNDItNzI0MC1hOTk5LWY5YWY0Mzc2NmI4ZTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmRlYjAxNTkxLTI3YjUtOTE0Zi04NTlmLTZhNTQyN2FlYzg2MyIgc3RFdnQ6d2hlbj0iMjAyMy0wMS0yNVQwMTo1ODozOSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PrX3InkAABZDSURBVHja7Z09ktw4EkZ1ktKMJ3tsjdz2pHHGkNHyFHIVE6GI9fogfQSdQr4OtV1kFQkgM4EESfCv34uN2FE1iyBB8lUCLH715gIAAFN5QxcAAOBQAAAcCgCAQwEAcCgAAOBQAAAcCgCAQwEAcCgAAOBQAAAcCgCAQwEAcCgAAA4FAIB2Dv309cf3x/fX/3r/+P3H10+Lb9VLAw3WOm+Dbns8hYpemtbQvM1bocde/vWjuInuvZh51l3fLhsqtr7DToY9HLg3887ARg41TnOlcwLG7YheNzcvfnehtZcNmnDZTbjm1YZu6zC3crmzRO+6Ceuf4FB13+Oj1K+jiUPNnsehOzfm1gfuzbzzr5VDfXt+vb7urXeOuf7Dp1/t3dl3aXvawqHGwt158sk6WRY6S8yum+3Q6fuuraeNQ0urxaF7rTo3PnBv5u1Bv/VDrTDsSF81JQVe8KK6ZNIN5SsltODtX36FJu+O/9ntUfFq1g+O3HdHLyVbonzUXpeIP3HDtw/vEK1f50Ueb0Xsp1wxq3Zd1Ma4pdGxCf6hbNL4UtSfQX0Ztin23b5mZH+q65QvhvvZ//W+BqPny53sOb2DJl/+c/hDt2h/YLNnSP+acTS1dTo65P4H4+3+c0k955U9Mva9eC7dzznlVFzvwC3jULGp0QhzsND7x6/hYH+8loQSA3HJK7goUc2h+UFvxqFR+5pDvde33Herl6zdU7u5WzT4S7j5w8tK6/ddCf4/J1G16+wNSrfO0lG8s2FfDwMIvSnLoaI/1XXmX7y+NX9EvZ1sHE11yZtXhnPg+6N1hihXh3E0rXXKTh7XGXS8fPv7mnOpdM6X912eS9bVYZy+axy4RRwqm4tfSawkO0Up7XL1V6kITzoqnqYtfoSkW1su+dP9L73jvrzeS1qH6A0F/7w3KVYpN+S2yP1v6f9ntrlcHWrnfXaToj8qn16xX5PhQVp5KP2prlN/8XZVPH79YXeacXZnls8cTeWTJr6hoLakXh3W0VTWqe97OoE1qi17j8N/LqnnvH/fi/1pnb4rHLhFHCodaZz+SdkthhZyBKCWzaWtj64vc1RtrSFXh/q60zw4uZFvYkR94+0zYvjo188S2XqlQ9WuW96hdo3quACU/lTXqb+Y/4QN1+3vZOtoakuW92iclUqvjoxD03Vm9n2sQ8fKNz8pVTiXSue8No4qn+vq1WGevu0P3Fp16O3zM/+pdl/A4Uh3HVp5l0S8u/hxpGySfubKfS9aQQ4q7QPfX0v6KrXWpzlUzBo2rEPFYQzf6zJOLxexTv3F+56VKx1/J+tHU1/Su0fW5JffoVonh3VHtpO955LnnJ/mUHVLMqdv6wPXcD5UDA2SaRx9fD9+fpnbVzkfalVTnjo0nf9U50M917e672ovlVQ/rFyx0Xcxr2X3/ESHRl0nti+uYX6Ml6fYJLPQCqfqMjVU6apTJzfzLxpjWKV1dyfrR1NfsrRHw0YZs19Oh6r7blxS1ts955LjnC87VJxL5tVRqIpaHrjl7stH61NvfkV3Ex+DzyWtNtbXMOW+vD1/Vj8TYDtUHYon313M7rtyi1BvK/nsF0c6uOc53K9XWvc7NNd14gZxMCD+NPSIskmiipZ9Z+97uY9/iG+hZr4srNy9VG+jaYc438nG0dSWzNwlk3skXq9wqN4hWn8WJ6UK55LVIT6HqudS5uqwv8nT+MAt5NCKrw61+CLYfr+i9sq64Oz7vnbrDb9nXbpZea4zbIvTZuZzSi2PNV9ohtfCWg6ddA8AlnboGrLf3fPyAGdwqP18NKzrUAAAwKEAADgUAACHAgDg0C346+3//v3zvw/Dv9/+9++f/+v/95Bfcgf4gjVfG5NuWpKTPW+TyMk+hEO/fLzb7d+3/yzq0FSXvUkfPEuufrEXHNpinVXnrvuerbOhqnVq0XTkZMtuJyf7NTq0E+igzrdf2taDmkN3UjC1XGf3BcDHqd+uDb4+qD8GOaGhinXKi4ecbKdcyMk+v0P//vDHSw347S+jihyH3m+/vSz20L348e2Xh/vr18X++PLhvvDHt3/nh+2pQ7Ul9XXGm2SWzFYirDfOVgsntlNmjbRmeQolD4Q7xDb8M3lbdiXuhirWqV0E5GQ73EJO9jo52Vs79J+rDf/48s6eoLz999WhV529u1rv5U+dfAev9Tq7/SlbcjpeDNfZ/Xen+HHlXdNim8vXrCvO1v5gleus/Ux3POUV2Uh5Mj/cjTkNVa4zF6V7ISf7Qk72hjnZWzu0G8inPurEOlZ512U+Xh3aKezFZdflQ4fey9i7Z5dw6G2dg8374vRdUKjWO9QTZ1vr0BqJVkah3iun6MM3fyVXOtS7TtEZ5GRnJ5jJyV4zJ3uXdWg8Q+p36G3JJg7tlulfTBTvdqgrzrbGoZdMWvNUh0Znlvzw9VW/vkkD/zq1JFFysvMqJSd7rZzsXc6HJneZ+urSW4c+LDOWVx06TIYqE7gTHJqrTZ0OVVc1y6Fy/i55m+NCrp0P9RRYGYeSk53pXXKyL41zsrd26E18oTE/KPOh3/4qO1ToeEmHdiv3f+9KSsQbZ2s7NCsmd4npq2O6Wxjx5LoqVGMWTmkoXdJeZ+18KDnZaiFKTvZaOdnbO3TQaHQTvBdiUPTlHJqWh+kN9GFCM3rxfltfX1LWod/iJQulaPrlR2+crRlOLNdZTGu279A67ixZAbfiesyMf0T+tvJm30SEUpWQk63fKicne+Wc7F04dAbxfGjjedt0ivbvC6zFQsmx5GSfft9Xz8nGoT7UKVocekCLAuDQLRyajuX3KdBk8HS6RN3XXNwBDgUAeD3gUAAAHAoAgEMBAHDoIvjzkj1LTrslVZHZvOBdkPGG0Tb3Vfzxo8sESK+eH7jIj2jW7LvriI4LHePWYPmwVf0674HDyDd2aPRgZfRAvT8v2bPkwRy66VcbcejynzQzk0l3dobUPE3s3dDVgsMz39mfuAF7cOhD+3Zw6JYNndGhVRe4v7VDOLTCjSts6oSQ769fv8pH6cSLR3aoPy/ZyGAOn+zsl+wd+uG+fJL5NDz9Kd+ed2jpAcHxUbhcfEPptFMDgvqn2jwZt8qSVtizksVrxANrqb3pWrWn6T5lu25mQeM7HHo8sJXCpDzHaOy7ejjUw21kGzsc6krpzgUJ63ske8luqJiCLNMfHOlf/v7MnhrFE+W2QLwL2ovO1PN916GevGR1JUlCc+btwRuHF5VYaM8gLUyfEM/8aoHHCzg0ugBErnwUZyvThTM1gsjvMeOBzX0JpsK0DnFtRq1D3YfDjAfOJRaLBCEZ7pYcjky8vJFtPL0OdQYJvzf2SD1GFzuGsSYj3FuHF/uz3BfFkO+wF76LDgterBo87Gs+NAxM8uTUmQ5Ns5fMiKZhBvaWpxc9L591qBm6pYRXKoHHSzhUCaI34mzVvDOvQ+04DONUCztB6RBPbm61Q92HQ48H1js5/TmnfOq7GSaaKUvTHlxgLJ8NElb3SD9pL+4fSspnElaEUHn6U127L+Q7CnuS+5g41C3RQ9WhPodGWVDRWD5++z8Pf8qEp+h5+XqHajmS0a8QlBU6z6FGnK1MaG/n0OiKrAjW9A1drWXdh0OPB84U+2PVJqfQJjk091MwUx3qDhJW9sg6aYtBjtr0RCF2voVDnSHfaiKiHZPoTz0/o0MH+p9iHkbo2To0fMs8h6qHUP3BssZ1qFZhNa9Dky+0GD9hs1Idav7+pogHzozlDXkvU4emRprmUH+QsLZHFT8aVdzCbFJ1C4e6Q77VjAn1RRGJXtj+Uzt0TGvORNY/GG+5h4+Y86Fq+Ks5CBCBx3UOFWG65thTjbMNJye/Wz+PN9+h3nFeLgl46nyo/3Co8cBaJ1fM87kdWsg2djlUvM0dJGx/qFgnrVqI5r/zMGGPpju0Pji8YqLXd+7t0KH+vGRHBnMcki8UrEU799VrHKqfHUdE4a+F9FnH2ZQbqY1huo77yPZv4SojQCsWWnOokdprRflqG6B33bz78t7DYXSIllhcTBcu/RBx6b584RcLHffn09vo+SBh/a68fZJo36nQamczPKy8Q5X9mV1DNjjc71B/6vkOHAqT5+DdrPt1yDOh/PRV6y87Nj5Yy+zRvr4fujk4FIdCcXogO+I9kEOX2qPln1PCobDseb7k8/I4dIlj0fxB9pWel19sjxZ+Xh6HAgC8SnAoAAAOBQDAoQAAOHS3VGTZeRi/8L4bihP9TUPhmn2R5agBvTs8Q+AVODR62n1J5dXkOrvRvh6yZbxj6QvrbYM1jdZnd4ji0BbrbMIqX4kCHCoc2j8y1MeCrPKz8msWgy0bKniwcTixvobVU5Y9/uye5+FX7OHkDk1iPbVnPUUwsz+tWV9SPkIax+gVa46dR+Q2DCeWrVvbaey70ksyoNfVyfnPERG26jqkwdP4cWRl+Jj+D0bvOHR3dWgXrZR7Xj5OVvanNdvBzP0EghrsNKlEWjMiV768bjixslHyJXXf1V6y6tvKJGDDjv4gkzSUJA3Xto4R4NCNHKrWhqpDXS/aDtVr23dBobqAQ9VLvU1Ebq50vGwQTmw7VIa12UL0OrRGog7VmT3fbc9jHIiV/xwBHLpBHSoCltZwaLdMUAX7B/K5K2i9iFyhnNXDiaXwVIcaMWP6g4geh15qcnNdDrV7PjV2bknAoRuO5cdE5HUdmqThzXXomhG54k+rhxPLDfM5NFebOh2qrmqeQzM9/2lcAZkEOHSnDtVq0iAauYFDuxYn1J7Zi3PViFzhmLXDiaXh5HYWfmQi6CWrY7IGdM1IKguliZNGzw9bOq6CbzDh0H069Ga9blZ0+PmjMRq5sjh15TrfHT2rFN00IldqZ6Vw4sJ8ZmkeQ+0lK9f5UgiQ9kX2pluvpPaKPomjtINvmVb92jPg0LOSzIFeJxPGH6NvzrKhv+3ubHi2k/sqgENfI9Fv0vU16YoO3SD099TbCYBD1ycey68oUGUsv18xHWE71R9txPaAQwEAcCgAAA4FAMChAACAQwEAcCgAAA4FAMChAACAQwEAcCgAAA4FAMChAACAQwEAcCgAAA4FAHilDv38/Ov3z6fj7PfTz983fj1/Dl4a/tXvUs+RdgwAXqtDXxwWGGyZJTMGFVubOtTasdmtV5p+rcYAAIcuv7GbObTz/PNL6zgU4HQOHYe59yu8V80wQh6sM46Z4yUjQwWr+50fPttLyoYqytDMsD3cXLv14C/3hXvVDn8IVtxtasHhTz+7vfiMQwHO59DPzz/vl/VwjfeuuF3ud0eFBugWuL+YOHR2Hao2VKVgszz11KGBk8ctuUm9ez1Wocehyo4BwAnH8nfFxKrppJKWe90iTRyqNfRUU4fOc+jLC3GV2f352siv8LNmylQHDgU4o0OTck46tNdlIpumDhUNredQWdzeHTrffjgU4HwOVQssUYf+ek5V1RenK9ShhiJbOlRZGw4FwKElA/UlWOrQ4cIPbRvNnAbzpr/l2+rNojbUyqGiAX0G1nYo86EAr3ssH96Efg7qUO3GeHC7PCo+b8s9iSkA39fa5ZJaQ16HitG42KN4tbJ1ZffnOVS0jkkBTuNQAADAoQAAOBQAAIcCAOBQAAAcCgAAOBQA4CgOJYMZAHDopg4lg1k0jMMBcOgOHXqADOaXZu+NRPkEAHAGh5LB3DqDuVg1A8BhHUoG82oZzDgU4ORjeTKYm2YwM5QHOKNDyWBeM4OZGhTgXA4lg3mlDOZOoJSgAGd0KBnMrTOYESjAacfyZDC3z2AOdocMZoCTORQAAHAoAAAOBQDAoQAAOBQAAIcCAAAOBQA4j0OnPrejx3pOZbWs6PqGiIUGwKHrOHRmwtMuHUosNAAObeLQWas6jEOJhQZ4LQ69Jr0939JCn8LUUBnMfDGeAfXWM3LoOjutWc+KNvKSXQHS6ZLd0nYotbcMJRYa4LwO7a6f4P+vgtGCmaNLbaiV1MTiRmWXWofejZjLS64KkB73aIwf0Rtyuz5XnhILDXBwh0b5mIrQbhe5kof32UosXtOhugTjOL+aAOlw0SieSo34q5ISsdAAr8ahMphZdaiRWLy5Q9MVVgRIB9l3Y3W3qUOJhQY4lkP1Esd0aN0VuJlD3QHS4WxoOPzf1KHEQgMczaEimDmZJwzq1RqLOlKQs++17ZJzqD9AWhfWqg4lFhrg8GN5LZg5qNC6H0BW7svnLsqqFORLeSXZm0LaZngDpNO78gvMhxILDXBWh0K+LPQXyQCAQyEpIbnlAoBDod6iv3/zGCQADgUAABwKAIBDAQBwKAAADi2wWqbcQhB4DAAnc+iMJzinGHTngcfhvX4cDoBD9+TQAwQeJ1vAl/YBTuVQGbdsRQ67YoxnJyurDVWUobsPPMahACdyqBa3HEYOD46qiDG+zE5jEg1VKdgsT7cPPEahACcey4cZmlHOXV2M8TyHag091dSh8xzaKPCYe1oAZ3WojFtOJDFEwXtjjGc7VDS0nkNbBh6LKhsADu9QtcBS8parYoyXrEOLP/ZzkMBj/4cCABzMoSJuOb31Ioaz2RjjynJLLKk21Mqh6wQelzcXAA46ltfilq1YZW+MsVhxVbKy0ZBXSjsMPI5WiEABTuVQAADAoQAAOBQAAIcCAOBQAAAcCgAAOBQA4CgOJYMZAHDopg4lg9no1988LQ+AQ/fk0MNkMHeN/yT7DuBsDiWDeY0M5tuD+eSHApzMoWQwr5HBHCa34FCAs47lyWBulME8toJDAc7mUDKYW2cwh2/GoQDncigZzM0zmMMfRiYBD+CEDiWDeb0MZupQgJON5clgbp/BjEMBzutQAADAoQAAOBQAAIcCAOBQAAAcCgAAOBQA4DwOnfo1Rz3WcyqrZUVPekKeWGgAHLqCQ2cmPO3SocRCA+DQJg6dtarDOJRYaIDX4tBr0tvzrRR5CksSGcx8MZ4B9T7TKYeus9Oa9axoIy/ZFSCdLtktbYdSe8tQYqEBzuvQ7nIL/v96PWnBzJEZhutOTSxuVHapdejdiLm85KoA6XGPxvgRvSG363PlKbHQAAd3aHQdKdfT7SJX8vA+W4nFazpUl2Ac51cTIB0uGsVTqRF/zjp0nkOJhQY4nENlMLPqUCOxeHOHpiusCJAOsu/G6m5ThxILDXAsh+oljunQuvJnM4e6A6TD2dBw+L+pQ4mFBjiaQ0UwczJPGNSrNRefIwU5+17bLjmH+gOkdWGt6lBioQEOP5bXgpmD6qX7AWTlvnxuKF+VgnwpryR7U0jbDG+AdHpXfoH5UGKhAc7qUMiXhf4iGQBwKCQlZPVUBQDgUCzKjRYAHAoAADgUAACHAgDgUAAAHAoAAMd06HjTmxveAIBDa+DLlgBwRoeGzxGOD8Snjzaaac0X58OFcYIbAMApHKo9/W04VEtrdju0W/6ZoTwAnM+hqdEMh5bSmsvFbvi7HDyGDgCnGMuPN3pycZkLOLT0sxgAAEd0aOhSM+ptpkOT5XEoAJzOodlw4pxDvfeUorE8CgWA4zs0TgLOhBPPdmhN1jIAwPHqUAAAHAoAADgUAACHAgDgUAAAHAoAADgUAACHAgDgUAAAHAoAADgUAACHAgDgUAAAHAoAgEMBAACHAgA05P/cKzc8bD1H4gAAAABJRU5ErkJggg=="},1611:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAACqCAIAAABanWOSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFqGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDEtMjVUMDI6MDg6MDUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTAxLTI1VDAyOjU4OjA0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTAxLTI1VDAyOjU4OjA0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMwMDIxNTU5LThlNjEt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"}}]); \ No newline at end of file diff --git a/assets/js/8333c691.54569977.js b/assets/js/8333c691.d59a9952.js similarity index 61% rename from assets/js/8333c691.54569977.js rename to assets/js/8333c691.d59a9952.js index 6020153b..b608163d 100644 --- a/assets/js/8333c691.54569977.js +++ b/assets/js/8333c691.d59a9952.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4248],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>u});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function l(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var s=i.createContext({}),m=function(a){var e=i.useContext(s),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},d=function(a){var e=m(a.components);return i.createElement(s.Provider,{value:e},a.children)},o={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},k=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,r=a.originalType,s=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),k=m(n),u=t,g=k["".concat(s,".").concat(u)]||k[u]||o[u]||r;return n?i.createElement(g,l(l({ref:e},d),{},{components:n})):i.createElement(g,l({ref:e},d))}));function u(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var r=n.length,l=new Array(r);l[0]=k;var p={};for(var s in e)hasOwnProperty.call(e,s)&&(p[s]=e[s]);p.originalType=a,p.mdxType="string"==typeof a?a:t,l[1]=p;for(var m=2;m{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>p,toc:()=>m});var i=n(7462),t=(n(7294),n(3905));const r={sidebar_position:34,title:"A.34. Ownership",sidebar_label:"A.34. Ownership"},l=void 0,p={unversionedId:"basic/ownership",id:"basic/ownership",title:"A.34. Ownership",description:"Chapter ini berisi pembahasan tentang ownership, bagaimana Rust melakukan manajemen memory dengan menerapkan approach ownership ini.",source:"@site/docs/basic/ownership.md",sourceDirName:"basic",slug:"/basic/ownership",permalink:"/basic/ownership",draft:!1,tags:[],version:"current",sidebarPosition:34,frontMatter:{sidebar_position:34,title:"A.34. Ownership",sidebar_label:"A.34. Ownership"},sidebar:"tutorialSidebar",previous:{title:"A.33. Pointer & References",permalink:"/basic/pointer-references"},next:{title:"A.35. Borrowing",permalink:"/basic/borrowing"}},s={},m=[{value:"A.34.1. Konsep ownership",id:"a341-konsep-ownership",level:2},{value:"A.34.2. Aturan ownership",id:"a342-aturan-ownership",level:2},{value:"A.34.3. Variable scope",id:"a343-variable-scope",level:2},{value:"A.34.4. Copy semantics vs. move semantics",id:"a344-copy-semantics-vs-move-semantics",level:2},{value:"A.34.5. Alokasi & dealokasi",id:"a345-alokasi--dealokasi",level:2},{value:"A.34.6. Transfer ownership",id:"a346-transfer-ownership",level:2},{value:"\u25c9 Transfer ownership via return value",id:"-transfer-ownership-via-return-value",level:3},{value:"\u25c9 Transfer ownership via parameter/argument",id:"-transfer-ownership-via-parameterargument",level:3},{value:"A.34.7. Clone data",id:"a347-clone-data",level:2},{value:"A.34.8. Ownership pada data literal",id:"a348-ownership-pada-data-literal",level:2},{value:"A.34.9. Move semantics pada macro println",id:"a349-move-semantics-pada-macro-println",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function o(a){let{components:e,...r}=a;return(0,t.kt)("wrapper",(0,i.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Chapter ini berisi pembahasan tentang ownership, bagaimana Rust melakukan manajemen memory dengan menerapkan approach ownership ini."),(0,t.kt)("p",null,"O iya, diwajibkan untuk mempelajari terlebih dahulu tentang dasar ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management"},"Memory Management")," dan juga ",(0,t.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),", yang keduanya adalah dibahas pada chapter sebelumnya. Jika pembaca mempelajari ebook ini secara urut maka tidak usah khawatir."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pembahasan pada chapter ini adalah salah satu hal yang paling penting untuk dipahami dalam Rust programming, karena topik yang berhubungan dengan memory management adalah hal yang krusial pada system programming."),(0,t.kt)("p",{parentName:"blockquote"},"Silakan ulang-ulang chapter ini jika diperlukan.")),(0,t.kt)("h2",{id:"a341-konsep-ownership"},"A.34.1. Konsep ownership"),(0,t.kt)("p",null,"Ownership merupakan kumpulan aturan yang ada di Rust yang dijadikan acuan oleh compiler dalam pengelolahan memory."),(0,t.kt)("p",null,"Sudah disinggung pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management"},"Memory Management")," bahwa Rust tidak menerapkan GC ataupun ARC dalam manajemen memory-nya. Rust membebankan manajemen memory pada penulis kode program, yaitu kita/programmer."),(0,t.kt)("p",null,"Aturan ownership ada banyak, dan programmer harus mengikutinya, karena jika tidak, maka proses kompilasi program dan eksekusi program akan gagal dan hasilnya error."),(0,t.kt)("h2",{id:"a342-aturan-ownership"},"A.34.2. Aturan ownership"),(0,t.kt)("p",null,"Ada 3 aturan penting yang wajib diketahui:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},(0,t.kt)("strong",{parentName:"p"},"Semua nilai/data/value di Rust memiliki owner"),". Misal kita berbicara tentang deklarasi variabel dengan predefined value, maka value variabel adalah yang dimaksud dengan nilai/data/value, dan variabel itu sendiri adalah owner dari nilai/data/value tersebut.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Pada waktu yang sama, ",(0,t.kt)("strong",{parentName:"p"},"hanya boleh ada 1 owner"),". Satu data, ownernya hanya satu.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},(0,t.kt)("strong",{parentName:"p"},"Ketika eksekusi sebuah block scope selesai, maka owner dari data-data yang ada dalam scope tersebut akan di-drop atau di-dealokasi")," (dengan pengecualian yaitu owner berpindah ke luar scope)."))),(0,t.kt)("h2",{id:"a343-variable-scope"},"A.34.3. Variable scope"),(0,t.kt)("p",null,"Sebelum kita masuk ke pembahasan yang lebih detail mengenai ownership, mari pelajari terlebih dahulu tentang apa itu variable scope."),(0,t.kt)("p",null,"Variable scope maksudnya adalah di block scope mana suatu variabel dideklarasikan, dan dalam block scope tersebut variabel menjadi valid (bisa digunakan). Di luar scope-nya variabel menjadi tidak valid, tidak bisa digunakan."),(0,t.kt)("p",null,"Agar lebih jelas, silakan perhatikan kode berikut, tidak perlu dipraktikkan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_something() {\n let data_one = "one";\n // ...\n}\n\nfn main() {\n let data_two = "two";\n // ...\n\n {\n let data_three = "three";\n // ...\n }\n\n do_something();\n\n if true {\n let data_four = "four";\n // ...\n }\n}\n')),(0,t.kt)("p",null,"Program di atas memiliki 4 buah block kode:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", yang isinya adalah variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," dan beberapa sub-block dan 1 buah pemanggilan fungsi. Di dalam block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," adalah valid, dan bisa digunakan dalam fungsi scope tersebut beserta sub-block lainnya (block expression dan block kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),").")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block expression yang berisi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_three"),". Pada block scope ini, variabel tersebut dan juga variable ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," adalah valid.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),", yang isinya variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_one"),". Variabel tersebut hanya akan valid dalam block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),".")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_four")," berada dalam block ini, maka variabel tersebut adalah valid dalam block tersebut. Selain itu ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," juga valid dalam block seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," ini."))),(0,t.kt)("p",null,"Intinya, variabel adalah valid ketika berada di dalam scope-nya (istilahnya ",(0,t.kt)("em",{parentName:"p"},"into scope"),"), dan variabel menjadi tidak valid atau invalid ketika keluar dari scope (istilahnya ",(0,t.kt)("em",{parentName:"p"},"out of scope"),")."),(0,t.kt)("h2",{id:"a344-copy-semantics-vs-move-semantics"},"A.34.4. Copy semantics vs. move semantics"),(0,t.kt)("p",null,"Di atas sudah dijelaskan mengenai aturan ownership, yang salah satunya adalah setiap data yang ada di Rust memiliki owner, dan 1 data owner pasti 1 (tidak lebih)."),(0,t.kt)("p",null,"Agar lebih jelas mari kita perhatikan contoh berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let x = 24;\nlet y = x;\nprintln!("x: {:?}, y: {:?}", x, y);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(1146).Z,width:"333",height:"110"})),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dideklarasikan dengan nilai ",(0,t.kt)("inlineCode",{parentName:"p"},"24"),", artinya variabel tersebut adalah owner dari data ",(0,t.kt)("inlineCode",{parentName:"p"},"24"),". Kemudian variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dijadikan sebagai nilai variabel baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),", dari sini apakah berarti owner data ",(0,t.kt)("inlineCode",{parentName:"p"},"24")," adalah berpindah dari variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),"? jawabannya adalah ",(0,t.kt)("strong",{parentName:"p"},"tidak"),"."),(0,t.kt)("p",null,"Yang terjadi adalah data ",(0,t.kt)("inlineCode",{parentName:"p"},"24")," milik owner ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," di-copy atau diduplikasi sebagai data baru yang owner-nya juga baru, yang pada contoh ini adalah variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),"."),(0,t.kt)("p",null,"Hasilnya, kedua variabel tersebut masing-masing adalah owner dari data yang berbeda, meskipun sumbernya adalah dari data yang sama. Perilaku ini disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"copy semantics"),"."),(0,t.kt)("p",null,"Semua tipe data primitif di Rust ",(0,t.kt)("em",{parentName:"p"},"by default")," mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),". Ketika terjadi operasi assignment seperti pada contoh di atas, maka yang terjadi adalah data di-copy sebagai data baru, dengan owner baru, dan di sisi memory juga terjadi alokasi alamat baru untuk menampung data hasil copy tersebut."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Copy semantics ",(0,t.kt)("em",{parentName:"p"},"by default")," berlaku pada tipe primitif."),(0,t.kt)("p",{parentName:"blockquote"},"Sudah dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management#a323-stack-memory"},"Memory Management \u279c Stack")," bahwa data primitif disimpan di stack dan pengaksesannya sangat cepat."),(0,t.kt)("p",{parentName:"blockquote"},"Dengan ini, copy data pada tipe primitif meskipun menghasilkan alokasi memory baru, konsekuensinya tidak terlalu besar karena pengaksesannya sangat cepat.")),(0,t.kt)("p",null,"Ok, lalu bagaimana dengan contoh ke-2 berikut? Apakah yang terjadi juga sama?"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let a = String::from("hello rust");\nlet b = a;\nprintln!("a: {:?}, b: {:?}", a, b);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(5572).Z,width:"804",height:"394"})),(0,t.kt)("p",null,"Wow, malah muncul error. Kok bisa, padahal kode program sangat straightforward."),(0,t.kt)("p",null,"Jadi begini, sebelumnya sudah dibahas bahwa semua tipe data primitif mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),". Namun untuk tipe data non-primitif (yang salah satunya adalah custom type ",(0,t.kt)("inlineCode",{parentName:"p"},"String"),") yang diadopsi adalah ",(0,t.kt)("strong",{parentName:"p"},"move semantics"),"."),(0,t.kt)("p",null,"Pada ",(0,t.kt)("em",{parentName:"p"},"move semantics"),", ketika ada operasi assignment seperti ",(0,t.kt)("inlineCode",{parentName:"p"},"let a = b;"),", maka yang terjadi adalah owner dari data string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust")," berpindah dari variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),". Jadinya, mulai dari statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let a = b;")," dan statement seterusnya, owner dari data string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust")," bukan lagi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a"),", tetapi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,t.kt)("p",null,"Ok, sampai sini cukup jelas. Tapi kenapa bisa error? Error muncul karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," sudah tidak bisa digunakan lagi, data-nya (string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust"),") sudah berpindah ke variabel lain. Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," menjadi tidak valid setelah owner-nya berpindah, dan ini adalah penyebab kenapa pemanggilan variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," via macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," menghasilkan error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Ingat, setiap data pasti punya owner, dan satu data ownernya hanya satu."),(0,t.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, owner data ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust")," sudah berpindah dari variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),".")),(0,t.kt)("p",null,"Intinya, variabel yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),", setiap kali ada operasi assignment maka owner akan berpindah ke variabel baru."),(0,t.kt)("p",null,"Jika perlu, silakan coba praktikkan dengan tipe data non-primitif lainnya, seperti struct atau lainnya. Dengan pseudocode yang sama seperti contoh di atas, hasilnya adalah sama, yaitu error."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct MyStruct;\n\nlet g = MyStruct{};\nlet h = g;\n\nprintln!("g: {:?}, h: {:?}", g, h);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(5914).Z,width:"821",height:"449"})),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Copy semantics di Rust merupakan sifat yang dimiliki oleh trait ",(0,t.kt)("inlineCode",{parentName:"p"},"std::marker::Copy"),"."),(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},"Semua data primitif meng-implement trait ",(0,t.kt)("inlineCode",{parentName:"li"},"std::marker::Copy")," yang berarti mengadopsi ",(0,t.kt)("em",{parentName:"li"},"copy semantics"),"."),(0,t.kt)("li",{parentName:"ul"},"Data non-primitif mengadopsi ",(0,t.kt)("em",{parentName:"li"},"move semantics"),".")),(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),".")),(0,t.kt)("h2",{id:"a345-alokasi--dealokasi"},"A.34.5. Alokasi & dealokasi"),(0,t.kt)("p",null,"Ok, masuk ke pembahasan selanjutnya, yaitu tentang alokasi dan dealokasi sebuah variabel dalam scope-nya."),(0,t.kt)("p",null,"Di sini kita akan gunakan custom type ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," sebagai contoh untuk mempelajari ownership. Untuk tipe non-primitif lainnya yang juga mengadopsi ",(0,t.kt)("strong",{parentName:"p"},"move semantics")," sebenarnya bisa dijadikan contoh. Tapi penulis memilih tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," karena sering digunakan."),(0,t.kt)("p",null,"Sekarang perhatikan kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n do_something();\n}\n\nfn do_something() {\n let mut k = String::from("hello");\n\n {\n let m = String::from("hello world");\n let n = String::from("from rust");\n k = n;\n \n println!("{:?}", m);\n }\n\n println!("{:?}", k);\n}\n')),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," dideklarasikan, isinya adalah pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,t.kt)("p",null,"Di dalam fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),", variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k")," dideklarasikan. Statement deklarasi tersebut adalah kapan proses alokasi memory berlangsung untuk data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k"),"."),(0,t.kt)("p",null,"Kemudian ada block expression, dan di dalamnya terjadi lagi proses alokasi memory untuk data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," dengan nilai adalah string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello world"),", dan variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"n")," berisi string ",(0,t.kt)("inlineCode",{parentName:"p"},"from rust"),"."),(0,t.kt)("p",null,"Masih di dalam block expression, terjadi assignment operation, data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"n")," berpindah ke variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k"),". Lalu bagaimana nasib data string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello")," yang sebelumnya dimiliki oleh ",(0,t.kt)("inlineCode",{parentName:"p"},"n"),"? Yang terjadi adalah data tersebut tidak memiliki reference, dan nantinya di akhir fungsi akan di-dealokasi. Proses dealokasi terjadi setelah fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," selesai dieksekusi karena variable scope data tersebut adalah di block kode fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,t.kt)("p",null,"Ok, masih dalam block expression. Ada statement print untuk data variable ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," yang merupakan statement terakhir di block expression tersebut. Setelah eksekusi block expression selesai, yang terjadi kemudian adalah:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"data variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"m")," di-dealokasi, karena sudah ",(0,t.kt)("em",{parentName:"li"},"out of scope"),"."),(0,t.kt)("li",{parentName:"ul"},"data variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"n")," tidak di-dealokasi, karena sudah berpindah scope-nya ke fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"do_something"),". Data tersebut sekarang ownernya adalah variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"k")," yang scope-nya ada di block fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"do_something"),".")),(0,t.kt)("p",null,"Kemudian variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k")," di-print, dan fungsi selesai dieksekusi. Pada moment inilah semua data dalam scope block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," di-dealokasi, karena kesemua data tersebut adalah ",(0,t.kt)("em",{parentName:"p"},"out of scope")," dan tidak ada yang berpindah ke block fungsi lainnya."),(0,t.kt)("p",null,"Secara garis besar seperti itu proses manajemen memory pada Rust yang menerapkan konsep ",(0,t.kt)("em",{parentName:"p"},"ownership"),"."),(0,t.kt)("h2",{id:"a346-transfer-ownership"},"A.34.6. Transfer ownership"),(0,t.kt)("p",null,"Di atas sudah dibahas bagaimana cara untuk transfer ownership data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),", yaitu cukup dengan statement assignment."),(0,t.kt)("p",null,"Berikut adalah contoh lain perihal transfer ownership. Data string yang owner awalnya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"msg1"),", berpindah ke ",(0,t.kt)("inlineCode",{parentName:"p"},"msg2"),", kemudian berpindah lagi ke ",(0,t.kt)("inlineCode",{parentName:"p"},"msg3"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let msg1 = String::from("hello");\nlet msg2 = msg1;\nlet msg3 = msg2;\nprintln!("{:?}", msg3);\n')),(0,t.kt)("p",null,"Coba modifikasi sedikit kode tersebut, dengan menambahkan deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"msg4")," yang nilai-nya didapat dari ",(0,t.kt)("inlineCode",{parentName:"p"},"msg2"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let msg1 = String::from("hello");\nlet msg2 = msg1;\nlet msg3 = msg2;\n\nlet msg4 = msg2;\nprintln!("{:?}", msg4);\n')),(0,t.kt)("p",null,"Hasilnya adalah error, karena ",(0,t.kt)("inlineCode",{parentName:"p"},"msg2")," sudah invalid."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(3760).Z,width:"792",height:"394"})),(0,t.kt)("p",null,"Jika ingin memindah datanya ke ",(0,t.kt)("inlineCode",{parentName:"p"},"msg4"),", maka gunakan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let msg4 = msg3"),"."),(0,t.kt)("h3",{id:"-transfer-ownership-via-return-value"},"\u25c9 Transfer ownership via return value"),(0,t.kt)("p",null,"Transfer ownership data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics")," juga bisa dilakukan antar fungsi via return value. Sebagai contoh pada kode berikut, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," yang berada di dalam block expression berpindah ke luar scope yaitu ke block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," via operasi assignment ",(0,t.kt)("inlineCode",{parentName:"p"},"k = m"),". Kemudian berpindah lagi ke fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," via return value pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = do_something();\n println!("{:?}", msg);\n}\n \nfn do_something() -> String {\n let mut k = String::from("hello");\n\n {\n let m = String::from("hello world");\n k = m;\n }\n\n return k;\n}\n')),(0,t.kt)("h3",{id:"-transfer-ownership-via-parameterargument"},"\u25c9 Transfer ownership via parameter/argument"),(0,t.kt)("p",null,"Pemanggilan fungsi dengan menyisipkan argument juga menghasilkan proses transfer ownership untuk data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = String::from("hello rust");\n say_hello(msg);\n}\n \nfn say_hello(param: String) {\n println!("{:?}", param);\n}\n')),(0,t.kt)("p",null,"Pada kode di atas, data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"msg")," owner-nya berpindah ke parameter bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"param")," milik fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello"),"."),(0,t.kt)("p",null,"Ok, sampai di sini semoga cukup jelas ya tentang bagaimana proses transfer ownership terjadi pada data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),"."),(0,t.kt)("p",null,"Untuk data bertipe primitif (yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),") kita tidak perlu repot memikirkan dimana owner datanya, karena setiap operasi assignment, data akan di-copy dan hasilnya ada data baru dengan owner baru."),(0,t.kt)("p",null,"Tapi kalau dipikir-pikir justru lebih repot mengurus data yang ownernya berpindah saat assignment. Sebagai contoh, misal variabel digunakan di fungsi lain, kemudian digunakan lagi di scope asalnya. Repot juga kalau setiap saat harus dikembalikan lagi via return value."),(0,t.kt)("p",null,"Misalnya pada kasus berikut ini. Hasilnya pasti error, karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"msg")," di print setelah owner-nya berpindah ke fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = String::from("hello rust");\n say_hello(msg);\n println!("{:?}", msg);\n}\n \nfn say_hello(param: String) {\n println!("{:?}", param);\n}\n')),(0,t.kt)("p",null,"Lalu apa solusinya? apakah harus mengembalikannya via return value? Contohnya seperti kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut msg = String::from("hello rust"); // 1. awalnya data di sini\n msg = say_hello(msg); // 3. lalu dikembalikan lagi ke sini\n println!("{:?}", msg);\n}\n \nfn say_hello(param: String) -> String { // 2. kemudian berpindah ke sini\n println!("{:?}", param);\n param\n}\n')),(0,t.kt)("p",null,"Boleh-boleh saja sebenarnya pakai approach tersebut, tapi malah makin repot bukan?"),(0,t.kt)("p",null,"Ada lagi solusi lainnya yang bisa digunakan, yaitu dengan memanfaatkan method ",(0,t.kt)("inlineCode",{parentName:"p"},"clone")," untuk cloning data."),(0,t.kt)("h2",{id:"a347-clone-data"},"A.34.7. Clone data"),(0,t.kt)("p",null,"Semua tipe data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics")," meng-implement trait ",(0,t.kt)("inlineCode",{parentName:"p"},"std::clone::Clone"),". Trait ini memiliki method bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"clone")," yang gunanya adalah menduplikasi atau clonging data. Cukup panggil saja method tersebut, maka data akan ter-cloning."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),".")),(0,t.kt)("p",null,"Kita akan terapkan pada kode sebelumnya, hasilnya kurang lebih seperti ini. Pada argument pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," disisipkan data cloning via statement ",(0,t.kt)("inlineCode",{parentName:"p"},"msg.clone()"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = String::from("hello rust");\n say_hello(msg.clone());\n println!("{:?}", msg);\n}\n \nfn say_hello(param: String) {\n println!("{:?}", param);\n}\n')),(0,t.kt)("p",null,"Ok, dengan ini masalah untuk me-reuse data yang bisa berpindah ownernya dianggap beres. Memang beres, tapi apakah cara ini baik kalau dilihat dari sudut pandang memory management?"),(0,t.kt)("p",null,"Konsekuensi dari cloning data adalah terjadi proses alokasi lagi di memory. Data akan di-duplikasi dan dialokasikan ke alamat memory baru, jadinya kurang efisien. Ditambah lagi, jika kita mengacu ke penjelasan pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management#a324-heap-memory"},"Memory Management \u279c Heap Memory"),", data ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," isinya disimpan di heap memory yang pengaksesannya lebih lambat dibanding pengaksesan data stack. Dari sini bisa disimpulkan bahwa cloning bukan solusi yang paling baik (kecuali terpaksa)."),(0,t.kt)("p",null,(0,t.kt)("strong",{parentName:"p"},"Solusi yang lebih baik adalah dengan melakukan operasi pinjam data dari owner aslinya tanpa perlu melakukan operasi perpindahan owner"),", yang pada Rust programming disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"borrowing"),"."),(0,t.kt)("p",null,"Kita sebenarnya sudah menerapkannya beberapa kali pada chapter yang lalu, tapi kita akan bahas lagi lebih detail (dari sudut pandang ownership) pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,t.kt)("h2",{id:"a348-ownership-pada-data-literal"},"A.34.8. Ownership pada data literal"),(0,t.kt)("p",null,"Kita akan bahas topik ini pada chapter berikutnya, yaitu chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/borrowing#a347-owner-dan-borrower-pada-literal"},"Borrowing"),"."),(0,t.kt)("h2",{id:"a349-move-semantics-pada-macro-println"},"A.34.9. ",(0,t.kt)("em",{parentName:"h2"},"Move semantics")," pada macro ",(0,t.kt)("inlineCode",{parentName:"h2"},"println")),(0,t.kt)("p",null,"Ada yang unik dengan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),". Silakan coba kode berikut agar terlihat keunikannya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let str1 = String::from("luwe");\n println!("{str1}");\n do_something(str1);\n \n let str2 = String::from("ngelak");\n do_something(str2);\n println!("{str2}");\n}\n\nfn do_something(str: String) {\n println!("{}", str);\n}\n')),(0,t.kt)("p",null,"Jika dijalankan ada error di statement terakhir fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(8255).Z,width:"883",height:"682"})),(0,t.kt)("p",null,"Seperti yang sudah dibahas, bahwa tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," mengadopsi move semantics. Ketika data bertipe ini digunakan pada operasi assignment seperti contohnya sebagai argument pemanggilan fungsi, maka owner berpindah."),(0,t.kt)("p",null,"Tapi entah kenapa, khusus dalam pemanggilan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", owner-nya tidak berpindah. Ajaib."),(0,t.kt)("p",null,"Silakan lihat sendiri di gambar di atas, ketika ",(0,t.kt)("inlineCode",{parentName:"p"},"str1")," digunakan pada macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", kemudian digunakan lagi pada argument pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),", hasilnya tidak error."),(0,t.kt)("p",null,"Akan tetapi ketika digunakan pada pemanggilan fungsi terlebih dahulu, jika digunakan lagi di statement di bawahnya hasilnya error."),(0,t.kt)("p",null,"Ini adalah keistimewaan dari macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," dan beberapa macro untuk keperluan printing lainnya."),(0,t.kt)("p",null,"Lebih jelasnya mengenai macro dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"),"."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/ownership"},"github.com/novalagung/dasarpemrogramanrust-example/../ownership")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html"},"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/marker/trait.Copy.html"},"https://doc.rust-lang.org/std/marker/trait.Copy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/ownership.html"},"https://doc.rust-lang.org/nomicon/ownership.html"))))}o.isMDXComponent=!0},1146:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU0AAABuCAIAAAAs3da/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDlUMTY6MzE6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjA4OjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjA4OjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFmY2NhODNkLTEyMGUtM2E0OC04OWZkLTcxM2I1Y2ZiNDY4NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0NjE2MGJiNS05ZTE2LThhNDYtYjNlMi1lZjg5MTlhMTViNTkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0NjE2MGJiNS05ZTE2LThhNDYtYjNlMi1lZjg5MTlhMTViNTkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjQ2MTYwYmI1LTllMTYtOGE0Ni1iM2UyLWVmODkxOWExNWI1OTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2MTYwYmI1LTllMTYtOGE0Ni1iM2UyLWVmODkxOWExNWI1OSIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0wOVQxNjozMToxNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxZmNjYTgzZC0xMjBlLTNhNDgtODlmZC03MTNiNWNmYjQ2ODciIHN0RXZ0OndoZW49IjIwMjItMTItMjFUMTU6MDg6MTgrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz79GkH7AAAOVklEQVR42u1dPXLcOBfck0h2ptixrVSZ5cSBg1Gmcupy1VRtpoP4CDqF8z3UDv9A4KEf8EASHJLTXV99a3FA/DceAOI1/rkjCOLo+IdV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"},5572:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-2-b8db9994157f3e86c2a74d048ca45363.png"},5914:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-3-f9834609466195e2d46433bbc089153c.png"},3760:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-4-90c3dccbd5f0429a8760c9a445f446af.png"},8255:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-5-42080e6ebdac72f8d756dcf0dacb2061.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4248],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>u});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function l(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var s=i.createContext({}),m=function(a){var e=i.useContext(s),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},d=function(a){var e=m(a.components);return i.createElement(s.Provider,{value:e},a.children)},o={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},k=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,r=a.originalType,s=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),k=m(n),u=t,g=k["".concat(s,".").concat(u)]||k[u]||o[u]||r;return n?i.createElement(g,l(l({ref:e},d),{},{components:n})):i.createElement(g,l({ref:e},d))}));function u(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var r=n.length,l=new Array(r);l[0]=k;var p={};for(var s in e)hasOwnProperty.call(e,s)&&(p[s]=e[s]);p.originalType=a,p.mdxType="string"==typeof a?a:t,l[1]=p;for(var m=2;m{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>p,toc:()=>m});var i=n(7462),t=(n(7294),n(3905));const r={sidebar_position:34,title:"A.34. Ownership",sidebar_label:"A.34. Ownership"},l=void 0,p={unversionedId:"basic/ownership",id:"basic/ownership",title:"A.34. Ownership",description:"Chapter ini berisi pembahasan tentang ownership, bagaimana Rust melakukan manajemen memory dengan menerapkan approach ownership ini.",source:"@site/docs/basic/ownership.md",sourceDirName:"basic",slug:"/basic/ownership",permalink:"/basic/ownership",draft:!1,tags:[],version:"current",sidebarPosition:34,frontMatter:{sidebar_position:34,title:"A.34. Ownership",sidebar_label:"A.34. Ownership"},sidebar:"tutorialSidebar",previous:{title:"A.33. Pointer & References",permalink:"/basic/pointer-references"},next:{title:"A.35. Borrowing",permalink:"/basic/borrowing"}},s={},m=[{value:"A.34.1. Konsep ownership",id:"a341-konsep-ownership",level:2},{value:"A.34.2. Aturan ownership",id:"a342-aturan-ownership",level:2},{value:"A.34.3. Variable scope",id:"a343-variable-scope",level:2},{value:"A.34.4. Copy semantics vs. move semantics",id:"a344-copy-semantics-vs-move-semantics",level:2},{value:"A.34.5. Alokasi & dealokasi",id:"a345-alokasi--dealokasi",level:2},{value:"A.34.6. Transfer ownership",id:"a346-transfer-ownership",level:2},{value:"\u25c9 Transfer ownership via return value",id:"-transfer-ownership-via-return-value",level:3},{value:"\u25c9 Transfer ownership via parameter/argument",id:"-transfer-ownership-via-parameterargument",level:3},{value:"A.34.7. Clone data",id:"a347-clone-data",level:2},{value:"A.34.8. Ownership pada data literal",id:"a348-ownership-pada-data-literal",level:2},{value:"A.34.9. Move semantics pada macro println",id:"a349-move-semantics-pada-macro-println",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function o(a){let{components:e,...r}=a;return(0,t.kt)("wrapper",(0,i.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Chapter ini berisi pembahasan tentang ownership, bagaimana Rust melakukan manajemen memory dengan menerapkan approach ownership ini."),(0,t.kt)("p",null,"O iya, diwajibkan untuk mempelajari terlebih dahulu tentang dasar ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management"},"Memory Management")," dan juga ",(0,t.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),", yang keduanya adalah dibahas pada chapter sebelumnya. Jika pembaca mempelajari ebook ini secara urut maka tidak usah khawatir."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pembahasan pada chapter ini adalah salah satu hal yang paling penting untuk dipahami dalam Rust programming, karena topik yang berhubungan dengan memory management adalah hal yang krusial pada system programming."),(0,t.kt)("p",{parentName:"blockquote"},"Silakan ulang-ulang chapter ini jika diperlukan.")),(0,t.kt)("h2",{id:"a341-konsep-ownership"},"A.34.1. Konsep ownership"),(0,t.kt)("p",null,"Ownership merupakan kumpulan aturan yang ada di Rust yang dijadikan acuan oleh compiler dalam pengelolahan memory."),(0,t.kt)("p",null,"Sudah disinggung pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management"},"Memory Management")," bahwa Rust tidak menerapkan GC ataupun ARC dalam manajemen memory-nya. Rust membebankan manajemen memory pada penulis kode program, yaitu kita/programmer."),(0,t.kt)("p",null,"Aturan ownership ada banyak, dan programmer harus mengikutinya, karena jika tidak, maka proses kompilasi program dan eksekusi program akan gagal dan hasilnya error."),(0,t.kt)("h2",{id:"a342-aturan-ownership"},"A.34.2. Aturan ownership"),(0,t.kt)("p",null,"Ada 3 aturan penting yang wajib diketahui:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},(0,t.kt)("strong",{parentName:"p"},"Semua nilai/data/value di Rust memiliki owner"),". Misal kita berbicara tentang deklarasi variabel dengan predefined value, maka value variabel adalah yang dimaksud dengan nilai/data/value, dan variabel itu sendiri adalah owner dari nilai/data/value tersebut.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Pada waktu yang sama, ",(0,t.kt)("strong",{parentName:"p"},"hanya boleh ada 1 owner"),". Satu data, ownernya hanya satu.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},(0,t.kt)("strong",{parentName:"p"},"Ketika eksekusi sebuah block scope selesai, maka owner dari data-data yang ada dalam scope tersebut akan di-drop atau di-dealokasi")," (dengan pengecualian yaitu owner berpindah ke luar scope)."))),(0,t.kt)("h2",{id:"a343-variable-scope"},"A.34.3. Variable scope"),(0,t.kt)("p",null,"Sebelum kita masuk ke pembahasan yang lebih detail mengenai ownership, mari pelajari terlebih dahulu tentang apa itu variable scope."),(0,t.kt)("p",null,"Variable scope maksudnya adalah di block scope mana suatu variabel dideklarasikan, dan dalam block scope tersebut variabel menjadi valid (bisa digunakan). Di luar scope-nya variabel menjadi tidak valid, tidak bisa digunakan."),(0,t.kt)("p",null,"Agar lebih jelas, silakan perhatikan kode berikut, tidak perlu dipraktikkan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_something() {\n let data_one = "one";\n // ...\n}\n\nfn main() {\n let data_two = "two";\n // ...\n\n {\n let data_three = "three";\n // ...\n }\n\n do_something();\n\n if true {\n let data_four = "four";\n // ...\n }\n}\n')),(0,t.kt)("p",null,"Program di atas memiliki 4 buah block kode:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", yang isinya adalah variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," dan beberapa sub-block dan 1 buah pemanggilan fungsi. Di dalam block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," adalah valid, dan bisa digunakan dalam fungsi scope tersebut beserta sub-block lainnya (block expression dan block kode ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),").")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block expression yang berisi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_three"),". Pada block scope ini, variabel tersebut dan juga variable ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," adalah valid.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),", yang isinya variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_one"),". Variabel tersebut hanya akan valid dalam block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),".")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Block seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"if"),". Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data_four")," berada dalam block ini, maka variabel tersebut adalah valid dalam block tersebut. Selain itu ",(0,t.kt)("inlineCode",{parentName:"p"},"data_two")," juga valid dalam block seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," ini."))),(0,t.kt)("p",null,"Intinya, variabel adalah valid ketika berada di dalam scope-nya (istilahnya ",(0,t.kt)("em",{parentName:"p"},"into scope"),"), dan variabel menjadi tidak valid atau invalid ketika keluar dari scope (istilahnya ",(0,t.kt)("em",{parentName:"p"},"out of scope"),")."),(0,t.kt)("h2",{id:"a344-copy-semantics-vs-move-semantics"},"A.34.4. Copy semantics vs. move semantics"),(0,t.kt)("p",null,"Di atas sudah dijelaskan mengenai aturan ownership, yang salah satunya adalah setiap data yang ada di Rust memiliki owner, dan 1 data owner pasti 1 (tidak lebih)."),(0,t.kt)("p",null,"Agar lebih jelas mari kita perhatikan contoh berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let x = 24;\nlet y = x;\nprintln!("x: {:?}, y: {:?}", x, y);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(1146).Z,width:"333",height:"110"})),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dideklarasikan dengan nilai ",(0,t.kt)("inlineCode",{parentName:"p"},"24"),", artinya variabel tersebut adalah owner dari data ",(0,t.kt)("inlineCode",{parentName:"p"},"24"),". Kemudian variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dijadikan sebagai nilai variabel baru bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),", dari sini apakah berarti owner data ",(0,t.kt)("inlineCode",{parentName:"p"},"24")," adalah berpindah dari variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),"? jawabannya adalah ",(0,t.kt)("strong",{parentName:"p"},"tidak"),"."),(0,t.kt)("p",null,"Yang terjadi adalah data ",(0,t.kt)("inlineCode",{parentName:"p"},"24")," milik owner ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," di-copy atau diduplikasi sebagai data baru yang owner-nya juga baru, yang pada contoh ini adalah variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),"."),(0,t.kt)("p",null,"Hasilnya, kedua variabel tersebut masing-masing adalah owner dari data yang berbeda, meskipun sumbernya adalah dari data yang sama. Perilaku ini disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"copy semantics"),"."),(0,t.kt)("p",null,"Semua tipe data primitif di Rust ",(0,t.kt)("em",{parentName:"p"},"by default")," mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),". Ketika terjadi operasi assignment seperti pada contoh di atas, maka yang terjadi adalah data di-copy sebagai data baru, dengan owner baru, dan di sisi memory juga terjadi alokasi alamat baru untuk menampung data hasil copy tersebut."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Copy semantics ",(0,t.kt)("em",{parentName:"p"},"by default")," berlaku pada tipe primitif."),(0,t.kt)("p",{parentName:"blockquote"},"Sudah dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management#a323-stack-memory"},"Memory Management \u279c Stack")," bahwa data primitif disimpan di stack dan pengaksesannya sangat cepat."),(0,t.kt)("p",{parentName:"blockquote"},"Dengan ini, copy data pada tipe primitif meskipun menghasilkan alokasi memory baru, konsekuensinya tidak terlalu besar karena pengaksesannya sangat cepat.")),(0,t.kt)("p",null,"Ok, lalu bagaimana dengan contoh ke-2 berikut? Apakah yang terjadi juga sama?"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let a = String::from("hello rust");\nlet b = a;\nprintln!("a: {:?}, b: {:?}", a, b);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(5572).Z,width:"804",height:"394"})),(0,t.kt)("p",null,"Wow, malah muncul error. Kok bisa, padahal kode program sangat straightforward."),(0,t.kt)("p",null,"Jadi begini, sebelumnya sudah dibahas bahwa semua tipe data primitif mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),". Namun untuk tipe data non-primitif (yang salah satunya adalah custom type ",(0,t.kt)("inlineCode",{parentName:"p"},"String"),") yang diadopsi adalah ",(0,t.kt)("strong",{parentName:"p"},"move semantics"),"."),(0,t.kt)("p",null,"Pada ",(0,t.kt)("em",{parentName:"p"},"move semantics"),", ketika ada operasi assignment seperti ",(0,t.kt)("inlineCode",{parentName:"p"},"let a = b;"),", maka yang terjadi adalah owner dari data string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust")," berpindah dari variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),". Jadinya, mulai dari statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let a = b;")," dan statement seterusnya, owner dari data string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust")," bukan lagi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a"),", tetapi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,t.kt)("p",null,"Ok, sampai sini cukup jelas. Tapi kenapa bisa error? Error muncul karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," sudah tidak bisa digunakan lagi, data-nya (string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust"),") sudah berpindah ke variabel lain. Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," menjadi tidak valid setelah owner-nya berpindah, dan ini adalah penyebab kenapa pemanggilan variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," via macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," menghasilkan error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Ingat, setiap data pasti punya owner, dan satu data ownernya hanya satu."),(0,t.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, owner data ",(0,t.kt)("inlineCode",{parentName:"p"},"hello rust")," sudah berpindah dari variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"a")," ke ",(0,t.kt)("inlineCode",{parentName:"p"},"b"),".")),(0,t.kt)("p",null,"Intinya, variabel yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),", setiap kali ada operasi assignment maka owner akan berpindah ke variabel baru."),(0,t.kt)("p",null,"Jika perlu, silakan coba praktikkan dengan tipe data non-primitif lainnya, seperti struct atau lainnya. Dengan pseudocode yang sama seperti contoh di atas, hasilnya adalah sama, yaitu error."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct MyStruct;\n\nlet g = MyStruct{};\nlet h = g;\n\nprintln!("g: {:?}, h: {:?}", g, h);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(5914).Z,width:"821",height:"449"})),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Copy semantics di Rust merupakan sifat yang dimiliki oleh trait ",(0,t.kt)("inlineCode",{parentName:"p"},"std::marker::Copy"),"."),(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},"Semua data primitif meng-implement trait ",(0,t.kt)("inlineCode",{parentName:"li"},"std::marker::Copy")," yang berarti mengadopsi ",(0,t.kt)("em",{parentName:"li"},"copy semantics"),"."),(0,t.kt)("li",{parentName:"ul"},"Data non-primitif mengadopsi ",(0,t.kt)("em",{parentName:"li"},"move semantics"),".")),(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),".")),(0,t.kt)("h2",{id:"a345-alokasi--dealokasi"},"A.34.5. Alokasi & dealokasi"),(0,t.kt)("p",null,"Ok, masuk ke pembahasan selanjutnya, yaitu tentang alokasi dan dealokasi sebuah variabel dalam scope-nya."),(0,t.kt)("p",null,"Di sini kita akan gunakan custom type ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," sebagai contoh untuk mempelajari ownership. Untuk tipe non-primitif lainnya yang juga mengadopsi ",(0,t.kt)("strong",{parentName:"p"},"move semantics")," sebenarnya bisa dijadikan contoh. Tapi penulis memilih tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," karena sering digunakan."),(0,t.kt)("p",null,"Sekarang perhatikan kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n do_something();\n}\n\nfn do_something() {\n let mut k = String::from("hello");\n\n {\n let m = String::from("hello world");\n let n = String::from("from rust");\n k = n;\n \n println!("{:?}", m);\n }\n\n println!("{:?}", k);\n}\n')),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," dideklarasikan, isinya adalah pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,t.kt)("p",null,"Di dalam fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),", variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k")," dideklarasikan. Statement deklarasi tersebut adalah kapan proses alokasi memory berlangsung untuk data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k"),"."),(0,t.kt)("p",null,"Kemudian ada block expression, dan di dalamnya terjadi lagi proses alokasi memory untuk data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," dengan nilai adalah string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello world"),", dan variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"n")," berisi string ",(0,t.kt)("inlineCode",{parentName:"p"},"from rust"),"."),(0,t.kt)("p",null,"Masih di dalam block expression, terjadi assignment operation, data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"n")," berpindah ke variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k"),". Lalu bagaimana nasib data string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello")," yang sebelumnya dimiliki oleh ",(0,t.kt)("inlineCode",{parentName:"p"},"n"),"? Yang terjadi adalah data tersebut tidak memiliki reference, dan nantinya di akhir fungsi akan di-dealokasi. Proses dealokasi terjadi setelah fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," selesai dieksekusi karena variable scope data tersebut adalah di block kode fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,t.kt)("p",null,"Ok, masih dalam block expression. Ada statement print untuk data variable ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," yang merupakan statement terakhir di block expression tersebut. Setelah eksekusi block expression selesai, yang terjadi kemudian adalah:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"data variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"m")," di-dealokasi, karena sudah ",(0,t.kt)("em",{parentName:"li"},"out of scope"),"."),(0,t.kt)("li",{parentName:"ul"},"data variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"n")," tidak di-dealokasi, karena sudah berpindah scope-nya ke fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"do_something"),". Data tersebut sekarang ownernya adalah variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"k")," yang scope-nya ada di block fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"do_something"),".")),(0,t.kt)("p",null,"Kemudian variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"k")," di-print, dan fungsi selesai dieksekusi. Pada moment inilah semua data dalam scope block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," di-dealokasi, karena kesemua data tersebut adalah ",(0,t.kt)("em",{parentName:"p"},"out of scope")," dan tidak ada yang berpindah ke block fungsi lainnya."),(0,t.kt)("p",null,"Secara garis besar seperti itu proses manajemen memory pada Rust yang menerapkan konsep ",(0,t.kt)("em",{parentName:"p"},"ownership"),"."),(0,t.kt)("h2",{id:"a346-transfer-ownership"},"A.34.6. Transfer ownership"),(0,t.kt)("p",null,"Di atas sudah dibahas bagaimana cara untuk transfer ownership data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),", yaitu cukup dengan statement assignment."),(0,t.kt)("p",null,"Berikut adalah contoh lain perihal transfer ownership. Data string yang owner awalnya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"msg1"),", berpindah ke ",(0,t.kt)("inlineCode",{parentName:"p"},"msg2"),", kemudian berpindah lagi ke ",(0,t.kt)("inlineCode",{parentName:"p"},"msg3"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let msg1 = String::from("hello");\nlet msg2 = msg1;\nlet msg3 = msg2;\nprintln!("{:?}", msg3);\n')),(0,t.kt)("p",null,"Coba modifikasi sedikit kode tersebut, dengan menambahkan deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"msg4")," yang nilai-nya didapat dari ",(0,t.kt)("inlineCode",{parentName:"p"},"msg2"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let msg1 = String::from("hello");\nlet msg2 = msg1;\nlet msg3 = msg2;\n\nlet msg4 = msg2;\nprintln!("{:?}", msg4);\n')),(0,t.kt)("p",null,"Hasilnya adalah error, karena ",(0,t.kt)("inlineCode",{parentName:"p"},"msg2")," sudah invalid."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(3760).Z,width:"792",height:"394"})),(0,t.kt)("p",null,"Jika ingin memindah datanya ke ",(0,t.kt)("inlineCode",{parentName:"p"},"msg4"),", maka gunakan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"let msg4 = msg3"),"."),(0,t.kt)("h3",{id:"-transfer-ownership-via-return-value"},"\u25c9 Transfer ownership via return value"),(0,t.kt)("p",null,"Transfer ownership data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics")," juga bisa dilakukan antar fungsi via return value. Sebagai contoh pada kode berikut, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," yang berada di dalam block expression berpindah ke luar scope yaitu ke block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," via operasi assignment ",(0,t.kt)("inlineCode",{parentName:"p"},"k = m"),". Kemudian berpindah lagi ke fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," via return value pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = do_something();\n println!("{:?}", msg);\n}\n \nfn do_something() -> String {\n let mut k = String::from("hello");\n\n {\n let m = String::from("hello world");\n k = m;\n }\n\n return k;\n}\n')),(0,t.kt)("h3",{id:"-transfer-ownership-via-parameterargument"},"\u25c9 Transfer ownership via parameter/argument"),(0,t.kt)("p",null,"Pemanggilan fungsi dengan menyisipkan argument juga menghasilkan proses transfer ownership untuk data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = String::from("hello rust");\n say_hello(msg);\n}\n \nfn say_hello(param: String) {\n println!("{:?}", param);\n}\n')),(0,t.kt)("p",null,"Pada kode di atas, data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"msg")," owner-nya berpindah ke parameter bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"param")," milik fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello"),"."),(0,t.kt)("p",null,"Ok, sampai di sini semoga cukup jelas ya tentang bagaimana proses transfer ownership terjadi pada data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics"),"."),(0,t.kt)("p",null,"Untuk data bertipe primitif (yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),") kita tidak perlu repot memikirkan di mana letak owner datanya, karena setiap operasi assignment, data akan di-copy dan hasilnya ada data baru dengan owner baru."),(0,t.kt)("p",null,"Tapi kalau dipikir-pikir justru lebih repot mengurus data yang ownernya berpindah saat assignment. Sebagai contoh, misal variabel digunakan di fungsi lain, kemudian digunakan lagi di scope asalnya. Repot juga kalau setiap saat harus dikembalikan lagi via return value."),(0,t.kt)("p",null,"Misalnya pada kasus berikut ini. Hasilnya pasti error, karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"msg")," di print setelah owner-nya berpindah ke fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = String::from("hello rust");\n say_hello(msg);\n println!("{:?}", msg);\n}\n \nfn say_hello(param: String) {\n println!("{:?}", param);\n}\n')),(0,t.kt)("p",null,"Lalu apa solusinya? apakah harus mengembalikannya via return value? Contohnya seperti kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut msg = String::from("hello rust"); // 1. awalnya data di sini\n msg = say_hello(msg); // 3. lalu dikembalikan lagi ke sini\n println!("{:?}", msg);\n}\n \nfn say_hello(param: String) -> String { // 2. kemudian berpindah ke sini\n println!("{:?}", param);\n param\n}\n')),(0,t.kt)("p",null,"Boleh-boleh saja sebenarnya pakai approach tersebut, tapi malah makin repot bukan?"),(0,t.kt)("p",null,"Ada lagi solusi lainnya yang bisa digunakan, yaitu dengan memanfaatkan method ",(0,t.kt)("inlineCode",{parentName:"p"},"clone")," untuk cloning data."),(0,t.kt)("h2",{id:"a347-clone-data"},"A.34.7. Clone data"),(0,t.kt)("p",null,"Semua tipe data yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics")," meng-implement trait ",(0,t.kt)("inlineCode",{parentName:"p"},"std::clone::Clone"),". Trait ini memiliki method bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"clone")," yang gunanya adalah menduplikasi atau clonging data. Cukup panggil saja method tersebut, maka data akan ter-cloning."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),".")),(0,t.kt)("p",null,"Kita akan terapkan pada kode sebelumnya, hasilnya kurang lebih seperti ini. Pada argument pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"say_hello")," disisipkan data cloning via statement ",(0,t.kt)("inlineCode",{parentName:"p"},"msg.clone()"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let msg = String::from("hello rust");\n say_hello(msg.clone());\n println!("{:?}", msg);\n}\n \nfn say_hello(param: String) {\n println!("{:?}", param);\n}\n')),(0,t.kt)("p",null,"Ok, dengan ini masalah untuk me-reuse data yang bisa berpindah ownernya dianggap beres. Memang beres, tapi apakah cara ini baik kalau dilihat dari sudut pandang memory management?"),(0,t.kt)("p",null,"Konsekuensi dari cloning data adalah terjadi proses alokasi lagi di memory. Data akan di-duplikasi dan dialokasikan ke alamat memory baru, jadinya kurang efisien. Ditambah lagi, jika kita mengacu ke penjelasan pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/basic-memory-management#a324-heap-memory"},"Memory Management \u279c Heap Memory"),", data ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," isinya disimpan di heap memory yang pengaksesannya lebih lambat dibanding pengaksesan data stack. Dari sini bisa disimpulkan bahwa cloning bukan solusi yang paling baik (kecuali terpaksa)."),(0,t.kt)("p",null,(0,t.kt)("strong",{parentName:"p"},"Solusi yang lebih baik adalah dengan melakukan operasi pinjam data dari owner aslinya tanpa perlu melakukan operasi perpindahan owner"),", yang pada Rust programming disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"borrowing"),"."),(0,t.kt)("p",null,"Kita sebenarnya sudah menerapkannya beberapa kali pada chapter yang lalu, tapi kita akan bahas lagi lebih detail (dari sudut pandang ownership) pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing"),"."),(0,t.kt)("h2",{id:"a348-ownership-pada-data-literal"},"A.34.8. Ownership pada data literal"),(0,t.kt)("p",null,"Kita akan bahas topik ini pada chapter berikutnya, yaitu chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/borrowing#a347-owner-dan-borrower-pada-literal"},"Borrowing"),"."),(0,t.kt)("h2",{id:"a349-move-semantics-pada-macro-println"},"A.34.9. ",(0,t.kt)("em",{parentName:"h2"},"Move semantics")," pada macro ",(0,t.kt)("inlineCode",{parentName:"h2"},"println")),(0,t.kt)("p",null,"Ada yang unik dengan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),". Silakan coba kode berikut agar terlihat keunikannya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let str1 = String::from("luwe");\n println!("{str1}");\n do_something(str1);\n \n let str2 = String::from("ngelak");\n do_something(str2);\n println!("{str2}");\n}\n\nfn do_something(str: String) {\n println!("{}", str);\n}\n')),(0,t.kt)("p",null,"Jika dijalankan ada error di statement terakhir fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),"."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Ownership",src:n(8255).Z,width:"883",height:"682"})),(0,t.kt)("p",null,"Seperti yang sudah dibahas, bahwa tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," mengadopsi move semantics. Ketika data bertipe ini digunakan pada operasi assignment seperti contohnya sebagai argument pemanggilan fungsi, maka owner berpindah."),(0,t.kt)("p",null,"Tapi entah kenapa, khusus dalam pemanggilan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", owner-nya tidak berpindah. Ajaib."),(0,t.kt)("p",null,"Silakan lihat sendiri di gambar di atas, ketika ",(0,t.kt)("inlineCode",{parentName:"p"},"str1")," digunakan pada macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", kemudian digunakan lagi pada argument pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),", hasilnya tidak error."),(0,t.kt)("p",null,"Akan tetapi ketika digunakan pada pemanggilan fungsi terlebih dahulu, jika digunakan lagi di statement di bawahnya hasilnya error."),(0,t.kt)("p",null,"Ini adalah keistimewaan dari macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," dan beberapa macro untuk keperluan printing lainnya."),(0,t.kt)("p",null,"Lebih jelasnya mengenai macro dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"),"."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/ownership"},"github.com/novalagung/dasarpemrogramanrust-example/../ownership")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html"},"https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/marker/trait.Copy.html"},"https://doc.rust-lang.org/std/marker/trait.Copy.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/ownership.html"},"https://doc.rust-lang.org/nomicon/ownership.html"))))}o.isMDXComponent=!0},1146:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU0AAABuCAIAAAAs3da/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMDlUMTY6MzE6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjA4OjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjA4OjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFmY2NhODNkLTEyMGUtM2E0OC04OWZkLTcxM2I1Y2ZiNDY4NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0NjE2MGJiNS05ZTE2LThhNDYtYjNlMi1lZjg5MTlhMTViNTkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0NjE2MGJiNS05ZTE2LThhNDYtYjNlMi1lZjg5MTlhMTViNTkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjQ2MTYwYmI1LTllMTYtOGE0Ni1iM2UyLWVmODkxOWExNWI1OTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2MTYwYmI1LTllMTYtOGE0Ni1iM2UyLWVmODkxOWExNWI1OSIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0wOVQxNjozMToxNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxZmNjYTgzZC0xMjBlLTNhNDgtODlmZC03MTNiNWNmYjQ2ODciIHN0RXZ0OndoZW49IjIwMjItMTItMjFUMTU6MDg6MTgrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz79GkH7AAAOVklEQVR42u1dPXLcOBfck0h2ptixrVSZ5cSBg1Gmcupy1VRtpoP4CDqF8z3UDv9A4KEf8EASHJLTXV99a3FA/DceAOI1/rkjCOLo+IdV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"},5572:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-2-b8db9994157f3e86c2a74d048ca45363.png"},5914:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-3-f9834609466195e2d46433bbc089153c.png"},3760:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-4-90c3dccbd5f0429a8760c9a445f446af.png"},8255:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/ownership-5-42080e6ebdac72f8d756dcf0dacb2061.png"}}]); \ No newline at end of file diff --git a/assets/js/8333ea4d.79e6ada8.js b/assets/js/8333ea4d.79e6ada8.js new file mode 100644 index 00000000..3f9e8750 --- /dev/null +++ b/assets/js/8333ea4d.79e6ada8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9323],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>s});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var u=n.createContext({}),A=function(e){var t=n.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=A(e.components);return n.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,l=e.originalType,u=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),b=A(a),s=i,c=b["".concat(u,".").concat(s)]||b[s]||k[s]||l;return a?n.createElement(c,r(r({ref:t},d),{},{components:a})):n.createElement(c,r({ref:t},d))}));function s(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var l=a.length,r=new Array(l);r[0]=b;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p.mdxType="string"==typeof e?e:i,r[1]=p;for(var A=2;A{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>A});var n=a(7462),i=(a(7294),a(3905));const l={sidebar_position:15,title:"A.15. Tipe Data \u279c Tuple",sidebar_label:"A.15. Tuple"},r=void 0,p={unversionedId:"basic/tuple",id:"basic/tuple",title:"A.15. Tipe Data \u279c Tuple",description:"Pada chapter ini kita akan membahas tentang tipe data kolektif bernama Tuple.",source:"@site/docs/basic/tuple.md",sourceDirName:"basic",slug:"/basic/tuple",permalink:"/basic/tuple",draft:!1,tags:[],version:"current",sidebarPosition:15,frontMatter:{sidebar_position:15,title:"A.15. Tipe Data \u279c Tuple",sidebar_label:"A.15. Tuple"},sidebar:"tutorialSidebar",previous:{title:"A.14. Slice (Basic)",permalink:"/basic/slice"},next:{title:"A.16. Vector",permalink:"/basic/vector"}},u={},A=[{value:"A.15.1. Tipe data tuple",id:"a151-tipe-data-tuple",level:2},{value:"A.15.2. Mutable tuple",id:"a152-mutable-tuple",level:2},{value:"A.15.3. Notasi deklarasi tuple",id:"a153-notasi-deklarasi-tuple",level:2},{value:"\u25c9 Type inference",id:"-type-inference",level:3},{value:"\u25c9 Manifest typing",id:"-manifest-typing",level:3},{value:"\u25c9 Packing tuple",id:"-packing-tuple",level:3},{value:"\u25c9 Unpacking tuple",id:"-unpacking-tuple",level:3},{value:"A.15.4. Tuple ()",id:"a154-tuple-",level:2},{value:"A.15.5. Tuple Structs",id:"a155-tuple-structs",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:A};function k(e){let{components:t,...l}=e;return(0,i.kt)("wrapper",(0,n.Z)({},d,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan membahas tentang tipe data kolektif bernama Tuple."),(0,i.kt)("h2",{id:"a151-tipe-data-tuple"},"A.15.1. Tipe data tuple"),(0,i.kt)("p",null,"Tuple merupakan tipe data yang isinya koleksi dari banyak data atau value, yang bisa jadi tiap value tersebut tipe datanya berbeda satu sama lain. Tuple biasa digunakan untuk menampung data yang ",(0,i.kt)("em",{parentName:"p"},"heterogeneous")," atau campuran."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tipe ini tidak diciptakan sebagai pengganti array."),(0,i.kt)("p",{parentName:"blockquote"},"Cukup mudah untuk mengidentifikasi kapan harus menggunakan tuple, contohnya: jika ada kebutuhan data harus bisa di-iterate, atau data memiliki pattern yg pasti seperti size-nya fixed, atau tipe datanya ",(0,i.kt)("em",{parentName:"p"},"homogeneous")," atau sejenis, ... maka baiknya gunakan tipe data array atau slice.")),(0,i.kt)("p",null,"Tuple dibuat dengan notasi penulisan diapit tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"(")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},")"),". Contoh deklarasi tuple:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_a = ("jason", 27, ["racing", "working out"], true);\nprintln!("tuple_a: {:?}", tuple_a);\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"tuple_a")," di atas bertipe data tuple, dengan tipe data spesifik per-elemennya bervariasi, ada string, numerik, array ",(0,i.kt)("inlineCode",{parentName:"p"},"[&str; 2]"),", dan boolean."),(0,i.kt)("p",null,"Untuk menampilkan nilai per-elemen, gunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},".N")," yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"N")," merupakan indeks elemen. Contohnya seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("index 0: {:?}", tuple_a.0);\nprintln!("index 1: {:?}", tuple_a.1);\nprintln!("index 2: {:?} {:?}", tuple_a.2[0], tuple_a.2[1]);\nprintln!("index 3: {:?}", tuple_a.3);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(5607).Z,width:"811",height:"433"})),(0,i.kt)("p",null,"Data pada ",(0,i.kt)("inlineCode",{parentName:"p"},"tuple_a")," indeks ke-2 bertipe slice, untuk mengakses tiap elemennya bisa menggunakan notasi pengaksesan indeks array/slice seperti biasa."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Tuple ",(0,i.kt)("inlineCode",{parentName:"li"},"tuple_a.2")," nilainya ",(0,i.kt)("inlineCode",{parentName:"li"},'["racing", "working out"]')),(0,i.kt)("li",{parentName:"ul"},"Tuple ",(0,i.kt)("inlineCode",{parentName:"li"},"tuple_a.2[0]")," nilainya ",(0,i.kt)("inlineCode",{parentName:"li"},'"racing"')),(0,i.kt)("li",{parentName:"ul"},"Tuple ",(0,i.kt)("inlineCode",{parentName:"li"},"tuple_a.2[1]")," nilainya ",(0,i.kt)("inlineCode",{parentName:"li"},'"working out"'))),(0,i.kt)("h2",{id:"a152-mutable-tuple"},"A.15.2. Mutable tuple"),(0,i.kt)("p",null,"Cara untuk membuat tuple menjadi data yang mutable adalah dengan menambahkan ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," pada saat deklarasi. Pada contoh berikut variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"tuple_b")," dideklarasikan sebagai mutable dengan teknik ",(0,i.kt)("em",{parentName:"p"},"manifest typing"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut tuple_b: (&str, i32, [&str; 2], bool) = ("default", 0, [""; 2], false);\ntuple_b.0 = "damian";\ntuple_b.1 = 18;\ntuple_b.2 = ["gaming", "adventuring"];\ntuple_b.3 = true;\n\nprintln!("tuple_b: {:?}", tuple_b);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(8923).Z,width:"460",height:"123"})),(0,i.kt)("h2",{id:"a153-notasi-deklarasi-tuple"},"A.15.3. Notasi deklarasi tuple"),(0,i.kt)("p",null,"Ada beberapa cara yang bisa digunakan dalam deklarasi tuple."),(0,i.kt)("h3",{id:"-type-inference"},"\u25c9 Type inference"),(0,i.kt)("p",null,"Cara pertama menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"type inference")," seperti yang sudah dipraktikkan pada contoh pertama."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_a = ("jason", 27, ["racing", "working out"], true);\n')),(0,i.kt)("h3",{id:"-manifest-typing"},"\u25c9 Manifest typing"),(0,i.kt)("p",null,"Bisa juga menggunakan teknik deklarasi ",(0,i.kt)("em",{parentName:"p"},"manifest typing"),", biasanya diterapkan pada pembuatan mutable tuple dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value")," adalah nilai kosong seperti empty string, 0, dan lainnya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_b: (&str, i32, [&str; 2], bool) = ("damian", 18, ["gaming", "adventuring"], true);\n')),(0,i.kt)("p",null,"Contoh lain:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut tuple_b: (&str, i32, [&str; 2], bool) = ("default", 0, [""; 2], false);\ntuple_b.0 = "damian";\ntuple_b.1 = 18;\ntuple_b.2 = ["gaming", "adventuring"];\ntuple_b.3 = true;\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(6333).Z,width:"464",height:"166"})),(0,i.kt)("h3",{id:"-packing-tuple"},"\u25c9 Packing tuple"),(0,i.kt)("p",null,"Adalah cara pembuatan tuple yang mana nilai elemenya bersumber dari variabel lain."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let name = "grayson";\nlet age = 29;\nlet hobbies = ["sleeping", "parkour"];\n\nlet tuple_c = (name, age, hobbies);\n\nprintln!("name : {:?}", tuple_c.0);\nprintln!("age : {:?}", tuple_c.1);\nprintln!("hobbies : {:?}", tuple_c.2);\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Istilah packing tuple bukan resmi dari official Rust. Istilah ini penulis buat sendiri.")),(0,i.kt)("h3",{id:"-unpacking-tuple"},"\u25c9 Unpacking tuple"),(0,i.kt)("p",null,"Unpacking tuple adalah kebalikan dari packing tuple. Data tuple didistribusikan ke banyak variabel dalam 1 baris deklarasi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_d = ("stephanie", 28, ["software engineering"], false);\nlet (name, age, hobbies, is_male) = tuple_d;\n\nprintln!("name : {:?}", name);\nprintln!("age : {:?}", age);\nprintln!("hobbies : {:?}", hobbies);\nprintln!("is_male : {:?}", is_male);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(3437).Z,width:"463",height:"166"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada bahasa lain teknik ini biasa disebut dengan destructuring assignment")),(0,i.kt)("h2",{id:"a154-tuple-"},"A.15.4. Tuple ",(0,i.kt)("inlineCode",{parentName:"h2"},"()")),(0,i.kt)("p",null,"Tuple bisa didefinisikan dengan tanpa isi dengan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"()"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_d = ();\nprintln!("{:?}", tuple_d);\n')),(0,i.kt)("h2",{id:"a155-tuple-structs"},"A.15.5. Tuple Structs"),(0,i.kt)("p",null,"Pembahasan mengenai tuple structs dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/struct#a247-tuple-struct"},"Struct"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tuple"},"github.com/novalagung/dasarpemrogramanrust-example/../tuple")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.tuple.html"},"https://doc.rust-lang.org/std/primitive.tuple.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/primitives/tuples.html"},"https://doc.rust-lang.org/rust-by-example/primitives/tuples.html"))))}k.isMDXComponent=!0},5607:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/tuple-1-3234f50043ed15a37da7ad04884b7f8d.png"},8923:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcwAAAB7CAIAAAB2ASeoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDRUMTc6MjM6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE3OjU5OjIxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE3OjU5OjIxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU2NTNhMjkyLTFjNjctMmI0OS1hMzk1LTZiNzBiM2Y3M2Q1YyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDplNjUzYTI5Mi0xYzY3LTJiNDktYTM5NS02YjcwYjNmNzNkNWMiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplNjUzYTI5Mi0xYzY3LTJiNDktYTM5NS02YjcwYjNmNzNkNWMiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmU2NTNhMjkyLTFjNjctMmI0OS1hMzk1LTZiNzBiM2Y3M2Q1YyIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0wNFQxNzoyMzoyOSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkXrqEoAAB0dSURBVHic7Z1PbNtIloefpFXijAYeBfLYQhAw1hrQxAP3bDPrgVergxq+aHLwhQggwEAOvuWus08+6943HwIEENDQxYfAF6N1EIxgg+EAnd00hM0qEYJA7bYQrbfV7USwtQeS4r9XZFEiJdp538U2XaxX9ar4WFUs/hgRBAEIgiCIYIjOugAEQRDXGQqyBEEQAUJBliAIIkAoyBIEQQQIBVmCIIgAoSBLEAQRIBRkCYIgAoSCLEEQRIBQkCUIgggQCrIEQRABQkGWIAgiQCjIEgRBBAgFWYIgiAChIEsQBBEg4wZZsViSCgIAgFCQSkXRxyKNDASQ6wToNR4HD14az9BkxQsEc5HEYqnkWkTuWkzY64SChBhytR5CJxMQ+ob7p3FOEgpSNtE5Pmz7XRoD8uuOlJMK3Vrd0YpYLGWTo796zeqhbD+uH3Y8e9A5drAmv+5k1jMCtE0pxGIpc+50mndwQwAgFKRcOu5cSh/AXRdARRHQuptbSWmm6Vknwoa9K4a84cYIskJhPQ2d44AvN2jXa6liab0gtN0saYFAKEi5UhGqh13lJlDlKqLx7JxUAGYcabe667lVEdpovPYRhiEhk4JOs5PKBNmbBC+u84R8WOVwHKPutjtLMKOSqTUx4S/hbjjvQVZcxULsaLQxGvoo4y4AMF4ihoNoSvOYU37dyXhwXbveWi1lF0GYT8UH3ZbHMKEE9ezInFgsZZOm8rTrrdVSpiDIrhEIrTu4eEk/iBoSMql4vyW3wHjPNp4Ogw7DulgsLZ53Eul0fNBpdlNZ9nBYyNhdZ8guVyrltJJ2C1JurmWohvoHUiT9kMmfhhGqXh5+J6P+RPNED1oyUXLAPc/lZGtKpwtBGYu9hHXlH71m9VAWCtI6vGzN5dg9RDnGaM0UkieHQ7R/nK2ip/P3JXs18Rox6u7al7Q+h3RFmXXJTLnhDqtVwPAcZMXF5KB7bLkAktlM57habYNYLGWLonwoC4VVeFmtttWyKgNSobCe7lun7mIxpx0UCpYVgnaru55bFAE83aDare56Ou04KsXpng8gNS8AsM6ST3pZ94EkVncA3EuIQ3BDQiYV77VkaIv9nPYfg+tALJYyLOtnAMn0XLPaXCxls8pPRi0w17XrtTYyR8PHkmiRlByEgpSbMzhJHzILBSmXK4ptxQ98Tsb82cXyxA/q5S2ZR+4267xOZnRvNCUAxNO5XK9ZrcpCQcplCiC3AOLpnLWHIFcHozXPsDxRJ4tFbfQgFKRcut+s1dsgrlpPF+Q6cPclyKB9flSjUZasuiMg/sS7YlgajtVRvT74EuYT0D+zdv9eU62yfNKD5KII0K4fak5ot7qD+FxKTZpcND+uEBeTvaZavXa91YunMobLt33Wh8Q859xQLGaTg85rgHa9Vj3uQDpX4njWYqB91tf/kA+rVVv4k193IL3q8sCFVXe7lwDsDsENCZlUvHciKycrPhIKGd11btYHndey8Se77OO5Ti0lXiQEcTUd77XUgrbrLzsD3Q+Ik+NKgUqlUkl/3mXxJ5onflAlo0RY8+Vqtu7JyYC0JjPloHN8KI+OIjVKzKNXh3Iu3pqWPPG6i4tJULoStFvdgeH6Mp+e8tKX3Pq8e91x8KsDJRQNh+J1JJuaizv+v3s+gDkAy1AdoKeUu5YqlrKlUlafUswnIKkcGdXBkl92LsUeWwKAfr5xLqiMnpT7d6mYYjz5MiPMJwDOHZNwja2xupvQvIQ4BDekjWMB9Fs2fvvnsO7GOK4bg8F5l/Efu5NdnvaNeh2aJ8NQPJ1OwqBjW1Yau4nx1mQ0h74oo7nbVr45EMD56rBgzVMsYnXvng8grdTPvDpkK5KXvuSl17nXXfsn6+rA04ek4Wx4DbKj7swgNRcfnMsgFnNp0GZhxnmi9vhDLJZyUgFqLXB4+K/lx7oYVZzOb9dfZqSc4xrACCGTiiPDdGuGbmuGzLrrGGpldYhhlq4bEjKpOMSNV9sgwwiyHNY58eK6cYgbbp6We7enhVlQ/Qkwh+fJMDToHL+EdcM6Bb917u5dT43fHAPldm/r3WKROwuk7iK0z/q5tBa6B05PsHn7Ur0tFks+9TozzKsDJSQNZ8PrcoHz/F0oZJKDrnr1q+FKKKyn7aPf7vlAya/VHSSzzB2P+OqEF7giJ4Di/7hhgiEWjVNTA6P5ugOOdVe9ZC6S5hDUUGouPugcVzWOO4N4CtpnfW2SIxQk44MMR+v8mFzXPR/Ya632BLGo3vLZRULqBsmMuhwhFDJJy8yXx8mjcqq9DssTP6jRrteavWTWtiyiWx/TyabW9N4cYjGbHHRbbleHG6iTlXm01pVch4f8hZ+w11n7kgmTP9GuqDDrhsPx/OBLPulls9Yn/rYJe/t1J5NTD/Y6nUF6Dqzj715TuUvUa1CQcqNBmmleYJwl82N5duo00LWUnW/nkmXTQzytPelUS4/V3Wqppj2LsDvEbihledjYbnXX01KhW2v21ElOr3ncyayPzsGsc8F2nTKuVWvaa1YPZf3AoNPsDLJzACAfNhdtRTJWM1sqZZXTD6tQLBmeETPqrjjZ5mPUn20sT/SgfoXKh8fzUi5XkjLG+ahuHa0R6mS0NdELgYl94Qu5Os6ccjCDOrndWi2ZJkXMmThvXyoIk/U6Y+fS+xLz6rB3RUuRZ9VwVcbugoggeN1yKBSkXKob+L50mNYG+HGYWsnC64LgmW3dp23dtI1penamdzVPi/A13BgvIyg3Ep63BCZiGq+VjQ3fzvqrZCiEzLbu19Xz5uVv7tW0q0P4Gm6s12r5X8YaH3E13bfNIQmCmAzDNBoAXFfTiMkZY7mAIAiC4MXr7gKCIAjCAxRkCYIgAoSCLEEQRIDE/vCHP8y6DJOzENn+Kvan+PC/esrfkUcbsa/vRr+6G/1qfvjDqUPK2SIUpL/921/W1tbW7t74zzdOb0xePcRi6d/v/t/rd/8b+EkjhIL0t/tzXI4cz9BkxQsEc5HEYqmw/qcF5yJy18KDP1mn/+ui1ZCr9RA6eULG2l0wCd98HbtzU/n18scXw7/7l/ONW6Nfh9+9uACIPNqI3nBJOTmTbMvD5KkmhykdiSEWS9mk+5vhnvI0778jZXQEUkYPqcB2EEw3yH7zdezOzVFsjXyzDPDWj3xPh89OL3xOeVUxKLyJxVLW6eMSYrGUhU5nACn8/+PkCQCIrDspo5uMkDJ6aAW2g2CKQfbecvTOTfj4ZjR6HX7/FgAAFiLbK9ra8NnFs9eRhxtROLu8PR+FT5cfPkXvzAOcXTz7ObK9Evnw0/DOUhQA4NNl4x/Dd8bh6tnFs9fABku5gOZpLhIAY9DtRc26y5BkRuEbNorFUhb0f4vFUhaqx+eZ5KBzrOp1ve5kcilWuBCLmfPjah0KUppZErU43HkqGaOy7gBAyugjI6SMfg2V0Vmv1U4xyKZuRQCGv/1qProQ2V6Jfv7p4ru3yu+xR8uXfYDbN6Hxw+Vfv4ou9C4av0XzSwA/A0DkztLwxxcXf4fIo43oX5cv3r11WRkwwEqp5bkQ2V6J/nnh4t1p5JFWpHvL0fwSfPgBXdbwpGaNSjKj6ZxUzI3IJ71sVhdDnE9ArwWpRf36VbU2WEqR8mHNqbg6qTnuPAEYsu46pIxOyughENgORhkdZ4q7C+ZvIgcf/DEKcPk/bwEA4HT44RPcSAIAfO4N3/0KAMPTE1P60UC4D3AjGbnnR8EMg2tI/B5gAW5odt/9MvTDgoJFkpkR3ZxVzI3Ir3WpayGTAl3HSihIpVIpC81q08GSN3jzdBNOI2V0UkYPh8B2AMroOFMcyZ59gju2OItGXg6Gv32C25OWiMEpfF6J3PodwK/qPeDsV/eTvBJnDAbdVMyN6CrFQiYF3ZdtgJThVgsAQkGC/snkS38e8nSTdSdldMU0KaOHQWA7KGV0E1MMst3fhjCvBi8GkVs3AT7xZBa5dRPgbPjOv+JZuL0S214BMI9zfcSpYbhfJ9e6qjCvxljong9g0D3WTufRPHfFW54usu6kjG6pKSmjM+xdTWV0jCkuF7x7O/wIcHsl8kA9EHm4DN+/vwSI/vMyAAAswG2Aj+/ds7q3HLkN8PHnQMp5bzlyAy5/fHHx7MXFsxcXz0+dk3OpWZtQJZnxVvGm09xudQeJeTGT6qsTlnarO4in15UpqFkdXJnv88xOLSkd8sSK5CTrTsrotnKSMvo1UkbHmeoWruHzF5cPN6L3N+A+KI/yAWDY+P0wvxTbXgIA+Pjm4vlp5OEKMwvDAPPi+al5G8B8bHsDPv908d0v1oPa5gR7SsTEu7fDPy9phQSDLRw+NWsAF9FuXc3aScUcsd5aLWXTvWZ9dKAGBa08jucaradzpVKOmZo/TwBc1p2U0Q2QMrrV+jVRRvdRtHtWLES2V6KO8c4fHqzG7s/re7a++Tp2B7StXWMzLUnmUOCTEDQpo08BUkYPnqm/8RV+zM/i+JeJCQ2fZN1JGX0KkDJ68ExxTfaq8P0/Lj9C9P5GbHsjtr0Rvf1p4mHsl0e7Xmv2tWVcgviiuULLBQRBEFcPGskSBEEECAVZgiCIAKEgSxAEESBhFu3mF9jmSbkQ2f4qdvfT8L89vSPrQeTbR7FhsVgqrK+tra2tuQkwBwOX9rPHlC65+K7T7JjnhHLUIwvcdedqUT3R1dBwd282sVj6l3neqvjTl0LI7LdwWWSxhh9+uPzeEAf5BbZ9leKeOYHLRgPArHdJfjGIRYugI46yoYnrvdDZ7yE26rIzkV93HHTkfIRXVN4qcmBMG5he++yDLAAwpGBJintW8G9f/DI2OuJw112RobxWfrLrsuMoei58W6bH70ueROUZUVQorKf7vV4yMV4RnAhJkLXCL7DNEO02vm5r3Oj6+8ijlegN00E9B1XWFuyi3WzcxIZHGsA2gW1eFRgtQ24hcLt8MqJV3MVVomVE+5khYAyISrRloGD6IoJtoIG6zskDHG+R8TWHikWOGnWyjH6ZpZVB687QZUeEyZwlrjlraGo4buFqQGtUb1u9xDaE6rKjWtoAthekXSrF40/byd5E5fE81tPQOT6Zy2Xca+SVkAZZfoFtNKWuum3h9hJY9bk3ojeU6LwQ2V6JPfzl4jlYdMQdoi0qNoypbiMC236MbEYKxIqCsCDXgSGfbNUqrh6iKtGMz45hAsZ1JKWqKKd4obR4okVpRIYcdd2EcDcHACZHzchTm+oLBSmX7itqpG3042zW5uhq0Q1UQYHRDY6hpc0BQ96bV7hakOsprEaYl3BDgOmyM5XRgUvWkPGxO3v3xiKnR1F5hNG4PFXM8dTIIyHZXTCvvF4V294YaXThWAW22dxYQrKynH5vOXIDhh+UUe4pfAS4/UezjrgjuNgwqrrNFtieDE2BWNMqZssn80mGM+CVox4hFrOgOQETReZXnuaHuzmUf1jlqBkVWUyCIuQN7VZ34OI5S3O067VqtVpt9gB6TUXc61B21NIeH07h6jZeI36peGDqsjNr4SjM5oi1ezvALVSva5Nrylviaho6L5EA7ke7QGhGsi6f5/LK8D9+GuaXjHJf+HuxqVsRALjzVWzbcHBcHXEVhuo2IrAdEDwCsm4KmBMiFrPQ1BbYvMiQ2zHN/9OcQmDG8zmsO0ngds8HkFaGYdi3ucZkcpFfO9zC1UiNhIyXNkKWPxyU0QGgez7IBtrjuEXlDVMtoSDlSkWoniyiD/Cca+SJkARZv3n39vLdWwD1+7jRPy9coEG2+9sQ5sGyn+Gbryc2j63g2AW2A8JBp3lEEBf5CFOIVbA5RChwZqZdFZMoe9mbwzzOUeWocftn/Vxaiz8Djkc9XPC0kTf4dcSxGgngZdkRvykxldF90o53LM4YQvXtVnc9PQfiYhLioIs8AuRKpdVm9VB2qpEnQrJcEBitntNHut69HX6GyB3zl8JavSFAdGkBACIPHR9/oWLDTA1gm8C2RxyFwDUc5ZNBOd8gGY6qRE+EUJD0hQIAYDiEX3maH2/NYSixIkcNAHYnK0sQmpC3P3t73LS0eUAbjku4Gq0R20uYIefpv10Z3e2zbxMynlC9UFhPx3snsnxY1Wn2YNA5tn52DtF690Q4R7K4FDd/StPTqs8/KfLeqKXhd28ut1di2xvq3x/fXDx/e5lJxu6sxLZX4OOby48rUeauDlRsuM1S3bYJbPPTZgmBI0ViyCfbtYrN+do2HYy0n08QM6aH0bpKdFe5vvWJJ1OGHHXdhPA3B6AOQZystJnxkzTmjRXGunsop7OWNgd2eW9e4Wq8Rg6d1moIEF12R2V047fTcPC+5MEZ4wjVO+vHu2m9e4FUuMKI31vNvyjJcF+xeM4nOXIvJgPOfswaeTiNXni57ssFBDEJ5gVTrq9Ahhx/atSuv+wAh2Cw8l4Y9uT+CyKcywWE9sGl6bxdS7AwrEAAwISb0t3Q3xHoBWXCvxpxvcslrqb7E820rwW0XEAQBBEgtFxAEAQRIBRkCYIgAoSCLEEQRICEWbQ7CDyIcPOgyCyHSmLZVUk5UDXrIOS3hYL0t3/7y6y0rEPYxMTVIpQj2XvLUU0vJra9EXu07HP+/sl7y4fV6nEnkS1ZXpYRi/hrJr5jNyS/7oC/L3F5gWV9EocoMivHncleuxkXVhMTBCch3sL18c3F81N4sBq7vxR7+MvF81M/Mg1A3tugOREK2q3uupt+53W1HhBha2LiShHiIKvw958v789HAdQ3aJXIq/yuvUFrU/Lml/fGU9plZC9/fKFrJDoSAk3ldr21WrKqb05JzbretlpnlLPrRYbczdMuez1tKYWClEuDtgVZLJZMAqtceRIEL6EPsg/+GAUY/vYrwO9YSWxK3uhBXN4bTalrft9bjuaX4MMPnBEWwqGpDPJJL5sxqsNPT83aZp3hENbSgVVcXGZEOlQInDulImO3XhDaBnd7yJMg+AnlmqzC7ZXY9kbs/s3LxguTFKEdVMmbX97bmnIBbsDw9AQA4N0vTiJeXpiipjIoS6PpVW0Rcdpq1mbrHuETF+d3CCOlfHjcgfRqweAar04mCC5CPJL9+Eb9Esxfly8UcdgpcQqfVyK3fgfwq/qVhDNPXxFnMD1NZQCeT34EqWbN8cERPlji4vxC4OyUir5Uuq9J304mLk4QLEIcZAEATocf7sKdpciDt/wTdn+4vRLbXgEwj3PHZ5qayko22MKslcDUrLmsc+CkvszvEDylWMylus1OyvhxU1qIJfwnxMsFCgYJbQB14u+ipT0h95YjN+DyxxcXz15cPHsx3q6GmWoqq8gn2oR3FmrWunV2OR1lyE3i4lYcCm/RaWalFIvZZK9Vl3U1KXeHEMQ4hFIg5t5yNL8UUTcSKI+qPl02/jFMrcbuzwMAfHxzCSvRhKbPjW05wA8arTBTvo083IjeNqTUSuIFh80AvU4nkZ5rVQ9l/FOg2DN72/aA0VkOD8SxjQC95vF5Zh1eMvIE3MooofJRcK3wWDkx62g5kTy7mHXrZ8aR3Rr2oppKY0t5tjraT6A53LaFY+IvOxGEQiiD7Gx5sBq7P6/v2frm69gdYH6K0Xf8VYkOTjCZp5yerZO4OHENCfma7Cwwf602cusmwKfpWfdXJVr7FJz/8JQzOOsEcXWgkSyCebmA/UXxYDBPw8P7KCaActJIlriGUJAlCIIIkNDvLiAIgrjKUJAlCIIIEAqyBEEQAUJBliAIIkAoyBIEQQQIBVmCIIgAoSBLEAQRIBRkCYIgAoSCLEEQRIBQkCUIgggQCrIEQRABQkGWIAgiQCjIEgRBBMhUg2x+92lNobIz3tnjnGdnp1J7upsf/V57uptXyoZkb0zr0UZtvDNdizQTdipq0/G7biJTM3HdWKeP20OCwHfX6c0elo4IO5XwlIUPz0F2ki7V2HssSVJF7o93uj/kd59uLcrf7jVmWYigsV9s+tUy9vXSlyuSJEmPr7frZkmY4rXCflma6JINoEb7NXlxK2RucuZLWy7I7z4RwRhim70+nLxvQOP9CfR7Td8M7ZfHjkcTFmmnUqut9UyXRX736RYcSAoHrcyWL0OB6+e6oGo0NWbnuinS2Ht8cCI+uTph1oNod373aVlMmA61DqRyc/dpOXkklfe1NMkjqdzcffoEvj1KlrcyWrp9Yz6jEywZmxIi9pNHB7Blz3OnUtvKOJ0LesLNXsW9F5rq2peVMwwHlUM7ldpaT14UxURfPmhmt8REX6483oNROlu9TadD3sFL47JTeXq3ppQh29Rqaqq2zf+c+fJ5TmkL/U+lqpO4juUl1JCnOnFibzhAesh7qbYFegvuVLQ/7d0bqVHTw8W1r7TFt/BEOaVlMeO/68bpMoxwgRY+j1bTKTKM14lnhIeRrDLZP2hp00ZJcqxjQixv9iruQ6edSlk8UUZZFdd5QGaLK0+mrbVMv3nEESdGRZIO1E9iQ35Xgm8ltZyg3UgzYvJIOmglxC3lZ3Yzj6+K4KfrXqrI/cymDzfn/TJyvey/aiXEcmUHlKF8ovUqqM65U9nKtA5GU8zWgXIzmch1qJdQQ0GAFh7pIfuvWpBZ07pk/u4itF7tM7u3tUYeLy5IiOVy8sjokbC5zqFGlsKzcnCKDI2jZl/3dsgJcLlg1Hj7r1qweJcRP3bWMq0D1fuNvSPlWuPLU3fyftmtUwKA0vNP3ruPYjf1Iuk09spaX2wcNfuJZBYAoC/X9o0/meCn6zUyHfSd/bIkHcBWrVYrZ5uV4AYAO2sZUCN446jZV5t9QtcB4iXcUBAghcd7yH5NHl33+c0syLV9tHszauSRvlwp7/OcP0PXMTEXnpHIOTI03p/MouRjMa2v1SaSWQAkvOXvLkJmq1bbGh3p831Fr9nrQ9JjIbLJhHsiJpb5T8shaQCnT8ZOpba1KFckqbFTqZVrTzcDmlo3e30Q13YA9iG/mU1o0wb/684wFATchW8cNZ+U13YA9vObWWh+25ige7uhV7ix99hb1afoOga2wmOx0s11zV5/ixFUwsa0gqzTUvpYa5HZZMLz8vw4gVljp1IWQa5Iew1QV4Smefpk5Hc3M325stcAgP2yBJXalrQDjQCGs433J2VRuzQ0k0HUHTUUBF4Kr0XZ/F01xgIA1r1nO/6amusmxykyjBMAZoTn5YJmr2+f0avj9p2KdalbObrFXgltHDX7Y6yu5nc3jXnuVLg2JvFNMRrvT7SViPzuU+MDAnWpIb/7BKmmOxOerm4zHnPzij6l3FnL6Pe8ifJESriprvZZ93pNWnduQ6z0k1TTWnhmD2kcNfuLd3c2sydHSpE8dm/vF5d3vLqOkQmnP9EaoVir6eI6vqW/cOB5JNvY+3bzablcq5VBvdPoB/rygdzfSqopR2N95Ok8bNVqW+rpj2H3aXk0LXB+0mnL0xv7r1pb7oO4/fLBWk0x1DqoyJtPAAD2a/JmWbXekuW+mMRPNj1JN1ST83QnGkfNJ6LIWnhRMVoXy7VauS9XHu89zlZqo6mX0XdcefKXcO9IqhmneH258nhvQtdhoxXcELsG41cTLTzaQ/Ryia2DvdEBpHuzi8l9cdkIzHV4QXn9aa+RSyq9mqjrNGv5zWyidXQl9hZ42sLlhdDusMibtjZdNdSlVV9Lz5kn1xYuS7MH52zvhoJw3ZVknDZCLufZ+pN7Q2EomNaabFhQ7plPdvONK9JAGsrWRn83g/qep/nJYn4zmwhoSufJUBCuu7pM3kaz9qfyzmalfGUaM4QjWctOaQ1ftuqPLFyh+2A40FvF8eoyN56PbTYzQ9cPL67T04bGxTuV2tqrkJSFj4CCLEEQBAHw5WkXEARBTBUKsgRBEAFCQZYgCCJAKMgSBEEECAVZgiCIAKEgSxAEESAUZAmCIAKEgixBEESAUJAlCIIIEAqyBEEQAUJBliAIIkAoyBIEQQQIBVmCIIgAoSBLEAQRIBRkCYIgAoSCLEEQRID8P2Gd6E6R7f/SAAAAAElFTkSuQmCC"},6333:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/tuple-3-3378d68b3ca9526a7b5cb148b01c8450.png"},3437:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAACmCAIAAAAzlpNaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDRUMTc6MzY6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE4OjAxOjQ4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE4OjAxOjQ4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFlN2IzMzUzLWUyZGIt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"}}]); \ No newline at end of file diff --git a/assets/js/8333ea4d.d3688653.js b/assets/js/8333ea4d.d3688653.js deleted file mode 100644 index 4280226b..00000000 --- a/assets/js/8333ea4d.d3688653.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9323],{3905:(e,t,a)=>{a.d(t,{Zo:()=>d,kt:()=>s});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function r(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var u=n.createContext({}),A=function(e){var t=n.useContext(u),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},d=function(e){var t=A(e.components);return n.createElement(u.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},b=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,l=e.originalType,u=e.parentName,d=p(e,["components","mdxType","originalType","parentName"]),b=A(a),s=i,c=b["".concat(u,".").concat(s)]||b[s]||k[s]||l;return a?n.createElement(c,r(r({ref:t},d),{},{components:a})):n.createElement(c,r({ref:t},d))}));function s(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var l=a.length,r=new Array(l);r[0]=b;var p={};for(var u in t)hasOwnProperty.call(t,u)&&(p[u]=t[u]);p.originalType=e,p.mdxType="string"==typeof e?e:i,r[1]=p;for(var A=2;A{a.r(t),a.d(t,{assets:()=>u,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>A});var n=a(7462),i=(a(7294),a(3905));const l={sidebar_position:15,title:"A.15. Tipe Data \u279c Tuple",sidebar_label:"A.15. Tuple"},r=void 0,p={unversionedId:"basic/tuple",id:"basic/tuple",title:"A.15. Tipe Data \u279c Tuple",description:"Pada chapter ini kita akan membahas tentang tipe data kolektif bernama Tuple.",source:"@site/docs/basic/tuple.md",sourceDirName:"basic",slug:"/basic/tuple",permalink:"/basic/tuple",draft:!1,tags:[],version:"current",sidebarPosition:15,frontMatter:{sidebar_position:15,title:"A.15. Tipe Data \u279c Tuple",sidebar_label:"A.15. Tuple"},sidebar:"tutorialSidebar",previous:{title:"A.14. Slice (Basic)",permalink:"/basic/slice"},next:{title:"A.16. Vector",permalink:"/basic/vector"}},u={},A=[{value:"A.15.1. Tipe data tuple",id:"a151-tipe-data-tuple",level:2},{value:"A.15.2. Mutable tuple",id:"a152-mutable-tuple",level:2},{value:"A.15.3. Notasi deklarasi tuple",id:"a153-notasi-deklarasi-tuple",level:2},{value:"\u25c9 Type inference",id:"-type-inference",level:3},{value:"\u25c9 Manifest typing",id:"-manifest-typing",level:3},{value:"\u25c9 Packing tuple",id:"-packing-tuple",level:3},{value:"\u25c9 Unpacking tuple",id:"-unpacking-tuple",level:3},{value:"A.15.4. Tuple ()",id:"a154-tuple-",level:2},{value:"A.15.5. Tuple Structs",id:"a155-tuple-structs",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:A};function k(e){let{components:t,...l}=e;return(0,i.kt)("wrapper",(0,n.Z)({},d,l,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan membahas tentang tipe data kolektif bernama Tuple."),(0,i.kt)("h2",{id:"a151-tipe-data-tuple"},"A.15.1. Tipe data tuple"),(0,i.kt)("p",null,"Tuple merupakan tipe data yang isinya koleksi dari banyak data atau value, yang bisa jadi tiap value tersebut tipe datanya berbeda satu sama lain. Tuple biasa digunakan untuk menampung data yang ",(0,i.kt)("em",{parentName:"p"},"heterogeneous")," atau campuran."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tipe ini tidak diciptakan sebagai pengganti array."),(0,i.kt)("p",{parentName:"blockquote"},"Cukup mudah untuk mengidentifikasi kapan harus menggunakan tuple, contohnya: jika ada kebutuhan data harus bisa di-iterate, atau data memiliki pattern yg pasti seperti size-nya fixed, atau tipe datanya ",(0,i.kt)("em",{parentName:"p"},"homogeneous")," atau sejenis, ... maka baiknya gunakan tipe data array atau slice.")),(0,i.kt)("p",null,"Tuple dibuat dengan notasi penulisan diapit tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"(")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},")"),". Contoh deklarasi tuple:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_a = ("jason", 27, ["racing", "working out"], true);\nprintln!("tuple_a: {:?}", tuple_a);\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"tuple_a")," di atas bertipe data tuple, dengan tipe data spesifik per-elemennya bervariasi, ada string, numerik, array ",(0,i.kt)("inlineCode",{parentName:"p"},"[&str; 2]"),", dan boolean."),(0,i.kt)("p",null,"Untuk menampilkan nilai per-elemen, gunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},".N")," dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"N")," merupakan indeks elemen. Contohnya seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("index 0: {:?}", tuple_a.0);\nprintln!("index 1: {:?}", tuple_a.1);\nprintln!("index 2: {:?} {:?}", tuple_a.2[0], tuple_a.2[1]);\nprintln!("index 3: {:?}", tuple_a.3);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(5607).Z,width:"811",height:"433"})),(0,i.kt)("p",null,"Data pada ",(0,i.kt)("inlineCode",{parentName:"p"},"tuple_a")," indeks ke-2 bertipe slice, untuk mengakses tiap elemennya bisa menggunakan notasi pengaksesan indeks array/slice seperti biasa."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Tuple ",(0,i.kt)("inlineCode",{parentName:"li"},"tuple_a.2")," nilainya ",(0,i.kt)("inlineCode",{parentName:"li"},'["racing", "working out"]')),(0,i.kt)("li",{parentName:"ul"},"Tuple ",(0,i.kt)("inlineCode",{parentName:"li"},"tuple_a.2[0]")," nilainya ",(0,i.kt)("inlineCode",{parentName:"li"},'"racing"')),(0,i.kt)("li",{parentName:"ul"},"Tuple ",(0,i.kt)("inlineCode",{parentName:"li"},"tuple_a.2[1]")," nilainya ",(0,i.kt)("inlineCode",{parentName:"li"},'"working out"'))),(0,i.kt)("h2",{id:"a152-mutable-tuple"},"A.15.2. Mutable tuple"),(0,i.kt)("p",null,"Cara untuk membuat tuple menjadi data yang mutable adalah dengan menambahkan ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," pada saat deklarasi. Pada contoh berikut variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"tuple_b")," dideklarasikan sebagai mutable dengan teknik ",(0,i.kt)("em",{parentName:"p"},"manifest typing"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut tuple_b: (&str, i32, [&str; 2], bool) = ("default", 0, [""; 2], false);\ntuple_b.0 = "damian";\ntuple_b.1 = 18;\ntuple_b.2 = ["gaming", "adventuring"];\ntuple_b.3 = true;\n\nprintln!("tuple_b: {:?}", tuple_b);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(8923).Z,width:"460",height:"123"})),(0,i.kt)("h2",{id:"a153-notasi-deklarasi-tuple"},"A.15.3. Notasi deklarasi tuple"),(0,i.kt)("p",null,"Ada beberapa cara yang bisa digunakan dalam deklarasi tuple."),(0,i.kt)("h3",{id:"-type-inference"},"\u25c9 Type inference"),(0,i.kt)("p",null,"Cara pertama menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"type inference")," seperti yang sudah dipraktikkan pada contoh pertama."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_a = ("jason", 27, ["racing", "working out"], true);\n')),(0,i.kt)("h3",{id:"-manifest-typing"},"\u25c9 Manifest typing"),(0,i.kt)("p",null,"Bisa juga menggunakan teknik deklarasi ",(0,i.kt)("em",{parentName:"p"},"manifest typing"),", biasanya diterapkan pada pembuatan mutable tuple dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value")," adalah nilai kosong seperti empty string, 0, dan lainnya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_b: (&str, i32, [&str; 2], bool) = ("damian", 18, ["gaming", "adventuring"], true);\n')),(0,i.kt)("p",null,"Contoh lain:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut tuple_b: (&str, i32, [&str; 2], bool) = ("default", 0, [""; 2], false);\ntuple_b.0 = "damian";\ntuple_b.1 = 18;\ntuple_b.2 = ["gaming", "adventuring"];\ntuple_b.3 = true;\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(6333).Z,width:"464",height:"166"})),(0,i.kt)("h3",{id:"-packing-tuple"},"\u25c9 Packing tuple"),(0,i.kt)("p",null,"Adalah cara pembuatan tuple yang dimana nilai elemenya bersumber dari variabel lain."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let name = "grayson";\nlet age = 29;\nlet hobbies = ["sleeping", "parkour"];\n\nlet tuple_c = (name, age, hobbies);\n\nprintln!("name : {:?}", tuple_c.0);\nprintln!("age : {:?}", tuple_c.1);\nprintln!("hobbies : {:?}", tuple_c.2);\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Istilah packing tuple bukan resmi dari official Rust. Istilah ini penulis buat sendiri.")),(0,i.kt)("h3",{id:"-unpacking-tuple"},"\u25c9 Unpacking tuple"),(0,i.kt)("p",null,"Unpacking tuple adalah kebalikan dari packing tuple. Data tuple didistribusikan ke banyak variabel dalam 1 baris deklarasi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_d = ("stephanie", 28, ["software engineering"], false);\nlet (name, age, hobbies, is_male) = tuple_d;\n\nprintln!("name : {:?}", name);\nprintln!("age : {:?}", age);\nprintln!("hobbies : {:?}", hobbies);\nprintln!("is_male : {:?}", is_male);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"tuple",src:a(3437).Z,width:"463",height:"166"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada bahasa lain teknik ini biasa disebut dengan destructuring assignment")),(0,i.kt)("h2",{id:"a154-tuple-"},"A.15.4. Tuple ",(0,i.kt)("inlineCode",{parentName:"h2"},"()")),(0,i.kt)("p",null,"Tuple bisa didefinisikan dengan tanpa isi dengan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"()"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let tuple_d = ();\nprintln!("{:?}", tuple_d);\n')),(0,i.kt)("h2",{id:"a155-tuple-structs"},"A.15.5. Tuple Structs"),(0,i.kt)("p",null,"Pembahasan mengenai tuple structs dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/struct#a247-tuple-struct"},"Struct"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tuple"},"github.com/novalagung/dasarpemrogramanrust-example/../tuple")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.tuple.html"},"https://doc.rust-lang.org/std/primitive.tuple.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/primitives/tuples.html"},"https://doc.rust-lang.org/rust-by-example/primitives/tuples.html"))))}k.isMDXComponent=!0},5607:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/tuple-1-3234f50043ed15a37da7ad04884b7f8d.png"},8923:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcwAAAB7CAIAAAB2ASeoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDRUMTc6MjM6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE3OjU5OjIxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE3OjU5OjIxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU2NTNhMjkyLTFjNjct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"},6333:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/tuple-3-3378d68b3ca9526a7b5cb148b01c8450.png"},3437:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAc8AAACmCAIAAAAzlpNaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDRUMTc6MzY6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA0VDE4OjAxOjQ4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA0VDE4OjAxOjQ4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFlN2IzMzUzLWUyZGIt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"}}]); \ No newline at end of file diff --git a/assets/js/87499f15.3255091a.js b/assets/js/87499f15.3255091a.js new file mode 100644 index 00000000..e84c3400 --- /dev/null +++ b/assets/js/87499f15.3255091a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7742],{3905:(a,e,n)=>{n.d(e,{Zo:()=>s,kt:()=>k});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var p=i.createContext({}),d=function(a){var e=i.useContext(p),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},s=function(a){var e=d(a.components);return i.createElement(p.Provider,{value:e},a.children)},u={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},A=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,p=a.parentName,s=m(a,["components","mdxType","originalType","parentName"]),A=d(n),k=t,g=A["".concat(p,".").concat(k)]||A[k]||u[k]||l;return n?i.createElement(g,r(r({ref:e},s),{},{components:n})):i.createElement(g,r({ref:e},s))}));function k(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=A;var m={};for(var p in e)hasOwnProperty.call(e,p)&&(m[p]=e[p]);m.originalType=a,m.mdxType="string"==typeof a?a:t,r[1]=m;for(var d=2;d{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>m,toc:()=>d});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:4,title:"A.4. Variabel",sidebar_label:"A.4. Variabel"},r=void 0,m={unversionedId:"basic/variabel",id:"basic/variabel",title:"A.4. Variabel",description:"Rust merupakan bahasa yang kalau dikategorikan berdasarkan type system-nya adalah statically typed, yang artinya semua tipe data harus diketahui saat kompilasi (compile time).",source:"@site/docs/basic/variabel.md",sourceDirName:"basic",slug:"/basic/variabel",permalink:"/basic/variabel",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,title:"A.4. Variabel",sidebar_label:"A.4. Variabel"},sidebar:"tutorialSidebar",previous:{title:"A.3. Komentar",permalink:"/basic/komentar"},next:{title:"A.5. Tipe Data \u279c Primitive Scalar",permalink:"/basic/tipe-data-primitive-scalar"}},p={},d=[{value:"A.4.1. Deklarasi variabel menggunakan let",id:"a41-deklarasi-variabel-menggunakan-let",level:2},{value:"\u25c9 Aturan penamaan variabel (naming convention)",id:"-aturan-penamaan-variabel-naming-convention",level:3},{value:"\u25c9 Macro println untuk print string",id:"-macro-println-untuk-print-string",level:3},{value:"A.4.2. Immutability pada variabel",id:"a42-immutability-pada-variabel",level:2},{value:"A.4.3. Keyword mut",id:"a43-keyword-mut",level:2},{value:"\u25c9 Argument parameter macro println",id:"-argument-parameter-macro-println",level:3},{value:"A.4.4. Type Inference vs Manifest Typing",id:"a44-type-inference-vs-manifest-typing",level:2},{value:"\u25c9 Metode Type Inference",id:"-metode-type-inference",level:3},{value:"\u25c9 Metode Manifest Typing",id:"-metode-manifest-typing",level:3},{value:"A.4.5. Deklarasi variabel tanpa predefined value",id:"a45-deklarasi-variabel-tanpa-predefined-value",level:2},{value:"A.4.6. Deklarasi banyak variabel dalam satu statement",id:"a46-deklarasi-banyak-variabel-dalam-satu-statement",level:2},{value:"A.4.7. Deklarasi variabel dengan tipe data ditentukan dari value",id:"a47-deklarasi-variabel-dengan-tipe-data-ditentukan-dari-value",level:2},{value:"A.4.8. Variable Shadowing",id:"a48-variable-shadowing",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:d};function u(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},s,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Rust merupakan bahasa yang kalau dikategorikan berdasarkan ",(0,t.kt)("em",{parentName:"p"},"type system"),"-nya adalah ",(0,t.kt)("em",{parentName:"p"},"statically typed"),", yang artinya semua tipe data harus diketahui saat kompilasi (compile time)."),(0,t.kt)("p",null,"Pada chapter ini kita akan belajar mengenai variabel pada Rust, cara deklarasinya, dan juga mengenai ",(0,t.kt)("em",{parentName:"p"},"immutability")," variabel."),(0,t.kt)("h2",{id:"a41-deklarasi-variabel-menggunakan-let"},"A.4.1. Deklarasi variabel menggunakan ",(0,t.kt)("inlineCode",{parentName:"h2"},"let")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"let")," digunakan untuk deklarasi variabel. Notasinya kurang lebih seperti berikut. Di contoh ini sebuah variabel bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_variabel")," didefinisikan dan diisi nilainya dengan sebuah string ",(0,t.kt)("inlineCode",{parentName:"p"},'"predefined value"'),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let nama_variabel = "predefined value";\n println!(nama_variabel);\n}\n')),(0,t.kt)("p",null,"Ok, sekarang coba jalankan, dan lanjut ke pembahasan di bawah."),(0,t.kt)("h3",{id:"-aturan-penamaan-variabel-naming-convention"},"\u25c9 Aturan penamaan variabel (naming convention)"),(0,t.kt)("p",null,(0,t.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},(0,t.kt)("em",{parentName:"a"},"Naming convention"))," variabel di Rust adalah ",(0,t.kt)("strong",{parentName:"p"},"snake case"),". Nama variabel dituliskan dalam huruf kecil dengan separator tanda garis bawah atau underscore (",(0,t.kt)("inlineCode",{parentName:"p"},"_"),"). Contohnya seperti: ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_variabel"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"hasil_operasi_pembagian"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"kota_kelahiran"),", dll."),(0,t.kt)("h3",{id:"-macro-println-untuk-print-string"},"\u25c9 Macro ",(0,t.kt)("inlineCode",{parentName:"h3"},"println")," untuk print string"),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"variabel rust",src:n(7281).Z,width:"455",height:"228"})),(0,t.kt)("p",null,"Error? kok bisa?"),(0,t.kt)("p",null,"Perlu diketahui bahwa pada penggunaan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", parameter pertama wajib diisi dengan sebuah ",(0,t.kt)("strong",{parentName:"p"},"string literal"),". Contohnya seperti ",(0,t.kt)("inlineCode",{parentName:"p"},'"Hello, world!"'),". String literal yang ditampung terlebih dahulu dalam variabel, kemudian variabel-nya di print, akan menghasilkan error, contohnya seperti di atas."),(0,t.kt)("p",null,"Solusinya bagaimana? ya tetap menggunakan string literal, tapi dengan menerapkan teknik ",(0,t.kt)("strong",{parentName:"p"},"formatted print"),"."),(0,t.kt)("p",null,"Sekarang ubah kode menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let nama_variabel = "predefined value";\nprintln!("{}", nama_variabel);\n')),(0,t.kt)("p",null,"Bisa dilihat argument pertama statement macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," adalah string literal ",(0,t.kt)("inlineCode",{parentName:"p"},'"{}"'),". String ",(0,t.kt)("inlineCode",{parentName:"p"},"{}")," pada macro tersebut akan di-replace dengan isi argument setelahnya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_variabel"),"."),(0,t.kt)("p",null,"Jika dijalankan, maka hasilnya tidak ada error dan menampilkan output sesuai harapan."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"string literal println",src:n(3283).Z,width:"473",height:"137"})),(0,t.kt)("p",null,"Ok sekarang kembali ke topik, yaitu perihal variabel."),(0,t.kt)("h2",{id:"a42-immutability-pada-variabel"},"A.4.2. ",(0,t.kt)("em",{parentName:"h2"},"Immutability")," pada variabel"),(0,t.kt)("p",null,"Tulis kode berikut. Ada 2 variabel yang dideklarasikan, ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number")," yang isinya numerik, dan ",(0,t.kt)("inlineCode",{parentName:"p"},"message1")," yang isinya string."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n')),(0,t.kt)("p",null,"Jalankan, hasilnya tidak ada error, aman."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"var immutability",src:n(5394).Z,width:"467",height:"119"})),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"O iya, jika ingin menampilkan banyak variabel via macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", manfaatkan string ",(0,t.kt)("inlineCode",{parentName:"p"},"{}"),"."),(0,t.kt)("p",{parentName:"blockquote"},"Tulis ",(0,t.kt)("inlineCode",{parentName:"p"},"{}")," sejumlah variabel yang ingin ditampilkan, pada output string ",(0,t.kt)("inlineCode",{parentName:"p"},"{}")," akan di-replace oleh variabel yang disisipkan pada argument saat pemanggilan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," secara berurutan."),(0,t.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, string ",(0,t.kt)("inlineCode",{parentName:"p"},'"message number {}: {}"'),(0,t.kt)("br",null)," ... akan menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},'"message number {message_number}: {message1}"'),(0,t.kt)("br",null)," ... kemudian menghasilkan ",(0,t.kt)("inlineCode",{parentName:"p"},'"message number 1: hello"'))),(0,t.kt)("p",null,"Sekarang ubah isi ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number")," menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"2")," lalu siapkan juga variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message2"),", kurang lebih kodenya menjadi seperti berikut, kemudian jalankan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n\nmessage_number = 2;\nlet message2 = "world";\nprintln!("message number {}: {}", message_number, message2);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"var immutability",src:n(6204).Z,width:"585",height:"308"})),(0,t.kt)("p",null,"Error? kok bisa?"),(0,t.kt)("p",null,"Perlu diketahui, bahwa ",(0,t.kt)("em",{parentName:"p"},"by default")," semua variabel adalah ",(0,t.kt)("em",{parentName:"p"},"immutable"),". Immutable itu artinya gak bisa diubah nilai/value-nya. Jadi mirip seperti konstanta."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Variabel immutable mirip seperti konstanta, tapi sebenarnya berbeda. Akan kita bahas lebih detail di beberapa chapter berbeda perihal perbedaannya.")),(0,t.kt)("p",null,"Lalu bagaimana cara agar nilai variabel bisa diubah? Caranya dengan menambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," (yang merupakan kependekan dari ",(0,t.kt)("em",{parentName:"p"},"mutable"),") saat pendefinisian variabel tersebut."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Catatan tambahan:"),(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Operasi assignment pada variabel immutable hanya boleh dilakukan sekali. Dan pada kode di atas telah dicontohkan caranya bagaimana. Variabel dideklarasikan sekaligus diisi nilainya.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Perlu diketahui bahwa sebenarnya diperbolehkan untuk memecah statement deklarasi variable dan assignment nilai sebagai 2 statement terpisah. Lebih jelasnya dibahas setelah ini pada section ",(0,t.kt)("a",{parentName:"p",href:"/basic/variabel#a45-deklarasi-variabel-tanpa-predefined-value"},"section A.4.5"),".")))),(0,t.kt)("h2",{id:"a43-keyword-mut"},"A.4.3. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"mut")),(0,t.kt)("p",null,"Ok, mari kita coba, ubah statement deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number"),", tambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut"),". Lalu jalankan ulang program."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n\nmessage_number = 2;\nlet message2 = "world";\nprintln!("message number {}: {}", message_number, message2);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"mut keyword",src:n(3264).Z,width:"470",height:"132"})),(0,t.kt)("p",null,"Ok, sekarang tidak muncul error."),(0,t.kt)("p",null,"Dengan menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"let mut")," pada pendefinisian ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number"),", membuat variabel tersebut menjadi mutable atau bisa diubah nilainya."),(0,t.kt)("h3",{id:"-argument-parameter-macro-println"},"\u25c9 Argument parameter macro ",(0,t.kt)("inlineCode",{parentName:"h3"},"println")),(0,t.kt)("p",null,"Selanjutnya, coba tambahkan lagi 1 message baru pada program yang sudah dibuat, lalu run."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n\nmessage_number = 2;\nlet message2 = "world";\nprintln!("message number {}: {}", message_number, message2);\n\nmessage_number = 3;\nlet message3: i8 = 24;\nprintln!("message number {1}: {0}", message3, message_number);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"formatted print macro `println`",src:n(4247).Z,width:"470",height:"154"})),(0,t.kt)("p",null,"Jika dilihat ada yg berbeda pada cara deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," dan juga pada statement ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," untuk ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," yang di situ digunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"{1}")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"{0}"),", tidak seperti sebelumnya yg menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"{}"),". Kita akan bahas yg ke-2 terlebih dahulu."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{}"),", maka string akan di-replace sesuai urutan argument pada pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),"."),(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{0}"),", maka string akan di-replace dengan data pada argument ke ",(0,t.kt)("inlineCode",{parentName:"li"},"1")," pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),", yang pada contoh di atas adalah ",(0,t.kt)("inlineCode",{parentName:"li"},"message3"),"."),(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{1}"),", maka string akan di-replace dengan data pada argument ke ",(0,t.kt)("inlineCode",{parentName:"li"},"2")," pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),", yang pada contoh di atas adalah ",(0,t.kt)("inlineCode",{parentName:"li"},"message_number"),"."),(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{n}"),", maka string akan di-replace dengan data pada argument ke ",(0,t.kt)("inlineCode",{parentName:"li"},"n+1")," pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),".")),(0,t.kt)("p",null,"Dengan ini maka 3 statement berbeda berikut akan menghasilkan output yang sama:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'println!("message number {}: {}", message_number, message3);\nprintln!("message number {0}: {1}", message_number, message3);\nprintln!("message number {1}: {0}", message3, message_number);\n')),(0,t.kt)("p",null,"Sekarang perihal perbedaan cara deklarasi ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," akan kita bahas di bawah ini."),(0,t.kt)("h2",{id:"a44-type-inference-vs-manifest-typing"},"A.4.4. ",(0,t.kt)("em",{parentName:"h2"},"Type Inference")," vs ",(0,t.kt)("em",{parentName:"h2"},"Manifest Typing")),(0,t.kt)("p",null,"Rust mendukung dua metode deklarasi variabel, yaitu ",(0,t.kt)("em",{parentName:"p"},"type inference")," dan ",(0,t.kt)("em",{parentName:"p"},"manifest typing"),"."),(0,t.kt)("h3",{id:"-metode-type-inference"},"\u25c9 Metode ",(0,t.kt)("em",{parentName:"h3"},"Type Inference")),(0,t.kt)("p",null,"Penulisan variabel dengan metode ini ditandai dengan tidak menuliskan tipe data secara jelas/eksplisit. Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let var1 = "hello" // compiler akan secara cerdas mendeteksi var1 tipe data nya string\nlet var2 = 12 // compiler akan secara cerdas mendeteksi var2 tipe data nya numerik\n')),(0,t.kt)("p",null,"Metode deklarasi yang selama ini sudah kita terapkan adalah ",(0,t.kt)("em",{parentName:"p"},"type inference"),"."),(0,t.kt)("h3",{id:"-metode-manifest-typing"},"\u25c9 Metode ",(0,t.kt)("em",{parentName:"h3"},"Manifest Typing")),(0,t.kt)("p",null,"Metode ini mewajibkan programmer untuk menuliskan secara jelas/eksplisit tipe data variabel. Contoh penerapannya bisa dilihat di praktik sebelumnya, pada definisi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message3"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"let message3: i8 = 24;\n")),(0,t.kt)("p",null,"Notasi penulisan tipe data adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"namavariabel: tipedata"),". Contoh seperti di atas, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"let message3: i8 = 24")," artinya variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," didefinisikan memiliki tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"i8"),"."),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"i8")," merupakan salah satu tipe data dari sekian banyak tipe data yang ada di Rust. Lebih jelasnya kita akan bahas pada chapter selanjutnya."),(0,t.kt)("h2",{id:"a45-deklarasi-variabel-tanpa-predefined-value"},"A.4.5. Deklarasi variabel tanpa ",(0,t.kt)("em",{parentName:"h2"},"predefined value")),(0,t.kt)("p",null,"Sesuai dengan penjelasan di ",(0,t.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/error-index.html#E0381"},"dokumentasi spesifikasi Rust"),", variable yang tidak ada value-nya akan memunculkan error saat program di-run."),(0,t.kt)("p",null,"Meski demikian, diperbolehkan untuk memisahkan variable statement untuk deklarasi variable dan pengisian value. Sebagai contoh, statement ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number")," pada kode berikut ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number = 1;\nprintln!("message number {}", message_number);\n')),(0,t.kt)("p",null,"... boleh dituliskan dalam 2 statement terpisah seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number: i32;\nmessage_number = 1;\nprintln!("message number {}", message_number);\n')),(0,t.kt)("p",null,"Intinya, operasi assignment hanya diperbolehkan 1x saja pada variabel ",(0,t.kt)("em",{parentName:"p"},"immutable"),", baik itu saat deklarasi variable atau setelahnya."),(0,t.kt)("h2",{id:"a46-deklarasi-banyak-variabel-dalam-satu-statement"},"A.4.6. Deklarasi banyak variabel dalam satu statement"),(0,t.kt)("p",null,"Di Rust memungkinkan untuk mendefinisikan banyak variabel dalam 1 baris statement. Notasi penulisannya seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let (var1, var2) = (24, "hello");\nprintln!("var1: {0}", var1); // hasilnya => var1: 24\nprintln!("var2: {0}", var2); // hasilnya => var2: hello\n')),(0,t.kt)("p",null,"Pendefinisian banyak variabel dalam 1 statement dilakukan dengan menuliskan semua variabelnya dengan separator tanda ",(0,t.kt)("inlineCode",{parentName:"p"},",")," dan diapit tanda kurung ",(0,t.kt)("inlineCode",{parentName:"p"},"()"),"."),(0,t.kt)("p",null,"Sebagai contoh di atas 2 variabel didefinisikan, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"var1")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"var2"),", dan keduanya memiliki value yang berbeda tipe-datanya."),(0,t.kt)("p",null,"Bisa juga saat definisi variabel sekaligus ditentukan tipe data variabel, notasi penulisan bisa dilihat pada contoh kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let (var3, var4): (i8, i8) = (32, 12);\nprintln!("var3: {0}", var3); // hasilnya => var3: 32\nprintln!("var4: {0}", var4); // hasilnya => var4: 12\n')),(0,t.kt)("p",null,"Dengan notasi ini bisa juga untuk definisi variabel ",(0,t.kt)("em",{parentName:"p"},"mutable"),". Cukup tambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," pada variabel yang ingin bisa diubah nilainya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let (var5, mut var6, var7): (i8, i8, i8) = (64, 12, 4);\nprintln!("var5: {0}", var5); // hasilnya => var5: 64\nprintln!("var6: {0}", var6); // hasilnya => var6: 12\nvar6 = 24;\nprintln!("var6: {0}", var6); // hasilnya => var6: 24\nprintln!("var7: {0}", var7); // hasilnya => var7: 4\n')),(0,t.kt)("h2",{id:"a47-deklarasi-variabel-dengan-tipe-data-ditentukan-dari-value"},"A.4.7. Deklarasi variabel dengan tipe data ditentukan dari value"),(0,t.kt)("p",null,"Ini merupakan salah satu alternatif cara penulisan untuk men-specify tipe data variabel, caranya dengan menuliskan tipe data tepat setelah value, contohnya seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let data1 = 24i8;\nprintln!("data1: {0}", data1); // hasilnya => data1: 24\n')),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data")," didefinisikan dengan predefined value adalah numerik ",(0,t.kt)("inlineCode",{parentName:"p"},"24")," dengan tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"i8"),", penulisan value nya menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"24i8"),"."),(0,t.kt)("p",null,"Boleh juga menggunakan separator ",(0,t.kt)("inlineCode",{parentName:"p"},"_")," dalam penulisan value-nya sebagai pembatas antara nilai dan tipe data, contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let data1 = 24_i8;\nprintln!("data1: {0}", data1); // hasilnya => data1: 24\n')),(0,t.kt)("h2",{id:"a48-variable-shadowing"},"A.4.8. Variable ",(0,t.kt)("em",{parentName:"h2"},"Shadowing")),(0,t.kt)("p",null,"Di Rust ada konsep bernama ",(0,t.kt)("strong",{parentName:"p"},"variable shadowing"),". Shadowing sendiri adalah pendefinisan ulang variabel yang sebelumnya sudah didefinisikan. Biasanya teknik ini dipakai untuk isolasi variabel dalam sebuah blok kode."),(0,t.kt)("p",null,"Contoh shadowing bisa dilihat pada kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let x = 5;\nprintln!("x: {}", x); // hasilnya => x: 5\n\nlet x = x + 1;\nprintln!("x: {}", x); // hasilnya => x: 6\n')),(0,t.kt)("p",null,"Lebih jelasnya akan kita bahas pada chapter terpisah, yaitu ",(0,t.kt)("a",{parentName:"p",href:"/basic/shadowing"},"Shadowing"),"."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"_"))),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/variabel"},"github.com/novalagung/dasarpemrogramanrust-example/../variabel")),(0,t.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/shadowing"},"Shadowing")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"#/wip/macro"},"Macro")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"#/wip/formatted-print"},"Formatted Print"))),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html"},"https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/hello/print.html"},"https://doc.rust-lang.org/rust-by-example/hello/print.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html"},"https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/variables.html"},"https://doc.rust-lang.org/reference/variables.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/38045700/how-do-i-declare-multiple-mutable-variables-at-the-same-time"},"https://stackoverflow.com/questions/38045700/how-do-i-declare-multiple-mutable-variables-at-the-same-time"))))}u.isMDXComponent=!0},7281:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/variabel-1-c9d8201d5914e2a0da75b23e92fa5bb9.png"},3283:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdkAAACJCAIAAADv3NUWAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6MTU6NDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjIyOjM3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjIyOjM3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMwYWNkNzk4LTkwODAtNzQ0My04MzY2LTc2NDEyZWQ3MWEzNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpjMGFjZDc5OC05MDgwLTc0NDMtODM2Ni03NjQxMmVkNzFhMzUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjMGFjZDc5OC05MDgwLTc0NDMtODM2Ni03NjQxMmVkNzFhMzUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmMwYWNkNzk4LTkwODAtNzQ0My04MzY2LTc2NDEyZWQ3MWEzNSIgc3RFdnQ6d2hlbj0iMjAyMi0wNy0yN1QxNjoxNTo0OSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkG+ofkAAB+uSURBVHic7Z1PbBt3dscfSZOSRZumlgrF2srYtLKM6cpxxqtdhxVcBnIXjA86hAhAQIYLqEUAH9xDobMv9VnYHnwIELQ+uDFANJCRGgtDReKuYGgV7bphvF5FXiIyLdYyaEWEGCmUSNHk9DAz5MzwN8Mf/w4pvc/F5k/z+/fmN4+/eZz5PgPDMIAgCILoilHvASAIgiDoixEEQdoA9MUIgiD6g74YQRBEf9AXIwiC6A/6YgRBEP1BX4wgCKI/6IsRBEH0B30xgiCI/qAvRhAE0R/0xQiCIPqDvhhBEER/0BcjCILoD/piBEEQ/TEdOXKkxqpsIPQ3A1tLKz8C4w9+cKp7cTnR0KEBGwidtTW81ToozVgC4w9+8N47Q0NDQwOWdhpsW3DxsuPv3sp+85Sjr0I0ckfBBkL+4bf7NOdQxSVDXGCdbyVEyYEa6zH+oMeamJ+JN3Q0ciJLiaAv6E9Oz2r2wgZCHnvxUyoanomUl5eKNWvnEvMavUWWEu5hNwNx6RHx2ek4AOMP+ro1Z9OusIGQO6M16xZDNHKdSE+y6kpoV4gLrBlWQvSlNl/M+IddkJhv9vUbn512BELDfiZeqSfxAmP8QV8oAOGZJP9dEaYaorS2L+gHVccUjyWHfV4W4h11MVcNGwg513TzWE0wcmQmLDTG+Gm+3hvVWxPZJ0txP1GTL2a9JE9c3HwUdx6MP+hzmQFAuuGUFBKPlO9bIksJdxVLLj4b84Y8TmBsDnMuGavyguN9v6fYHRsIeeyy8cRnY96Q289EKl7LxBkRDMJvSx/BMP+HVDQ8E2H8wWF4FOv2KexJQKW6rzsmsazwQWn5ZOmzLxTylbqKLCWCvlDQRrVbvmi95hU2bNnVjU/vFgCMH37ce6xL+Ht2u2ITCohGLjcd0UqVTBffTPscqj2zgZAHSlVKHylPnOQ4Wc/ECwEqXDIVNvD0SxHpDGrxxazTnkvOK1aA3eNOzIfDcWADIU+AjcxEGL8XHoXDceBXGL+9ZfzDrrRykbEBn1hYtm+Jx5LDPicLUNX3fzyWHHa5NPe4ZJKZHDhsDIBarchayuOueHNInBHRIABgdvl8qWg4HGH8QZ/bD5EYgNnl4+3Jl2ldcaTqBAiWn52Ok2MU8dnpOBsI+UIBh/b2+KL1mte0+jB597Gk7HLvse3Nm5/mAODiZcdJLTupUGZkkulAYqXiqkuSCiUzIK5dWb+e4mJjbFZIxSLk3gknjonMEuMJKoMnXDJaFwKFlZCOpobnKBibFdKbyvOfigrLJrKWAruTBYjPzogLKR5L5szd4n7E7mRlVVmnPRUVLpj4bCxldrglOfjim2mw2iiT8rEBjz2XWAKIz06H5xPg8oVCoVDQT53TL76ZLn2IzITDZb4ospQAl1c+g7JhEGekapBcYn4mUizly0R7yo8kQqpORml5LSIz4fmE1aNlPOOHJ7uzqz9JHTGc7T7Zm1n6LEfdD7lzhZHVTCdbdVYbsZABAGD8wVAoFAp57KmYlntbSuREIzFuBySWIhq9KyyvdpKoBm93VroQKlsJ6Whq2Bc7us2af09mctANIL8nBoAUQDEMEAp5SveaNivY+RKBXELRnqfbob5TBYBSfektIL9J4aPAFXd4AozNCpDRPKTyTl1tRiSDAEApmCKOWKVZafXSHSxldYLlqTC7VENEpp4u2N4s0LVTHUojq5hOBvF7yMwvHcE0vFPWiL6U+mXcDkg+KlaiOnEqVBw8f8lUuhC0Rqt9HNIJ1OCLi75WBUe3OZeJABvwuUD89Ux61yb+tMEGQr6gH6ZjoB0bc3Sbc5mk9pi06sdnH7mDPs3AQxHG7TATNv3KBikideUjUjUILdoXPAVKy2u64/JgeRn57Sz01DUidWRGpjNdjvQdqlw68Vhy2KXx1S66N8ZWdMV1njiK6o5uszD4Kp/ywKDxHqKGGIV20IDxu+25pBCyFLwa4x92le+lkxn+RjYeS+bsnoDarRY5JFINVA4WgL9qzMW7RAA2EAqFSAOLrGneP6rPSNMgjUQ4QWzAp2F58UP5XNhAyGNNzFfwC4Vn67ler/WitOxxfhu6XRcBAM5+aPP2VhooHzwgBUIURtY0HRvwlFadolB+3lmvy5xa0/pNLJbMWW2s25GWBjPqPHGa1cVLpsKFQKbCUkQ6h1p+u4uspTwe5Y1rWZQgvpRw+4TCVCKRc3WD8m4tFeU3C7PT4A/6ijdnsjtoxu0wp2LV3oPJnxqutNuQjp3uKbjS4x3SGXlCIQ/fF2lGEZJBmgF/I+ALhXyQS0QTOY+65eVHi4ZiAx6IhqcrG/3x3U340HbhmsMLAMJzFLnPljLXvI5rXoCNzYer8Kua51EysqrpylYdQywkB3dU4J/FcaWis9JxUJ048mKgHjzxQgBimyQrVTAn0uYYGKaG71TGH/Q5kq14QaDd3kQo0b4j20NoGVn26J5m4V4Hl+KeoLZ3Pfi9FM1LGHXRipf7aqYlT/Tvd9DINKCV9gS1vgNN/0pc7bBeVzpKFzNAkGpQxLBEOu79aGQPUVuMAkEQBGkkqJmJIAiiP+iLEQRB9Ad9MYIgiP6glnwV7BMt+c7XKW+FmjuCNBbUkkcteeXDqajmrqDTTzHSEaCWvKI2asmjmjsd+iruI3sO1JKX1UYt+fBMBNXcqdTcG6i4n00//DTzmJd73t74Axy6cMwMABtLyc++AgDz5Ws2ibBHbvXh5t3HkkKxuppF6VZIkn7VIc2glt/uWGe55ArYPe7MfDgcDkdTgr6JIKEdDofD8wlwDfsZKCqaCxSjCT6xcD5h9ciEYuKxZK4a2d1SLbPLV4VwsUAyk9NWS6bTYiHOiGgQ4CXJu2PhcHg+kbO7/WIZb0++TKs/UnUC5ZaPz06Hw+FoCnKJefkJIUxTZfDFcZbOu0ph0TSk1VOkqH7Nd2qzQmotQm06RpzUfEImoKxWvXzRai1FJfHZ6XA07fIR5aOkiIr7N28mb95Mfnq3AABnPzwIf+BLNlbB+qsPhSux61jvhZ6dmzeTD1dzvSe7zwJcvGzr3di8eTN582E6C7CxtHn3sfHDj209qxvF6hcuaykWUa6QqlYd0nBQS14OaskLoJo7jZp7rYr7AI/vpsWSwrP1XFePSfhDNv3wsxwAPH62m+0yPQazqxc2+K+Wx7vrWeixGeHiwWNdmWd3eeXowt0/pLO9FplangLqFVLFqkMaDWrJy0Et+eLxqOYOldXcRapX3D/b/fEFa1fx48YO/292fVdw0Y8znz4GAON2Fo65zAA5OGvp68qtPytAH0A2v043MqBfYIiuoJa8DNSSl3aHau4UTdemuG++fMEKqxs3hXiF7YKqJn9hcxuO9dquXQMAyK5u3H0McBGgy9RXPKTP1KVWG+kcUEteAmrJy0E1d21qV9wHABA3y2e7f3VMfUZ8/sCbslgzfLW7Ad0nhRAzHwPZ+Ypy0CKaKwTRAdSSB9SSV2rJE6aJau7KNutU3P/zau4Cr7gPmdXV3DG1ffHjzLMhh/dat1csEAT7b25evtbLb5ZhY/Pm3aqyDhJXCKIzqCVfK+07soaCau76crb74wumZzfTX5U+WtYfbt5Ve4QN6Vhq06OIzz6SPhrULPiX+x61p7uLzIT3vCOGfTPNtkUeCz570tIF+U10xHsR1JJHdAHV3On4Kr3kksYoMkvFPTKyt0AteQRBEP1BzUwEQRD9QV+MIAiiP+iLEQRB9KcOLfn2os8wfsb0tpn7LgUAAD2Gj86Z3h0wnhkwnrHBk3X1I/cVKLJOoibxfEws0CG0Zs03IPFFrc9R1MMoazraBRwAcIWnC9z/Nq5ly0EDAAcAsM19vpCHHsNHZ4wW7SN1Zn+LrFMLVAIIpqospVFVm/KsCJhYABMLVELlFFMmvtCi5b74178wHesuLM5xfwQAMFw8CfCsEe2uc3fW8w0+shXsQZF1agSBypkIf3lqTZ4NhDyQSOSgknZYFW0CkLIiYGIBOZhYgI76n/JtrS8e/LnRbYX1v/COGAC4r3hH/IbhyqCRA+A44DYLd5bg0nkjbBZ6bUbIFl5mjUdtAJv5Oz8YxgcNL19xR/uNAADZwty33Ip087tZuLOkvtslHtlHalMol0bTC08XuG+IzaLIeiVIgw/PZ9z2XGKeL4ssJdw+h9r+iw24M/PhWfAHXdodMX7qNvmGiVkRAAATC2BiAbUTp0qViS+UtPa3O5fVYDRymbS81Gn4+7eM2Vf5//g6/9lyAWzGj04AAPR2wdyTwm6XsW8nP/eKA0Eb13C0H54u5O88Kex2GX95QghH3HlS2K3YveqRYpvLBegynu4D6DF8NGjcfZW/s5Cfe8UBcC+fqDhiFFmngDR4cHSXUq/wCjWqirmRGcqdUxVtAlQyOSYWUJsmrnkytSW+EGmtL7ZZoFAAhYzJcJ+R4wrLvMTXOvcyCxY7AMBuilsBAODW12THbyxz3wDANqQBLHbD8UYMTGgTAACshwB6wCL2u/KTdlgZRdYpIA++NHsPRMPRFH3OAG1o26wkAYiJBQQwsQDlmq8q8YWS1sYoktvQfwDycud22AIFrobf0bidLPRWPqwmtmEXDAd7ALbh3BtGXkRWDRRZp4AweAe/k0lFw2EhPgvptfrjhlW0WSkrAiYWKB6PiQWAas3TJL5Qo7W++FWa8xwymHsA5GEKiSM2HOwCyNI0ZjjYBbAJKw0doZTeQdP4IIB816wERdbpKB98MpODXHJebJMmZUBFqmuzQlYETCwg7Q4TC9BQzypubYxiJcYlObCfNJzjP/cYLp2A/3lRADCePAEAAH3QC7DxonJTx08YegE2fmjKc2nHnQYLFJ4u5O8s5O8s5O9XSGeDIusUlA2ezw8rhOuEjuJit0HKNIWKIzXaJA1J644SEwvIwcQCFNSV+KLVz7Rx9xcKl84bT52HU8A/tAAA3NwhbqTfNN4PALCxnL+/brg0qNqEZLuav78uf+DBZhw/D7uv8p//pCwUH8MoP5LQxcpz7nS/OEiQ9FUOiqwr26QefJxvk//ZXvNOWTp4ly8U8qkeTd8mADkrAiYWwMQCta752hJfiHSWTlufYXzQqOoWG8c5r+mUrfQQ2/vvmo6C+KwbDSiy3ik0KCsCJhbANV/3KmhtjKJTsMlyORoOYmrHvUqDsiLsE8X9fTLNmqg/8YUe70C3P7/7VhJIAckLIC0ARdZbSyuyIiDa7IE134DEF50Vo0AQBNmbYIwCQRBEf9AXIwiC6A/6YgRBEP1pcy15et13miP7DONnTANZ7nv1F5rrGkMjhbfZQMg/PDQ0NDRUQQa7SdAocFd7ZIVWGq5ZrtlmFfLhmj1Qz53qjJYO6gwx+sqnrSqR9caspQ6lHZ6jUCq+cy+fFH4ncZf0uu9toxDfEGiEAupnnzwaqzdsQKG4SYZ/M5nqzd6WnTjVjqQy/Ko0QGSdDlp9S6UchVwwVKA1156cdvDFPETp4U5ViO986BW420ufvrVQz52xWaH2N7LaknIZfjLVPDRY+1qqKodAmaeViXuwgZAHan2RuQ7axxcroNd9V9OSl74bLX1A+JDho0GjRVooaWH3Vf7z52XVtZF90YpaTmXf0qrC2JQQRcGTKlrdkgc21aW+1eTDCQrcbCDkzCSsLpc5l4gmHR6XWfFCKFEiHaR/qaSnXlkGi/IdObrTIaCQD1dTXlc8AJtLzE/H3MS5q0inEyThys8RLYzKiaPWpwfijGbjSiupd0SU4Vfq0xetTCOyTtJ9p9bRrzaHgBass9SU6oyaQdv6YtWEdYaj/dzThfw3fYbxQePpvvzKOulIUQxecKwSevtBVn3b8NEZo4V34n2G8UHTpZ/y98EwXqxewSlLvpCBDYTcysJiGpm1lMdTlB1s3D7J7PK5E/PhcJzxB31uPxOZBf7WMSy+++8LsPGZpORIYAMhT4ANz0zHSXeg5Ixedld3NBx1hjwe/l+3m4FZwpESATE2EHKuic683CBxounqhPp0AADYPTKDRGbIClul+ALjD/pcaV7oNk7Me6Y8HUnRCYKgX1D8Hiw/R7TLgTdx+YkTVNJFAbLiVrQoI1pcIg7SjEhWIncEggr8vNwTDxctXzbiitKiannkypc3ycGW5xCAGpUrGb/bnoqFi9pBajNqAu3zHIXNOH7eNH7eNH5eVHFTQan7ro6ln9CUovpxp8EC3MsVDgBgHTYAet8QNIufPa88asbvtkvEvASIKtTqeur1oRQaZ70uc1GhOz77KJGzO+VHSlW9qckJ483RjpsNeEA0AsEgKqarD+rTwf+hTD6cPBGnHQQtsXgsWSHVh/J08KklwtEUQCpazJdBOkf1iOCB0BCVyHqcPKOqpNNVBMlUZ1G7yHoVOvrUeQnMLl+IRynDxnpd8guzEeeFkvbZF2unqquWbe6Pr7iRfqkgHPklZsdBAwAcPWMalxTa6hOgUFGhJgtjNwMaCVVzrZLXdLABD0SLKSbrkqKXBR1clBJs0voUvWtJGSczOXDxmzrG7TBrynDSU79YcznU+vSEGTHuas4RIeairU9fj8g6FdQ5BCQ3bow/6AsFoLjz5eUyi7v9ahX366R9fHGjWXleWHkOwKusdRlP9+WJvji5w4ENFE9uvP9u3d2ToksEYezmIPWzaskrmuELisg8MU+ZQRjVbGwKxIunHk218tMh3zWV5MMJ/W+mfS7RTeUofq2iguYcVQe9yDppRgxUExIlf3dp6NM3JFWA5nBqyEvAK9kXP7JelzkVlZ3e6hT366N9YhRNI5bS2m6vrHG7YDh63FBWxdjfBwCGS5q/4MU30+JtDOMPCr+GqKpQk4Wx6dEUBReJrKWgmKGS/1FjSX6ETNVbQz68Rhh/sBSdAAAVgxBNVyfVnQ7JiN0l7XOlkfm4h5inszFXI+kcVRusIZ44KpF14ozUrUTqSDvmINOn57usR2S9MrXlJWD8wxIle83TUD6jxtO2+2KyQjz9kbIf3HZf8arzpOrb3OfLhfFB4/h5oWBjOX//ecFtNx0dNI0PwsZyYWPQaFUbZ2Qm6hRuY1LR+YR7GKCoaC5XoY4DQRibHqIouMqQwhAISX74VlX1VrRb/rClqJa9RuhG9rN7SVc7ybuB0t2uup46yXR1Qn86gGgQgpH5cya5eVfXFKff9xHPUXWU677TiqyTZ6SxaAkC82Uy/Kr69AA0IuvktVSFMWrJSyBJF8D7ZdmmWHNGTQB12tqURj/Jv79UvRuJwnINUp+vpssmN1/jjKqohu8T0bAPYhQIUg/yYC5VQtI2pzEzopXhr19kfZ/QtjEKhH/yxqfL65hICUnYAwCa/Mx/6RWMVLO6aNyMqN6oa4DI+j4BYxQIgiD6gzEKBEEQ/UFfjCAIoj/oixEEQfSnzbXkm0EV2vA08OrfbaX8XVHgu6ki681QhW8tNIrmVViJ8Qc/eO+dFujDt+FSROhp1+cojp8wjvSX3oUjKq7VQ+NU5yMzvP6V9L12AF2lviNLCfdwzZqB9dKM3qUKj52UqR0AVBXIGo/aUkQ6gnb1xTwby/n763DOazrVb7r0U/7+eiMabYLqfFymRa0/8VhyuJJebEf1XtIYLyluNqxxjd46j3Zbigg17e2Leb75oXDKZgQQXnfmHTT/f/F15zKBeXrVeeKRUC5bXHi6UBLb1KQNpL7jszFvSKn22iKR9dl4pd7V5e0jFeXD45tpn7pwoqpgP63lSYrmxMETraRhT0rKqjP+oM8FYp9sICQTHq69I6TtaNd4sd1uYA4ZMhvc99tw7ripr4vbWOWemw1nfiYUQo/hzM8M+TT33a7hzM+Mhw9xTxcK/52FM28YD2e574FU+CN8t8o92YC3+w2mLPeE32X3kKt/dMqYf5UPL3KbZgNzCF4+4eZp1UF+XFlaXFy0DAzZUvOf//b3i4uLfACP8b/X+90Xv/394uLiVp/X+5Zza2nlx796a8jZ9+abr5fDX3y51ff2z486t5ZWTgb8xzLR8BdfLm71vf3moa3o51/9BdjAB8dz0fAXXy4ubvWdffcXzq2vZ78mdgQAkLANvHP0sCTkKam+aBkY6n39Ymnlx/I2l1bghPfNPqfQpGVg2POWZXF554T3zQMpofkj4geWNE5i76S5wwnvcdfx8o7KCyXhT/bssG3rydcqkdyEbWDomFWswbx99s3Xq18uJ+gtH19ZWlxc3Op7uzRb1cGXWylBsqcw0iNSC6pAqP6nPy1ZBt45fqKvtCz470DVjpAOpb2fo+gdNI2fN53qKswtyDQtyyEKzNOrziuP7AELcOtrAAArPzVKVbmFUt8AEFlKgMsrym61WmRd3rv63BXy9sRCQXwrGAqFQiGPPaWlcUcW7Ke0vNp+m2rwdmf150iBSvXIzHwCXF6/5BTW2RHSjrR3jGJjWUh39MsTeV6MuEVswy4YDvYAbAs5PjY1vwkoaZ3UNwBNXptmiqwre1eZuwwzqSNB57cYB2X8wVDQpvqjKFmwn9byKlQcPG+l+iTzNarzSmmutCgJXWdHSFvS3r4YAGCdezkAR/sN555ThmsbRu+gaXwQQL5rrp1WSn3zzZDCtkqaJrIu651u7sSOlKLgvP63eoYIgmA/veWJUFQvWanO2C25OhvwOZLRhEOa3hiDxHuN9o5R8EiU3QGEaEMFifc6Oe40WKDwdCF/ZyF/Z6G25zd0lfoWiKyJd696iKyXeq88d0Henlgob5f1SvS/SZAF+6ksr45mddFKle2prCeTOVerzgY89lRsNlLSRau2I6QTaP99McDKGvfLfkPvgOH4t9zTN+BUv2m8v5LEOxFqffqV59zpYq48ABCfrqsGfaW+BUrJ0Fsmsh4n9q4297KOiJr3shhBxQ1hmWA/teXJiub0gweiPYltkgdeXn3Tyz85ESlOjM/1o7IYkM4FddpInPOaTtlKD7G9/67pKKhmL204jRUvb947JzTj1OqdqJiOmvfIPqUT9sWtR54H2nCwCyDbut4bK17evBcXaMbZya9NIEgrQV9M4nffFi6dl8Qosq3bFEOLxcvrQM9xKt4xEWlXUyFIRTBGgSAIoj+d8BwFgiDIXgd9MYIgiP6gL0YQBNEf9MUIgiD6g74YQRBEf9AXIwiC6A/6YgRBEP1BX4wgCKI/6IsRBEH0B30xgiCI/qAvRhAE0R/0xQiCIPqjpy+emJq+fX2k8kECxWMnpqSfmto7BSPXbwsDnJqovzUEQfYnba6ZOTE15o7dC07e0nsg6szduDIHMHL99qRd76EgCNKxtLcvHhlwQuyB0hHfmgy2sW9GOpPd07sFW0FRmPUpcwgUDhdyf50rr2793Gr9z+pSfiGIlGp98cj121fhkwf2yTE3AICwZ52Ymh5NTX0CVydZa6kURq7f5gtKRbJCgHQElIXSbbDHrljdpeNkDRKGVE3vZUxMTY9BaRylj5Lq6cjUlRtzqlaatD+QjEP4oDLNRlOwFQq2woEX7f1FWx9ZNst1ccpCOtf5euD164HXDR8P+mKkHmq4XK3s5GhkKhicg4mp6bGpiVuTt/jSydi9YPDWyPXbk6PXR27d8ExNsmv3ij7o9vXolRtzE6VCmJiaHgUAgImyI4tuHQDGpqfHQHBeKgGB4pCKnc+Vt6nWO4Fbf46NjQ1NAPDOVNydj1wPwifB4BzwbV69PjKn5o1JEIdUheErUbAVdgI727/e3gnsHPnXI0d+c6SBjdcJwXV2Q5ZVus58X/71W0ovmRvM5d/IN3V49XNw5qDeQ0A6m1q2TrF7gg+59efY2OiA8PtXOjI1eQsA5h5Er7L2OZgIumP3hGDC3I0HwenRURgZHS0VFpkYKj/yypUglO1PKw+J79wD4CG0Se6dyK3pyOik4IxHRj0Q+eQWAMzdmBR9Z7EjemdKmOYIzNXvjKUuuO7GBDLvZRQl3BFu9/SuovD1sdf5N5VesiNcZznmZbPpB5Oi0PKNxbBrkJYYsgbLNxbFYaYfTOZlMyBIHdR9G2u18+nO0tEHglsR965OcAtbWh61iMDIAO2R9NTd5tyD6FXeGY+MeiD6CT83WYQDINbSISnQdsG73t0f//lHRSHRdRLjpO2P5TuLcVP5FFDX112KEuOm0byo9JIHXhzY2wEcpBOpe0WmU1EAD/lvZTHRkesqrTQjekrfOwnRGY8MFF3xxNQkC5Gp4A0xSGGve0jVQ7kL3gnsNHCbXD9dkS5DVrbBhAx0fYuuE0EE6lniE1Nj7nRkao7oi+ceRK9OFqPJYuGLtUmWv/UfuX57zA3piMqRdULfu2YTVwcmRj1rD66UAglrL+YAAEauX2Wt2vti58AIwBxMTE3yR9Y9zdcDr7f+YWvrH7dqq14VlK7T9IPpwPfKJUS82UcQRJtafHHxTlvrUQKYu3EFrt+eLN6UpyNTV27cmrw3NM1Xj92bioxeVT2S2Kw0RjA2PT0GsXvByWh9vasyd+NBcHqMjd27IRTcmo6MToq/JEYiadauNqRbNz4ZvT05OT09CenIvUh6zF7VNMkceHGg9196D//74cz7mcz5TOb9jEZswbxs7rnXU96C6f+UXhJdJ4K0AwaGYao5Xva0FqIvu6d3s77szt/uZH3KpxR6/qun75/69BoYgiDVgmG4DsbyncXyneXwvx0GgMx7mawvm/Fn+AfFCs7O+zkOQfYz6Iv3CN1fd3d/3X3kN0e4Lk47fIEgSBtSbYwCQRAEaTyomYkgCKI/6IsRBEH0B30xgiCI/qAvRhAE0R/0xQiCIPqDvhhBEER/0BcjCILoD/piBEEQ/UFfjCAIoj/oixEEQfQHfTGCIIj+oC9GEATRH/TFCIIg+oO+GEEQRH/+H2UfGUkdQSlBAAAAAElFTkSuQmCC"},5394:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdMAAAB3CAIAAADXZj22AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6MjE6NTMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjIxOjMxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjIxOjMxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJkY2VmNWQ3LWNkNWUtM2E0OC1iNTk5LTRhNzY5M2NkZjdlYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiZGNlZjVkNy1jZDVlLTNhNDgtYjU5OS00YTc2OTNjZGY3ZWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiZGNlZjVkNy1jZDVlLTNhNDgtYjU5OS00YTc2OTNjZGY3ZWEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJkY2VmNWQ3LWNkNWUtM2E0OC1iNTk5LTRhNzY5M2NkZjdlYSIgc3RFdnQ6d2hlbj0iMjAyMi0wNy0yN1QxNjoyMTo1MyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqkJe0gAABxtSURBVHic7Z1PbFNXvse/tsdJiBnXGaeJX0gNJvNcXIXSy8sM4xchV3ThsmBRq5KlVCyyqNQFu6xZZZ0di0pdsECDZKkyqtAI5alFjapMhnloXIZm0mcNmFgFmUysuKEOSTyx3+Lea98/516fazs3Dvw+G/DJPf9+5/jnc3/33O9xBINBEARBEDbiPOgGEARBvHaQ5yUIgrAb8rwEQRB2Q56XIAjCbsjzEgRB2A15XoIgCLshz0sQBGE35HkJgiDshjwvQRCE3ZDnJQiCsBvyvARBEHZDnpcgCMJuyPMSBEHYDXlegiAIu3G98cYb1nII8eR/j75YWf0ZwVjiw1N9y48KnW2SEE+e8Xa81DZo9FhBMJb48A/vjo+Pj4/2dFNjW4fZzUOFEE/GJt4eNO2DhUn76g0x0T38ytrlwVgi7Ckszef3pzUAgMxKIRFNxIrpBdNahHgy7Kt/KmVT8xl9eiPZNHelsGRSW2alEJoIBZFXXpFfSOeBYCwR7TPtTbcixJOhbVWvmd1sv5a6mQ3Hols57ENMdDOWPG8wNhFAYcncI7ZPfiHtjycnYsF8s5rkL3Mwlogm40jNF8VfhhRXE5W5o4kYDJ1vPleciEYE5A+V47DMPnQzM5+SCgvGeH5OO1XbPiLEk0Nrh+w3hOg+rHheIcLyu/VlTX1NE4wlogE3AOViUpHIvFK9IsqsFEIWnEB+IRdJhocQ9PrdlWLO4pdb9PThenVCPBn2qdqTX8hFkqFYMNPUbzB7xDCIuOS8jwnxD6Vsaj4TjCUmcD/XF9XYk4FB9mhfTmFZ6YPW8sXG52gyGVVUxeymvvHMdjZrfH6zHPUbmk2IJ8NoZGl85DSd4jpVzcypiCaT1nxxnlkpJKLJhNfsLqnOB54rEWnBvPN044tbVcD50acDx3rFpPJ3X2w/AD74xH9ya+OvOHr+mBvAxkrxj98AcH9yxTvQKKvy9LvNWw8UiXJ2I4vyzZAi/6wjOoiFJ2zCkE/v1Xzh0PZSKpVKZUu+cFwAEIxFcD+VSqVSqaUCAhOxIMTVcjmbkqjHBaJy4lLBE07EFOcS5XPFim9IsNibfK5YcQeiqpK4KG5X4PGa5Mqsldz+ULNimT1iGgSAOxCN9uVSqdRSoeILxeQ00Z5imll9rOwM9JbPL6RTqVS2hEphST0gjG4aNL7ezsa4GyTWTcOaPXUyayU0hjvo9aC0luE2XVDu1FKhou47O7t+0ppNRS35hXQqWw5Ek/Em0/MDz5WI6+l3xWvXiteuFb+4VQVw5qMj+KuYsvEUnt9/JH0Be48NnO9/ee1a8bunlYGTfWeADz7xDmxsXrtWvPZdeQfYWNm89cD50afe/qcb9eznP3Gb1M85QyzNOqJT8HveoNeD8qb2q1PKSj/99e9OfmFeXgzkc8WKu09e6WgdqTDkK2Wl73x+Iaf5yuc3y+a+UFVUPOyrFFbEb8VSAYFoMplMWnDA+c1y40NmXumM5MSVAgIR8+8au0eGBqkUluYz9VQxTban+komrOxsLPyEabtp1HjVuHu8zMQgAARjiWQymUyGfaWcySIxs1Ko/9IGQ34UVjImtWv6bmQmrsb7hppNRVZz51NLBU/YbIo5PzrZt/P0l1vqRemDW2U5pfp4vdLb75L+sFP+7o8VAA8e7+70uh7AHRjAhvhD8mB3fQf9Xic+OHKsd/vxraqY/dZfyzsDPR+YtJJ7hliYdUSH4I82+PvMfl/FZWMfoL67BVAC6jf0yWS4cc/q9cAnpkhUCprywn1+wOyWrp5feSspPhgRo7fJuJ/r5ino9QDbppfkc8WJ6JAAGBZn1COWQQA0loByiw2KVWZv3AxyZmdY3hRtNw0ar4L5rXaLgyc1TnTBJvfojXqDIT+K9+uZuExnQNPGi5O22VQ0xh0wDIm5+nuxtVnVJp/p+/S8p7f+ceOl+O/O+q7kkB9sf/EAgHNrB8cCbqCCMz2DvZX1x1UMAjt763wtA/8EIw4Cfs9b96wG+Pvcle0MhHg0APkZl/K5sPz4Q4gno4kY0jmYB5X8fe7KdtG8TWb58wv3Q4mo3xs0d94AgGDI72Ys6LUFcgR79S0yNAgv5s6FA63lzZ2vqpt8ja+wfrO0g5fPFScCJj+lsusNeuuOt03TcWT397mlxluLb+ofBejY29pBvzbR/cl5D55uXJMiD97zuitkqptbODbgvXIFAHaebtx6AHwA9LoG65cMunqNchNdD3+0wfz2PxgL+SrFnPhB8mHB2ERAv04ubouxuHyuWNFFAxUFMoMbVuByp4D4DXXX7zYBIZ5MMoN4TYK9xj0yNUgnkQZIiEdNLC9/MOqLppumjRfi4ca4axLVlhciAXdpzcS55XPFiscrhPxlZViiTdOZZpcnbZOpqEWIJ8OewlITT119vF4ZiHj00QBpIXym7/fHjHt0pu/kwPbKNVWMGN/sbqDvpBQaFqMZL7/hbLSM6Qwh7MPC3obMWikc1t5c6e738yuFUFRKLBUKlUAftHd9pay4DFlII5aI1m/yVPfCwZDfXcpZfciq3qXbbB2jbDvfPrTGlgtlj8LJZFisi9WjDMsg+4G4yI8mk1FUCtlCJWxsefXVOkM1umnYeN24B5mJ7ECJYQdykWQ4UMouKNvBZTr2cHA3njkVwSwTQjyMbCrdfGo+uLWJj7znr/gjAKS9DZUfnlbOR/xXIgC2nz6tHDNa8z7Yfjzuj1zpi8gJYvY/Xtv85MqAuBDGxua1W7pohhnMGUIcDI5gkD/6E4wlov4i13aaNtHv8+8WurdlHcWsm6rNSaaJRKuc6fv0vOvxtfI3jY89699t3jLaREYcNizpNuQX7is35+wX4oty97vTuWXmU6+828Vr082uRR3DPXOypxd7m+R2XyEsvj3M/3pZ6wiRQDnLd/dPHDY08SAZ2r+v4ZvySkAZbdheqa9/iVcCS9EGgiAIogOQSiRBEITdkOclCIKwG/K8BEEQdmNdGb27GHRMnXa97a79owQA6Hd8fNb13qjz9KjztBcP142vfK0gyXAWLUnBk0z+IcGeOd/6MQ4W9za0w/vvuUakrTLVH+/V/ta5knuOOIAaAGzVvry3h37Hx6edPeZXHjCvt2Q4tyQjIJmqueSEpTLVGv8kk08y+c0wGGLOYxwY2OV533/PNdJbd7iO908ATzpR7nrt5vpeh6+0g1dQMpwbSZJxPiN+Gc06L8STYRQKFTTTz7JQJsDS+CeZfDUkk89Hy/tsbfG8x084R3qx8ai+zq19+wQAMOiYGpMjzZvVmyu4eM6JzeqA14md6rMd54gX2Ny7+S/H1Jjj2fPayLATAHaqi9/XVpUL283qzRXjlSzzykFWmZomAWbLc5IMbwar8aml7ZCvUlgS0zIrhVDUb7S2EuKh7aXUAmKJgHlFwRh3mWLBTI1/ACSTTzL5RgNniMVjHCRsecLmP+IAai+31KmDjqkx5+7zvZv39m4+qsLr/PgEAAz0YvFhdbfXOfhyb/F5DZL2q2NkGD/e27v5sLrb6/zdCSmwcPNhdbdp9YZXymU+qqLX+c4g0O/4WG7S4vMaUHv20CgqQpLhzWE1Hv6+xrEhom6LoSJsZp5zVWShTKCZyUkm36ibNOfZtHSMgy2e18tSszv7phOoPn4CAFivPdtBjw8Adku1VQCora+prpeWzFsoAz0+x/FONEyxDIfnKNCPHrne1V/Mw8EkGc4Bu/GN3oeRTWVL/Ar45vCW2UwGj2TyJUgmn3POWzrGQcKWaMPmDkZ0zpfpjjmovdzBQPPLWmILu3Ac6Qe2pB+GzS3Da0kynANG4/3iKqWUTaWkuCrKa+3H+yyU2Uzjn2Ty69eTTD645jzPMQ4abPG8xZc1eCWPZoDjSC+ww1OY40gvsInVzjVPw8CYa2oMUK+ItZBkOB/6xhe3K6gUl+QyeQTwm2KtzCYa/ySTr6yOZPJ5aGEW2xJtWH1S2wAGxhxnxc/9josn8O1PVcB58gQAYBADwMZPzYs6fsIxAGz8a192hh0fcvSg+uO9vZv39m7e27vT5OAVkgznQNd48ZRSKcwmVZSXq01wHp+nudKkTFaTzO4NSSZfDcnkc9DKMQ427Sqr3blXvXjOeeocTkHcSACgtni0NjnsmhoGgI1He3fWHRfHDItQLEX37qyrNyF4nVPnsPt878tftIny1gj9lYwqVp/U3hmWGwlFXXpIMlxbJnfj82KZ4qN003teZeMD0WQyang1f5kAW+OfZPJJJr/VOd/SMQ6HQqts0DE15jR0gp3jbMR1ytvYRvb+e64RyLvNeCDJ8MNChzT+SSaf5nyrs8CWaMNhQf3Qz3GEDhh8VemQxv9roh//mnSzJVo+xsHGt4e7n2+/V4REoHi9wgZIMtxe7ND4J8x5BeZ868c4HIpoA0EQxCsFRRsIgiDshjwvQRCE3ZDnJQiCsJvuVEbnVzHnuXLQMXXaNbpT+6fxq8BttaGTMtJCPBmbGB8fHx9vIuq8T/DoSVu9skkpHVfgNi3Tghi2aQ3cfeca0cZFh0NavfmwWZIM78xcOlwc4N4GrX557dnD6rcK58ivYt41eucdgeeF+vZ5TbaiHjRCXKMxyUZ8p5frnVjbBs6wIqWovCGtS4ZbxLoifjTgrn/H2tBAbZMD31XGlNY9rHrnhx9+PenuUlu3F+6+B70eWH67qbvRi8qzsbJtr/W51IIifrlU8nnqH/1F8ZVFntwd5cA9rwZ+FXMjZXTlW8XKDblHHR+POXuUiYoSdp/vfflEl90c1duQsp6R7jfUUOaZE6bEddFAeVqxQdJYuNpIDJuhJy3Ek0PbBU8g4K4UskV/WFosQH+lVglKdcaDmTp4cykozvfN+IZDQiOGbaQjrtlwWikspXMhZt8NhMAZsmj6MeIlaDBw3GrrYPZoIa+1knFFTFF5rdp63co8kuEsFXNuVXiLivjSj8ZaXzQkJij0hzJrpXBdbsywRx2k2zyv4UFqjpHh2o/39v426Jgac74zuLe6zrpSljaX3KiCgWGosm85Pj7t7BFd9qBjasx18Ze9O5DE2r980tQFK35sIcSTIW1i/cCTtVI4XBfa69wayB2IhgpLqVQ+GEtEQ7FgZgHiTWBKfkc+Ghfy80XFlRDiyXBcSM2n86x7SfZJU75AXzaVHUqGw+K/oVAQC4wrFZNYiCeH1mTXrTdInmm6NuEeDgDwhVUGycyzVaYakYJgLBENlEUh1zzzPC7tcBRllwfpPf/6r55+jHing2hi/cBJmt+yy6gvM+vCmfUp4mf1iGUldkWQNM2X1H53om55XYubimkanW+mn94sd6pXxIexAFp9se6PRw2b06xHnePA9zZ4nVPnXFPnXFPnZCUzA7Qq5sb0DDOK0mQ/PuToQe3Zag0A1rEBDLypFms3JRgL+RSCVhJMTWVjdfD20MpmC5GAu643nV+4X6j4htRXKjWqualI7a3wtluIhyEbgWEQA9O1B/dwiH/QiWGzOzLkg6Snlc8VmxxToR0O8ViEVLYElLL1sx5YY9SOEBykgrgkw/PsHlkSAjcQ5TLsRSuS4SIWVOH5FPGFSADGb/kK8bBPOcU7MS7mHPia1/wINats1f73eW1yWCmKxn7913/EAWDktGtKkdiqWLuEgaYyW+Z5P+CRCHVbFHC2iBAPI1s/6LAtYXVV+CDAKUOmzM9Ru5lUb3G7goC4YAuG/G5T4Ul+2hcj1sOtts7oUTBkZYwY0RNztfUWJMOtwamIL8RNHgoGY4mwryHdZlU/vjUO3PN2mtUn1dUngHTasfOdwT2m5y2+rMELzW6K999ru3pWVIgh87w/KL2q0cEL+/HNr6PyuyI6gwQNTwnTIMcv2tEV0w+HekXUEMNm1L9ZjgZkp1TheKbEBc8YWYNfMpzVoyCshDLZv1QmausdEb43bQ6XIr4w5IO7HrQGgGgyGWnEXVBYUlnAmn58Sxx4tGHfyJXMltKra7VdOEaOO3RZnMODABwXTZ+z5TfL8g1JMJaQnlkYaiqzZZ75MZW4lsmslVA/J1F89LCivkKlUW0iht0iwViiEWcAYGAQpunaxNpwKFocaih5a40sRjDk0yI7891jjZHVsAtz4Lgkw5k9MrYSqyLz6IFKbV2ssgXJcAtwq+xn5lMN5PM+FW7XaHj1PeoY3bbmZeud81+peiy2+1zUUGdl36p9+ag6NeacOiclbDzau/OkGvK5RsZcU2PYeFTdGHN6jNqZmc8OSTckpexSITQB1PW51ZrKeTBknvlhSlwbNCmFeFLxMNpQo1pTrm7LQ137eY1RjepReEMluih+6Rv3rcbq4CzTtQn/cIBpEIaRxTFT3IYbK2Tzr+mYY2QNvYo5r2Q4u0cmk5Yhl64TlTdUWwd4JMPZc8mCMawo4usQIgE36qEsAJVCKp0z61HnIK2y7qLT++RfL43qTqKxXIe01K1Uuc/Ft9gjC9nobR0TXt1oA0G0gzoIy3UsZpfTmR7xisq3LBn+mtBt0QYC7oB020urhYNEEcAAsM8vlzZecCjtVxWd6xHX22mtS4a/JlC0gSAIwm4o2kAQBGE35HkJgiDshjwvQRCE3XSnMvp+YEHpnAdRy7qrdKybylXvq2T4fmic2wuPPrcFKwVjiQ//8K4NauddOBWJpnTZ3objJ5yTw433ypiqY+3QOQ31zLyoAZWMQ/WE+ACFqzMrhdCEmUrevrIftSs1DQ/TWeAADFW4Oo/RVCS6mS7zvCIbj/burONsxHVq2HXxl707650odB801BXKiF1BPlecaKaHeqhqbyhmNzQmO1a4SW2Hj26bikQzutLzivztX9VTXicgvSgsumPx//KLwjq5dH4NdeaV0MvyVn+815CXNKULhKvzC7lIUqtmapNk+EK+We3GYu2ZpmLY+c1y1Fgq0FB+ntfyLH1uZuOZVjKxJye67GpBASGeVAnrHsjxNURH6bI4r8/nCB51bG/U/rmFs8ddg721jae1J27H6d9Iieh3nP6NY69c+8eu4/RvnL8+WvvxXvV/dnD6Teevd2r/BCvxZ/zjae3hBt4edrh2ag/FFXQ/O/vHp5x7z/dSy7VNtyN4FM8e1pZ4NTN+Xl1ZXl7uGR33lpa+/NOfl5eXxcBbMPaHgX989ac/Ly8vvxiMRH479GJl9ef/+O340OBbb/37Ueqrr18Mvv2fI0MvVlZPxmPHtrOpr75efjH49ltHX2S//Ob/IMQ/PF7Jpr76enn5xeCZ9/5r6MVfFv7CrAgACt7Rd0d+rQhVKrIv94yOD/z7p5XVn/VlrqziROStwSGpyJ7RifBve5YfvTwReetXJan4N+QPAqudzNpZfceJyPHAcX1F+kRF2FI4M+F98fAvBhHYgnd0/JhHzhF8+8xb/3769aMCv+XzqyvLy8svBt9u9Naw8XorFVj2lFr6htKCBjCy//3vKz2j7x4/MdiYFuIvnmFFxOGiK/c2DIy5ps65TvVWF++pVBz1MOXS+TXUtVf2owe19TUAWP2lU6rBNgpXA8isFBCIyNJTdkuGq2s37rtGrJ2ZKAlQJZLJZDIZ9pXMdN7Y8vOcljdaS3M13jdkfYw0GGTPzC8VEIjEFEPYZkVEF9GV0YaNR9LBPL87sSeK7drEFnbhONIPbEnnU2xaOijeAPuEqwGeE1j2UzJcW7tB31W4WRVJOrb1+GUwlkgmvIaPLtny87yWN6Bp40UrtScAb5JdVAsLlGXJ4zYrIrqJrvS8ALBeezaKkWHH2SecYdaOMTDmmhoD1Cvi1rFTuFoshhVu1bJvkuGq2vn6zqxIK3GdzxUnAianGzDk5/ktz4Qje8NKbcZc2dmFeNRfzBb8ykNxKbj7itCV0QYRhU45IMUNmgiWt8nxIUcPqj/e27t5b+/mvdb2VByocLVEZk2+Dz0IyfBG7c37Lom1MxPV5QqRgFsKcbBhy89zWd4Y0+yylZrbU5tPKdptmF2Ih32l3EKmoQ1mtSKii+naNS+wulb73bBjYNRx/Pvaj2/i1LBrariZYDkTbrX11Se1d+pnuAGQ97dZ4WCFqyUax23bJhmeZ9Zu1HddRUwFd9XdftPFnk5+ntvybH1u/saDaU9mmeyG67NvRsTdDJl6x8RTaQwmA3HoIK0yBWcjrlPexjay999zjcDwDM2O01kp7v17o4OnnWa1M/W/ScGdeL3o4jWv/ajPHnYc6QV27Ku9s1Lc+/daAE87D/NLCQRhA+R5FXz7ffXiOUW0wfjQ+P3AVinuNjjIdmre4JDpVlMRhBEUbSAIgrCbLt7bQBAE8YpCnpcgCMJuyPMSBEHYDXlegiAIuyHPSxAEYTfkeQmCIOyGPC9BEITdkOclCIKwG/K8BEEQdkOelyAIwm7I8xIEQdgNeV6CIAi7Ia0yJZNXb8z47iZmrh90QxpYaNLk1RszggcAcrfrGZiJBEEcLLTmtYfpuXQ6fePq5H7WsTh7OZFIzGXKTRMJgjhYyPPuP9Nz6fR4iXwfQRAyfNGG6bn0eCkzJAiecuZ2NnxJ8JQzc5dnFxX3soqbWUViI7VZolSgWNmlUKNu8Q/MivRMXr3xGT6/65sRSxAvVd2wSx9+GNf3KHH5rtxbZXZ1O+W06bn0hdLc5/hM/INxo6bnLpTmErO4ekN3cuH0XPpSiCsIwNUkKyiM3LA8QRA2wb3mDQm+u4nbOY9wSfw3fGES03MzwtrtRCKRSMxlhi6JN9OTVz+TExOJhjNmJibweULKDuGzq5MApucuhXK3E/Idcu725dlFdkUGeISZC6U5MX/ogsmVuh5JyZfE7InbudCluWnAsHaPMDPju9uspuszbfs1uUmNeqwYRM/k1RuXhjJzdcvPzE2310CCIKzB7XnLmfR15b+YXZweD+VuS150cfau6I0BAKFxxldZl7g4OyP7pMW72bLHFwamx0PI/XBdTsPQ6CRgXBEL0VkryuTtkTo7rv+QQ2jcrPZyZm7mOkdNRlyfafwMmaHrkTWDaJlOCJ7cXcn0i7OfZ8rM8SIIYt9oY2/D5OgQQpfS6Uv1lHIGwOLs5fBcWkyv38gyE1URCAA5ANlSGcL4NHAdkxfCnnL27iImLzAr2neypTJ8Rt0EUM7elX84Zi/bebtu3CReyqVsh9tEEIQF2txVxg4xXp9JXAeA6bn0zI2rEP2sLjE8NyMgM5eYXYQUfgWw+NPajCB7lXJmbnYRmDSsaH8J+zzlEsCu3foKt7O0ZxCPLwxIPxZhn8f8YoIgOk0bexsW72bLUiTUgGyJ8Txflbj2k7T4/Uxc+05evSBFeROJREJaGjevqDlDo5OAGB/l9DOTVy+Eytm7HandgOm5dDrdQsltNun6DznU49KTVy+ENPEWgiD2m9bXvFcnF2cv4+qNmfpdbzkzd3kWqghC7nZidlEbVpASF9OZCzPS6jaXyZQFH7A4ezeRVt5Hi6EJVkX8t/eLs59fuDEzk07PoJy5nSlf8pldXb+Nr9fSXu3Kvgsz6fRMB/YSNLX8pXT6EnK3EzNZVuL1mQTm0jPp9AxQHw6CIOyjy05917yxNXn1xkw4S5ueCIJ4teiyNynUMcfJC2GPHJAgCIJ4ZeiyNa/2PQrSGiAI4hWk6zwvQRDEK0+XRRsIgiBeA8jzEgRB2A15XoIgCLshz0sQBGE35HkJgiDshjwvQRCE3ZDnJQiCsBvyvARBEHZDnpcgCMJuyPMSBEHYDXlegiAIuyHPSxAEYTfkeQmCIOzm/wF5FHFxmUMOjwAAAABJRU5ErkJggg=="},6204:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/variabel-4-11c9b8e77e4ddf88a314c0b480337a42.png"},3264:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdYAAACECAIAAACiSZ1FAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6Mzc6MjErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjE5OjE1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjE5OjE1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU5OGU3MjAwLTc5NmUt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"},4247:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdYAAACaCAIAAACblf6uAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6NDY6MzErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjE4OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjE4OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmYxYzM2MTU5LTFkMWIt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"}}]); \ No newline at end of file diff --git a/assets/js/87499f15.679ef493.js b/assets/js/87499f15.679ef493.js deleted file mode 100644 index 8bb3f26c..00000000 --- a/assets/js/87499f15.679ef493.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7742],{3905:(a,e,n)=>{n.d(e,{Zo:()=>s,kt:()=>k});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var p=i.createContext({}),d=function(a){var e=i.useContext(p),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},s=function(a){var e=d(a.components);return i.createElement(p.Provider,{value:e},a.children)},u={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},A=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,p=a.parentName,s=m(a,["components","mdxType","originalType","parentName"]),A=d(n),k=t,g=A["".concat(p,".").concat(k)]||A[k]||u[k]||l;return n?i.createElement(g,r(r({ref:e},s),{},{components:n})):i.createElement(g,r({ref:e},s))}));function k(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=A;var m={};for(var p in e)hasOwnProperty.call(e,p)&&(m[p]=e[p]);m.originalType=a,m.mdxType="string"==typeof a?a:t,r[1]=m;for(var d=2;d{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>m,toc:()=>d});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:4,title:"A.4. Variabel",sidebar_label:"A.4. Variabel"},r=void 0,m={unversionedId:"basic/variabel",id:"basic/variabel",title:"A.4. Variabel",description:"Rust merupakan bahasa yang kalau dikategorikan berdasarkan type system-nya adalah statically typed, yang artinya semua tipe data harus diketahui saat kompilasi (compile time).",source:"@site/docs/basic/variabel.md",sourceDirName:"basic",slug:"/basic/variabel",permalink:"/basic/variabel",draft:!1,tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4,title:"A.4. Variabel",sidebar_label:"A.4. Variabel"},sidebar:"tutorialSidebar",previous:{title:"A.3. Komentar",permalink:"/basic/komentar"},next:{title:"A.5. Tipe Data \u279c Primitive Scalar",permalink:"/basic/tipe-data-primitive-scalar"}},p={},d=[{value:"A.4.1. Deklarasi variabel menggunakan let",id:"a41-deklarasi-variabel-menggunakan-let",level:2},{value:"\u25c9 Aturan penamaan variabel (naming convention)",id:"-aturan-penamaan-variabel-naming-convention",level:3},{value:"\u25c9 Macro println untuk print string",id:"-macro-println-untuk-print-string",level:3},{value:"A.4.2. Immutability pada variabel",id:"a42-immutability-pada-variabel",level:2},{value:"A.4.3. Keyword mut",id:"a43-keyword-mut",level:2},{value:"\u25c9 Argument parameter macro println",id:"-argument-parameter-macro-println",level:3},{value:"A.4.4. Type Inference vs Manifest Typing",id:"a44-type-inference-vs-manifest-typing",level:2},{value:"\u25c9 Metode Type Inference",id:"-metode-type-inference",level:3},{value:"\u25c9 Metode Manifest Typing",id:"-metode-manifest-typing",level:3},{value:"A.4.5. Deklarasi variabel tanpa predefined value",id:"a45-deklarasi-variabel-tanpa-predefined-value",level:2},{value:"A.4.6. Deklarasi banyak variabel dalam satu statement",id:"a46-deklarasi-banyak-variabel-dalam-satu-statement",level:2},{value:"A.4.7. Deklarasi variabel dengan tipe data ditentukan dari value",id:"a47-deklarasi-variabel-dengan-tipe-data-ditentukan-dari-value",level:2},{value:"A.4.8. Variable Shadowing",id:"a48-variable-shadowing",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:d};function u(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},s,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Rust merupakan bahasa yang kalau dikategorikan berdasarkan ",(0,t.kt)("em",{parentName:"p"},"type system"),"-nya adalah ",(0,t.kt)("em",{parentName:"p"},"statically typed"),", yang artinya semua tipe data harus diketahui saat kompilasi (compile time)."),(0,t.kt)("p",null,"Pada chapter ini kita akan belajar mengenai variabel pada Rust, cara deklarasinya, dan juga mengenai ",(0,t.kt)("em",{parentName:"p"},"immutability")," variabel."),(0,t.kt)("h2",{id:"a41-deklarasi-variabel-menggunakan-let"},"A.4.1. Deklarasi variabel menggunakan ",(0,t.kt)("inlineCode",{parentName:"h2"},"let")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"let")," digunakan untuk deklarasi variabel. Notasinya kurang lebih seperti berikut. Di contoh ini sebuah variabel bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_variabel")," didefinisikan dan diisi nilainya dengan sebuah string ",(0,t.kt)("inlineCode",{parentName:"p"},'"predefined value"'),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let nama_variabel = "predefined value";\n println!(nama_variabel);\n}\n')),(0,t.kt)("p",null,"Ok, sekarang coba jalankan, dan lanjut ke pembahasan dibawah."),(0,t.kt)("h3",{id:"-aturan-penamaan-variabel-naming-convention"},"\u25c9 Aturan penamaan variabel (naming convention)"),(0,t.kt)("p",null,(0,t.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},(0,t.kt)("em",{parentName:"a"},"Naming convention"))," variabel di Rust adalah ",(0,t.kt)("strong",{parentName:"p"},"snake case"),". Nama variabel dituliskan dalam huruf kecil dengan separator tanda garis bawah atau underscore (",(0,t.kt)("inlineCode",{parentName:"p"},"_"),"). Contohnya seperti: ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_variabel"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"hasil_operasi_pembagian"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"kota_kelahiran"),", dll."),(0,t.kt)("h3",{id:"-macro-println-untuk-print-string"},"\u25c9 Macro ",(0,t.kt)("inlineCode",{parentName:"h3"},"println")," untuk print string"),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"variabel rust",src:n(7281).Z,width:"455",height:"228"})),(0,t.kt)("p",null,"Error? kok bisa?"),(0,t.kt)("p",null,"Perlu diketahui bahwa pada penggunaan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", parameter pertama wajib diisi dengan sebuah ",(0,t.kt)("strong",{parentName:"p"},"string literal"),". Contohnya seperti ",(0,t.kt)("inlineCode",{parentName:"p"},'"Hello, world!"'),". String literal yang ditampung terlebih dahulu dalam variabel, kemudian variabel-nya di print, akan menghasilkan error, contohnya seperti di atas."),(0,t.kt)("p",null,"Solusinya bagaimana? ya tetap menggunakan string literal, tapi dengan menerapkan teknik ",(0,t.kt)("strong",{parentName:"p"},"formatted print"),"."),(0,t.kt)("p",null,"Sekarang ubah kode menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let nama_variabel = "predefined value";\nprintln!("{}", nama_variabel);\n')),(0,t.kt)("p",null,"Bisa dilihat argument pertama statement macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," adalah string literal ",(0,t.kt)("inlineCode",{parentName:"p"},'"{}"'),". String ",(0,t.kt)("inlineCode",{parentName:"p"},"{}")," pada macro tersebut akan di-replace dengan isi argument setelahnya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"nama_variabel"),"."),(0,t.kt)("p",null,"Jika dijalankan, maka hasilnya tidak ada error dan menampilkan output sesuai harapan."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"string literal println",src:n(3283).Z,width:"473",height:"137"})),(0,t.kt)("p",null,"Ok sekarang kembali ke topik, yaitu perihal variabel."),(0,t.kt)("h2",{id:"a42-immutability-pada-variabel"},"A.4.2. ",(0,t.kt)("em",{parentName:"h2"},"Immutability")," pada variabel"),(0,t.kt)("p",null,"Tulis kode berikut. Ada 2 variabel yang dideklarasikan, ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number")," yang isinya numerik, dan ",(0,t.kt)("inlineCode",{parentName:"p"},"message1")," yang isinya string."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n')),(0,t.kt)("p",null,"Jalankan, hasilnya tidak ada error, aman."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"var immutability",src:n(5394).Z,width:"467",height:"119"})),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"O iya, jika ingin menampilkan banyak variabel via macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println"),", manfaatkan string ",(0,t.kt)("inlineCode",{parentName:"p"},"{}"),"."),(0,t.kt)("p",{parentName:"blockquote"},"Tulis ",(0,t.kt)("inlineCode",{parentName:"p"},"{}")," sejumlah variabel yang ingin ditampilkan, pada output string ",(0,t.kt)("inlineCode",{parentName:"p"},"{}")," akan di-replace oleh variabel yang disisipkan pada argument saat pemanggilan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," secara berurutan."),(0,t.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, string ",(0,t.kt)("inlineCode",{parentName:"p"},'"message number {}: {}"'),(0,t.kt)("br",null)," ... akan menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},'"message number {message_number}: {message1}"'),(0,t.kt)("br",null)," ... kemudian menghasilkan ",(0,t.kt)("inlineCode",{parentName:"p"},'"message number 1: hello"'))),(0,t.kt)("p",null,"Sekarang ubah isi ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number")," menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"2")," lalu siapkan juga variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message2"),", kurang lebih kodenya menjadi seperti berikut, kemudian jalankan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n\nmessage_number = 2;\nlet message2 = "world";\nprintln!("message number {}: {}", message_number, message2);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"var immutability",src:n(6204).Z,width:"585",height:"308"})),(0,t.kt)("p",null,"Error? kok bisa?"),(0,t.kt)("p",null,"Perlu diketahui, bahwa ",(0,t.kt)("em",{parentName:"p"},"by default")," semua variabel adalah ",(0,t.kt)("em",{parentName:"p"},"immutable"),". Immutable itu artinya gak bisa diubah nilai/value-nya. Jadi mirip seperti konstanta."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Variabel immutable mirip seperti konstanta, tapi sebenarnya berbeda. Akan kita bahas lebih detail di beberapa chapter berbeda perihal perbedaannya.")),(0,t.kt)("p",null,"Lalu bagaimana cara agar nilai variabel bisa diubah? Caranya dengan menambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," (yang merupakan kependekan dari ",(0,t.kt)("em",{parentName:"p"},"mutable"),") saat pendefinisian variabel tersebut."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Catatan tambahan:"),(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Operasi assignment pada variabel immutable hanya boleh dilakukan sekali. Dan pada kode di atas telah dicontohkan caranya bagaimana. Variabel dideklarasikan sekaligus diisi nilainya.")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Perlu diketahui bahwa sebenarnya diperbolehkan untuk memecah statement deklarasi variable dan assignment nilai sebagai 2 statement terpisah. Lebih jelasnya dibahas setelah ini pada section ",(0,t.kt)("a",{parentName:"p",href:"/basic/variabel#a45-deklarasi-variabel-tanpa-predefined-value"},"section A.4.5"),".")))),(0,t.kt)("h2",{id:"a43-keyword-mut"},"A.4.3. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"mut")),(0,t.kt)("p",null,"Ok, mari kita coba, ubah statement deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number"),", tambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut"),". Lalu jalankan ulang program."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n\nmessage_number = 2;\nlet message2 = "world";\nprintln!("message number {}: {}", message_number, message2);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"mut keyword",src:n(3264).Z,width:"470",height:"132"})),(0,t.kt)("p",null,"Ok, sekarang tidak muncul error."),(0,t.kt)("p",null,"Dengan menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"let mut")," pada pendefinisian ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number"),", membuat variabel tersebut menjadi mutable atau bisa diubah nilainya."),(0,t.kt)("h3",{id:"-argument-parameter-macro-println"},"\u25c9 Argument parameter macro ",(0,t.kt)("inlineCode",{parentName:"h3"},"println")),(0,t.kt)("p",null,"Selanjutnya, coba tambahkan lagi 1 message baru pada program yang sudah dibuat, lalu run."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut message_number = 1;\nlet message1 = "hello";\nprintln!("message number {}: {}", message_number, message1);\n\nmessage_number = 2;\nlet message2 = "world";\nprintln!("message number {}: {}", message_number, message2);\n\nmessage_number = 3;\nlet message3: i8 = 24;\nprintln!("message number {1}: {0}", message3, message_number);\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"formatted print macro `println`",src:n(4247).Z,width:"470",height:"154"})),(0,t.kt)("p",null,"Jika dilihat ada yg berbeda pada cara deklarasi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," dan juga pada statement ",(0,t.kt)("inlineCode",{parentName:"p"},"println")," untuk ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," yang disitu digunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"{1}")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"{0}"),", tidak seperti sebelumnya yg menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"{}"),". Kita akan bahas yg ke-2 terlebih dahulu."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{}"),", maka string akan di-replace sesuai urutan argument pada pemanggilan ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),"."),(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{0}"),", maka string akan di-replace dengan data pada argument ke ",(0,t.kt)("inlineCode",{parentName:"li"},"1")," pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),", yang pada contoh di atas adalah ",(0,t.kt)("inlineCode",{parentName:"li"},"message3"),"."),(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{1}"),", maka string akan di-replace dengan data pada argument ke ",(0,t.kt)("inlineCode",{parentName:"li"},"2")," pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),", yang pada contoh di atas adalah ",(0,t.kt)("inlineCode",{parentName:"li"},"message_number"),"."),(0,t.kt)("li",{parentName:"ul"},"Jika menggunakan ",(0,t.kt)("inlineCode",{parentName:"li"},"{n}"),", maka string akan di-replace dengan data pada argument ke ",(0,t.kt)("inlineCode",{parentName:"li"},"n+1")," pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"println"),".")),(0,t.kt)("p",null,"Dengan ini maka 3 statement berbeda berikut akan menghasilkan output yang sama:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'println!("message number {}: {}", message_number, message3);\nprintln!("message number {0}: {1}", message_number, message3);\nprintln!("message number {1}: {0}", message3, message_number);\n')),(0,t.kt)("p",null,"Sekarang perihal perbedaan cara deklarasi ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," akan kita bahas dibawah ini."),(0,t.kt)("h2",{id:"a44-type-inference-vs-manifest-typing"},"A.4.4. ",(0,t.kt)("em",{parentName:"h2"},"Type Inference")," vs ",(0,t.kt)("em",{parentName:"h2"},"Manifest Typing")),(0,t.kt)("p",null,"Rust mendukung dua metode deklarasi variabel, yaitu ",(0,t.kt)("em",{parentName:"p"},"type inference")," dan ",(0,t.kt)("em",{parentName:"p"},"manifest typing"),"."),(0,t.kt)("h3",{id:"-metode-type-inference"},"\u25c9 Metode ",(0,t.kt)("em",{parentName:"h3"},"Type Inference")),(0,t.kt)("p",null,"Penulisan variabel dengan metode ini ditandai dengan tidak menuliskan tipe data secara jelas/eksplisit. Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let var1 = "hello" // compiler akan secara cerdas mendeteksi var1 tipe data nya string\nlet var2 = 12 // compiler akan secara cerdas mendeteksi var2 tipe data nya numerik\n')),(0,t.kt)("p",null,"Metode deklarasi yang selama ini sudah kita terapkan adalah ",(0,t.kt)("em",{parentName:"p"},"type inference"),"."),(0,t.kt)("h3",{id:"-metode-manifest-typing"},"\u25c9 Metode ",(0,t.kt)("em",{parentName:"h3"},"Manifest Typing")),(0,t.kt)("p",null,"Metode ini mewajibkan programmer untuk menuliskan secara jelas/eksplisit tipe data variabel. Contoh penerapannya bisa dilihat di praktik sebelumnya, pada definisi variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message3"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"let message3: i8 = 24;\n")),(0,t.kt)("p",null,"Notasi penulisan tipe data adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"namavariabel: tipedata"),". Contoh seperti di atas, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"let message3: i8 = 24")," artinya variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message3")," didefinisikan memiliki tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"i8"),"."),(0,t.kt)("p",null,(0,t.kt)("inlineCode",{parentName:"p"},"i8")," merupakan salah satu tipe data dari sekian banyak tipe data yang ada di Rust. Lebih jelasnya kita akan bahas pada chapter selanjutnya."),(0,t.kt)("h2",{id:"a45-deklarasi-variabel-tanpa-predefined-value"},"A.4.5. Deklarasi variabel tanpa ",(0,t.kt)("em",{parentName:"h2"},"predefined value")),(0,t.kt)("p",null,"Sesuai dengan penjelasan di ",(0,t.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/error-index.html#E0381"},"dokumentasi spesifikasi Rust"),", variable yang tidak ada value-nya akan memunculkan error saat program di-run."),(0,t.kt)("p",null,"Meski demikian, diperbolehkan untuk memisahkan variable statement untuk deklarasi variable dan pengisian value. Sebagai contoh, statement ",(0,t.kt)("inlineCode",{parentName:"p"},"message_number")," pada kode berikut ..."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number = 1;\nprintln!("message number {}", message_number);\n')),(0,t.kt)("p",null,"... boleh dituliskan dalam 2 statement terpisah seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let message_number: i32;\nmessage_number = 1;\nprintln!("message number {}", message_number);\n')),(0,t.kt)("p",null,"Intinya, operasi assignment hanya diperbolehkan 1x saja pada variabel ",(0,t.kt)("em",{parentName:"p"},"immutable"),", baik itu saat deklarasi variable atau setelahnya."),(0,t.kt)("h2",{id:"a46-deklarasi-banyak-variabel-dalam-satu-statement"},"A.4.6. Deklarasi banyak variabel dalam satu statement"),(0,t.kt)("p",null,"Di Rust memungkinkan untuk mendefinisikan banyak variabel dalam 1 baris statement. Notasi penulisannya seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let (var1, var2) = (24, "hello");\nprintln!("var1: {0}", var1); // hasilnya => var1: 24\nprintln!("var2: {0}", var2); // hasilnya => var2: hello\n')),(0,t.kt)("p",null,"Pendefinisian banyak variabel dalam 1 statement dilakukan dengan menuliskan semua variabelnya dengan separator tanda ",(0,t.kt)("inlineCode",{parentName:"p"},",")," dan diapit tanda kurung ",(0,t.kt)("inlineCode",{parentName:"p"},"()"),"."),(0,t.kt)("p",null,"Sebagai contoh di atas 2 variabel didefinisikan, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"var1")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"var2"),", dan keduanya memiliki value yang berbeda tipe-datanya."),(0,t.kt)("p",null,"Bisa juga saat definisi variabel sekaligus ditentukan tipe data variabel, notasi penulisan bisa dilihat pada contoh kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let (var3, var4): (i8, i8) = (32, 12);\nprintln!("var3: {0}", var3); // hasilnya => var3: 32\nprintln!("var4: {0}", var4); // hasilnya => var4: 12\n')),(0,t.kt)("p",null,"Dengan notasi ini bisa juga untuk definisi variabel ",(0,t.kt)("em",{parentName:"p"},"mutable"),". Cukup tambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," pada variabel yang ingin bisa diubah nilainya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let (var5, mut var6, var7): (i8, i8, i8) = (64, 12, 4);\nprintln!("var5: {0}", var5); // hasilnya => var5: 64\nprintln!("var6: {0}", var6); // hasilnya => var6: 12\nvar6 = 24;\nprintln!("var6: {0}", var6); // hasilnya => var6: 24\nprintln!("var7: {0}", var7); // hasilnya => var7: 4\n')),(0,t.kt)("h2",{id:"a47-deklarasi-variabel-dengan-tipe-data-ditentukan-dari-value"},"A.4.7. Deklarasi variabel dengan tipe data ditentukan dari value"),(0,t.kt)("p",null,"Ini merupakan salah satu alternatif cara penulisan untuk men-specify tipe data variabel, caranya dengan menuliskan tipe data tepat setelah value, contohnya seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let data1 = 24i8;\nprintln!("data1: {0}", data1); // hasilnya => data1: 24\n')),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data")," didefinisikan dengan predefined value adalah numerik ",(0,t.kt)("inlineCode",{parentName:"p"},"24")," dengan tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"i8"),", penulisan value nya menjadi ",(0,t.kt)("inlineCode",{parentName:"p"},"24i8"),"."),(0,t.kt)("p",null,"Boleh juga menggunakan separator ",(0,t.kt)("inlineCode",{parentName:"p"},"_")," dalam penulisan value-nya sebagai pembatas antara nilai dan tipe data, contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let data1 = 24_i8;\nprintln!("data1: {0}", data1); // hasilnya => data1: 24\n')),(0,t.kt)("h2",{id:"a48-variable-shadowing"},"A.4.8. Variable ",(0,t.kt)("em",{parentName:"h2"},"Shadowing")),(0,t.kt)("p",null,"Di Rust ada konsep bernama ",(0,t.kt)("strong",{parentName:"p"},"variable shadowing"),". Shadowing sendiri adalah pendefinisan ulang variabel yang sebelumnya sudah didefinisikan. Biasanya teknik ini dipakai untuk isolasi variabel dalam sebuah blok kode."),(0,t.kt)("p",null,"Contoh shadowing bisa dilihat pada kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let x = 5;\nprintln!("x: {}", x); // hasilnya => x: 5\n\nlet x = x + 1;\nprintln!("x: {}", x); // hasilnya => x: 6\n')),(0,t.kt)("p",null,"Lebih jelasnya akan kita bahas pada chapter terpisah, yaitu ",(0,t.kt)("a",{parentName:"p",href:"/basic/shadowing"},"Shadowing"),"."),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"_"))),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/variabel"},"github.com/novalagung/dasarpemrogramanrust-example/../variabel")),(0,t.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/shadowing"},"Shadowing")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"#/wip/macro"},"Macro")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"#/wip/formatted-print"},"Formatted Print"))),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html"},"https://doc.rust-lang.org/book/ch03-01-variables-and-mutability.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/hello/print.html"},"https://doc.rust-lang.org/rust-by-example/hello/print.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html"},"https://doc.rust-lang.org/rust-by-example/variable_bindings/scope.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/variables.html"},"https://doc.rust-lang.org/reference/variables.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/38045700/how-do-i-declare-multiple-mutable-variables-at-the-same-time"},"https://stackoverflow.com/questions/38045700/how-do-i-declare-multiple-mutable-variables-at-the-same-time"))))}u.isMDXComponent=!0},7281:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/variabel-1-c9d8201d5914e2a0da75b23e92fa5bb9.png"},3283:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdkAAACJCAIAAADv3NUWAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6MTU6NDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjIyOjM3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjIyOjM3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMwYWNkNzk4LTkwODAt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"},5394:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdMAAAB3CAIAAADXZj22AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6MjE6NTMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjIxOjMxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjIxOjMxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJkY2VmNWQ3LWNkNWUt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"},6204:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/variabel-4-11c9b8e77e4ddf88a314c0b480337a42.png"},3264:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdYAAACECAIAAACiSZ1FAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6Mzc6MjErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjE5OjE1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjE5OjE1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmU5OGU3MjAwLTc5NmUt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"},4247:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdYAAACaCAIAAACblf6uAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6NDY6MzErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjE4OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjE4OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmYxYzM2MTU5LTFkMWIt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"}}]); \ No newline at end of file diff --git a/assets/js/8b55bf27.a01d27dd.js b/assets/js/8b55bf27.c5401f96.js similarity index 65% rename from assets/js/8b55bf27.a01d27dd.js rename to assets/js/8b55bf27.c5401f96.js index c92d97ec..a3e5107b 100644 --- a/assets/js/8b55bf27.a01d27dd.js +++ b/assets/js/8b55bf27.c5401f96.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9886],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=a.createContext({}),o=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=o(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=o(n),k=i,c=u["".concat(p,".").concat(k)]||u[k]||m[k]||r;return n?a.createElement(c,l(l({ref:t},d),{},{components:n})):a.createElement(c,l({ref:t},d))}));function k(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=u;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:i,l[1]=s;for(var o=2;o{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>o});var a=n(7462),i=(n(7294),n(3905));const r={sidebar_position:45,title:"A.45. Tipe Data \u279c String Custom Type",sidebar_label:"A.45. Tipe Data \u279c String Custom Type"},l=void 0,s={unversionedId:"basic/tipe-data-custom-type-string-slice",id:"basic/tipe-data-custom-type-string-slice",title:"A.45. Tipe Data \u279c String Custom Type",description:"Pembahasan kali ini lingkupnya masih dalam topik custom type String.",source:"@site/docs/basic/tipe-data-custom-type-string-slice.md",sourceDirName:"basic",slug:"/basic/tipe-data-custom-type-string-slice",permalink:"/basic/tipe-data-custom-type-string-slice",draft:!1,tags:[],version:"current",sidebarPosition:45,frontMatter:{sidebar_position:45,title:"A.45. Tipe Data \u279c String Custom Type",sidebar_label:"A.45. Tipe Data \u279c String Custom Type"},sidebar:"tutorialSidebar",previous:{title:"A.44. String Literal (&str) vs. String Custom Type",permalink:"/basic/string-slice-vs-string-literal"},next:{title:"A.46. Closures",permalink:"/basic/closures"}},p={},o=[{value:"A.45.1. Pembuatan string slice",id:"a451-pembuatan-string-slice",level:2},{value:"\u25c9 Method to_string milik &str",id:"-method-to_string-milik-str",level:3},{value:"\u25c9 String::from",id:"-stringfrom",level:3},{value:"\u25c9 String::new",id:"-stringnew",level:3},{value:"\u25c9 String::from_utf8",id:"-stringfrom_utf8",level:3},{value:"A.45.2. String mutability",id:"a452-string-mutability",level:2},{value:"\u25c9 Keyword mut",id:"-keyword-mut",level:3},{value:"\u25c9 Replace string / method replace",id:"-replace-string--method-replace",level:3},{value:"\u25c9 Prepend string / method insert_str",id:"-prepend-string--method-insert_str",level:3},{value:"\u25c9 Prepend char / method insert",id:"-prepend-char--method-insert",level:3},{value:"\u25c9 Append string / method push_str",id:"-append-string--method-push_str",level:3},{value:"\u25c9 Append char / method push",id:"-append-char--method-push",level:3},{value:"\u25c9 Clear string / method clear",id:"-clear-string--method-clear",level:3},{value:"A.45.3. Operasi string lainnya",id:"a453-operasi-string-lainnya",level:2},{value:"\u25c9 Cek substring / method contains",id:"-cek-substring--method-contains",level:3},{value:"\u25c9 Concat strings / slice join",id:"-concat-strings--slice-join",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:o};function m(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pembahasan kali ini lingkupnya masih dalam topik custom type ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("p",null,"Penulis rasa 2 chapter terakhir sudah cukup banyak menjelaskan perihal apa itu tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", apa perbedaannya dibanding ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", dan kapan harus menggunakannya."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Pembahasan mengenai perbedaan ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," vs ",(0,i.kt)("inlineCode",{parentName:"li"},"&str")," bisa dilihat pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type")),(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang bagaimana data pada string slice di-manage di memory bisa dilihat pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management")))),(0,i.kt)("p",null,"Chapter ini akan lebih fokus ke fitur yang tersedia pada tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("h2",{id:"a451-pembuatan-string-slice"},"A.45.1. Pembuatan string slice"),(0,i.kt)("p",null,"Ada banyak cara yang bisa digunakan dalam membuat data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", di antaranya:"),(0,i.kt)("h3",{id:"-method-to_string-milik-str"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"to_string")," milik ",(0,i.kt)("inlineCode",{parentName:"h3"},"&str")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"to_string")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," mengkonversi string literal menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str2 = "iPhone 8".to_string();\nprintln!("{str2}"); // iPhone 8\n')),(0,i.kt)("h3",{id:"-stringfrom"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::from")),(0,i.kt)("p",null,"Associated function ",(0,i.kt)("inlineCode",{parentName:"p"},"String::from")," digunakan untuk mengkonversi ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". Kita sudah cukup sering menggunakan fungsi ini."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("Nokia 3310");\nprintln!("{str1}"); // Nokia 3310\n')),(0,i.kt)("h3",{id:"-stringnew"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::new")),(0,i.kt)("p",null,"Associated function ",(0,i.kt)("inlineCode",{parentName:"p"},"String::new")," menghasilkan data string kosong."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str3 = String::new();\nprintln!("{str3}"); // ""\n')),(0,i.kt)("h3",{id:"-stringfrom_utf8"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::from_utf8")),(0,i.kt)("p",null,"Berguna untuk mengkonversi data bytes ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". Fungsi ini nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),", maka dalam penerapannya harus di-chain dengan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," untuk mendapatkan data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str4 = String::from_utf8(vec![78, 55, 51]).unwrap();\nprintln!("{str4}"); // N73\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h2",{id:"a452-string-mutability"},"A.45.2. String mutability"),(0,i.kt)("h3",{id:"-keyword-mut"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"mut")),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," bisa digunakan untuk mengganti/replace data string dengan data baru. Sebagai contoh, ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," berikut yang awalnya adalah string kosong di-replace dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"Pixel 5"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str5 = String::new();\nprintln!("{str5}");\n// ""\n\nstr5 = String::from("Pixel 5");\nprintln!("{str5}");\n// Pixel 5\n')),(0,i.kt)("h3",{id:"-replace-string--method-replace"},"\u25c9 Replace string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"replace")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"replace")," digunakan untuk mengganti suatu substring dengan string lain. Method ini menghasilkan object ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," baru dan tidak mengubah data string aslinya. Karena alasan itu juga kenapa tidak perlu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," dalam penerapannya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str9 = String::from("my phone is Pixel 6");\nlet str10 = str9.replace("Pixel 6", "Nokia 3310");\n\nprintln!("str9: {str9}"); // my phone is Pixel 6\nprintln!("str10: {str10}"); // my phone is Nokia 3310\n')),(0,i.kt)("h3",{id:"-prepend-string--method-insert_str"},"\u25c9 Prepend string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"insert_str")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert_str")," digunakan untuk menyisipkan substring pada posisi tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str6 = String::from("Pixel 6");\nprintln!("{str6}");\n// Pixel 6\n\nstr6.insert_str(0, "my phone");\nprintln!("{str6}");\n// my phonePixel 6\n\nstr6.insert_str(8, " is ");\nprintln!("{str6}");\n// my phone is Pixel 6\n')),(0,i.kt)("p",null,"Parameter pertama perlu diisi dengan indeks dimana string akan disisipkan."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"String ",(0,i.kt)("inlineCode",{parentName:"li"},"Pixel 6")," pada indeks 0 disisipi string ",(0,i.kt)("inlineCode",{parentName:"li"},"my phone"),", hasilnya ",(0,i.kt)("inlineCode",{parentName:"li"},"my phonePixel 6")),(0,i.kt)("li",{parentName:"ul"},"String ",(0,i.kt)("inlineCode",{parentName:"li"},"my phonePixel 6")," pada indeks 8 disisipi string ",(0,i.kt)("inlineCode",{parentName:"li"},"is"),", hasilnya ",(0,i.kt)("inlineCode",{parentName:"li"},"my phone is Pixel 6"))),(0,i.kt)("h3",{id:"-prepend-char--method-insert"},"\u25c9 Prepend char / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"insert")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert")," kegunaannya sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"insert_str")," yaitu untuk menyisipkan string pada posisi tertentu. Perbedaannya, pada method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert")," parameter kedua diisi dengan char."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut str7 = String::from(\"3310\");\n\nstr7.insert(0, 'N'); // N3310\nstr7.insert(1, 'o'); // No3310\nstr7.insert(2, 'k'); // Nok3310\nstr7.insert(3, 'i'); // Noki3310\nstr7.insert(4, 'a'); // Nokia3310\nstr7.insert(5, ' '); // Nokia 3310\n")),(0,i.kt)("h3",{id:"-append-string--method-push_str"},"\u25c9 Append string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"push_str")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"push_str")," digunakan untuk menambahkan string di akhir."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str8 = String::from("Pixel 6"); // Pixel 6\nstr8.push_str(" is a good phone"); // Pixel 6 is a good phone\n')),(0,i.kt)("h3",{id:"-append-char--method-push"},"\u25c9 Append char / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"push")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"push")," sama kegunaannya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"push_str"),", namun untuk penambahan data ",(0,i.kt)("inlineCode",{parentName:"p"},"char"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str8 = String::from("Pixel");\n\nstr8.push(\' \'); // "Pixel "\nstr8.push(\'7\'); // "Pixel 7"\n')),(0,i.kt)("h3",{id:"-clear-string--method-clear"},"\u25c9 Clear string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"clear")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"clear")," digunakan untuk mengosongkan data string."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str11 = String::from("Nokia 3310");\nstr11.clear();\nprintln!("{str11}"); // ""\n')),(0,i.kt)("h2",{id:"a453-operasi-string-lainnya"},"A.45.3. Operasi string lainnya"),(0,i.kt)("h3",{id:"-cek-substring--method-contains"},"\u25c9 Cek substring / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"contains")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"contains")," digunakan untuk mengecek apakah suatu substring yang dicari ada atau tidak. Method ini mengembalikan nilai bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"bool"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str11 = String::from("Nokia 3310");\n\nlet is_exists = str11.contains("3310");\nprintln!("{is_exists}"); // true\n\nlet is_exists = str11.contains("3315");\nprintln!("{is_exists}"); // false\n')),(0,i.kt)("h3",{id:"-concat-strings--slice-join"},"\u25c9 Concat strings / slice ",(0,i.kt)("inlineCode",{parentName:"h3"},"join")),(0,i.kt)("p",null,"Operasi concat string bisa dilakukan memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert_str")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"push_str"),". Selain itu juga bisa dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},".join")," milik slice. Caranya, jadikan string yang ingin di-gabung sebagai element array, kemudian akses method ",(0,i.kt)("inlineCode",{parentName:"p"},".join"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str12 = String::from("iPhone");\nlet str13 = String::from("12");\nlet str14 = String::from("Pro");\n\nlet str: String = [str12, str13, str14].join(" ");\n\nprintln!("{str}"); // iPhone 12 Pro\n')),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tipe_data_custom_type_string_slice"},"github.com/novalagung/dasarpemrogramanrust-example/../tipe_data_custom_type_string_slice")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-string-literal"},"Tipe Data \u279c String Literal (&str)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/static"},"Static Item")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/lifetime"},"Lifetime")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/string/struct.String.html"},"https://doc.rust-lang.org/std/string/struct.String.html"))))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9886],{3905:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>k});var a=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=a.createContext({}),o=function(e){var t=a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=o(e.components);return a.createElement(p.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},u=a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,r=e.originalType,p=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=o(n),k=i,c=u["".concat(p,".").concat(k)]||u[k]||m[k]||r;return n?a.createElement(c,l(l({ref:t},d),{},{components:n})):a.createElement(c,l({ref:t},d))}));function k(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=u;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:i,l[1]=s;for(var o=2;o{n.r(t),n.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>o});var a=n(7462),i=(n(7294),n(3905));const r={sidebar_position:45,title:"A.45. Tipe Data \u279c String Custom Type",sidebar_label:"A.45. Tipe Data \u279c String Custom Type"},l=void 0,s={unversionedId:"basic/tipe-data-custom-type-string-slice",id:"basic/tipe-data-custom-type-string-slice",title:"A.45. Tipe Data \u279c String Custom Type",description:"Pembahasan kali ini lingkupnya masih dalam topik custom type String.",source:"@site/docs/basic/tipe-data-custom-type-string-slice.md",sourceDirName:"basic",slug:"/basic/tipe-data-custom-type-string-slice",permalink:"/basic/tipe-data-custom-type-string-slice",draft:!1,tags:[],version:"current",sidebarPosition:45,frontMatter:{sidebar_position:45,title:"A.45. Tipe Data \u279c String Custom Type",sidebar_label:"A.45. Tipe Data \u279c String Custom Type"},sidebar:"tutorialSidebar",previous:{title:"A.44. String Literal (&str) vs. String Custom Type",permalink:"/basic/string-slice-vs-string-literal"},next:{title:"A.46. Closures",permalink:"/basic/closures"}},p={},o=[{value:"A.45.1. Pembuatan string slice",id:"a451-pembuatan-string-slice",level:2},{value:"\u25c9 Method to_string milik &str",id:"-method-to_string-milik-str",level:3},{value:"\u25c9 String::from",id:"-stringfrom",level:3},{value:"\u25c9 String::new",id:"-stringnew",level:3},{value:"\u25c9 String::from_utf8",id:"-stringfrom_utf8",level:3},{value:"A.45.2. String mutability",id:"a452-string-mutability",level:2},{value:"\u25c9 Keyword mut",id:"-keyword-mut",level:3},{value:"\u25c9 Replace string / method replace",id:"-replace-string--method-replace",level:3},{value:"\u25c9 Prepend string / method insert_str",id:"-prepend-string--method-insert_str",level:3},{value:"\u25c9 Prepend char / method insert",id:"-prepend-char--method-insert",level:3},{value:"\u25c9 Append string / method push_str",id:"-append-string--method-push_str",level:3},{value:"\u25c9 Append char / method push",id:"-append-char--method-push",level:3},{value:"\u25c9 Clear string / method clear",id:"-clear-string--method-clear",level:3},{value:"A.45.3. Operasi string lainnya",id:"a453-operasi-string-lainnya",level:2},{value:"\u25c9 Cek substring / method contains",id:"-cek-substring--method-contains",level:3},{value:"\u25c9 Concat strings / slice join",id:"-concat-strings--slice-join",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:o};function m(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pembahasan kali ini lingkupnya masih dalam topik custom type ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("p",null,"Penulis rasa 2 chapter terakhir sudah cukup banyak menjelaskan perihal apa itu tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", apa perbedaannya dibanding ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", dan kapan harus menggunakannya."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Pembahasan mengenai perbedaan ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," vs ",(0,i.kt)("inlineCode",{parentName:"li"},"&str")," bisa dilihat pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type")),(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang bagaimana data pada string slice di-manage di memory bisa dilihat pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management")))),(0,i.kt)("p",null,"Chapter ini akan lebih fokus ke fitur yang tersedia pada tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("h2",{id:"a451-pembuatan-string-slice"},"A.45.1. Pembuatan string slice"),(0,i.kt)("p",null,"Ada banyak cara yang bisa digunakan dalam membuat data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", di antaranya:"),(0,i.kt)("h3",{id:"-method-to_string-milik-str"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"to_string")," milik ",(0,i.kt)("inlineCode",{parentName:"h3"},"&str")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"to_string")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," mengkonversi string literal menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str2 = "iPhone 8".to_string();\nprintln!("{str2}"); // iPhone 8\n')),(0,i.kt)("h3",{id:"-stringfrom"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::from")),(0,i.kt)("p",null,"Associated function ",(0,i.kt)("inlineCode",{parentName:"p"},"String::from")," digunakan untuk mengkonversi ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". Kita sudah cukup sering menggunakan fungsi ini."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("Nokia 3310");\nprintln!("{str1}"); // Nokia 3310\n')),(0,i.kt)("h3",{id:"-stringnew"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::new")),(0,i.kt)("p",null,"Associated function ",(0,i.kt)("inlineCode",{parentName:"p"},"String::new")," menghasilkan data string kosong."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str3 = String::new();\nprintln!("{str3}"); // ""\n')),(0,i.kt)("h3",{id:"-stringfrom_utf8"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::from_utf8")),(0,i.kt)("p",null,"Berguna untuk mengkonversi data bytes ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". Fungsi ini nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),", maka dalam penerapannya harus di-chain dengan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," untuk mendapatkan data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str4 = String::from_utf8(vec![78, 55, 51]).unwrap();\nprintln!("{str4}"); // N73\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h2",{id:"a452-string-mutability"},"A.45.2. String mutability"),(0,i.kt)("h3",{id:"-keyword-mut"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"mut")),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," bisa digunakan untuk mengganti/replace data string dengan data baru. Sebagai contoh, ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," berikut yang awalnya adalah string kosong di-replace dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"Pixel 5"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str5 = String::new();\nprintln!("{str5}");\n// ""\n\nstr5 = String::from("Pixel 5");\nprintln!("{str5}");\n// Pixel 5\n')),(0,i.kt)("h3",{id:"-replace-string--method-replace"},"\u25c9 Replace string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"replace")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"replace")," digunakan untuk mengganti suatu substring dengan string lain. Method ini menghasilkan object ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," baru dan tidak mengubah data string aslinya. Karena alasan itu juga kenapa tidak perlu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," dalam penerapannya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str9 = String::from("my phone is Pixel 6");\nlet str10 = str9.replace("Pixel 6", "Nokia 3310");\n\nprintln!("str9: {str9}"); // my phone is Pixel 6\nprintln!("str10: {str10}"); // my phone is Nokia 3310\n')),(0,i.kt)("h3",{id:"-prepend-string--method-insert_str"},"\u25c9 Prepend string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"insert_str")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert_str")," digunakan untuk menyisipkan substring pada posisi tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str6 = String::from("Pixel 6");\nprintln!("{str6}");\n// Pixel 6\n\nstr6.insert_str(0, "my phone");\nprintln!("{str6}");\n// my phonePixel 6\n\nstr6.insert_str(8, " is ");\nprintln!("{str6}");\n// my phone is Pixel 6\n')),(0,i.kt)("p",null,"Parameter pertama menentukan posisi indeks string yang disisipkan."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"String ",(0,i.kt)("inlineCode",{parentName:"li"},"Pixel 6")," pada indeks 0 disisipi string ",(0,i.kt)("inlineCode",{parentName:"li"},"my phone"),", hasilnya ",(0,i.kt)("inlineCode",{parentName:"li"},"my phonePixel 6")),(0,i.kt)("li",{parentName:"ul"},"String ",(0,i.kt)("inlineCode",{parentName:"li"},"my phonePixel 6")," pada indeks 8 disisipi string ",(0,i.kt)("inlineCode",{parentName:"li"},"is"),", hasilnya ",(0,i.kt)("inlineCode",{parentName:"li"},"my phone is Pixel 6"))),(0,i.kt)("h3",{id:"-prepend-char--method-insert"},"\u25c9 Prepend char / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"insert")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert")," kegunaannya sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"insert_str")," yaitu untuk menyisipkan string pada posisi tertentu. Perbedaannya, pada method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert")," parameter kedua diisi dengan char."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut str7 = String::from(\"3310\");\n\nstr7.insert(0, 'N'); // N3310\nstr7.insert(1, 'o'); // No3310\nstr7.insert(2, 'k'); // Nok3310\nstr7.insert(3, 'i'); // Noki3310\nstr7.insert(4, 'a'); // Nokia3310\nstr7.insert(5, ' '); // Nokia 3310\n")),(0,i.kt)("h3",{id:"-append-string--method-push_str"},"\u25c9 Append string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"push_str")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"push_str")," digunakan untuk menambahkan string di akhir."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str8 = String::from("Pixel 6"); // Pixel 6\nstr8.push_str(" is a good phone"); // Pixel 6 is a good phone\n')),(0,i.kt)("h3",{id:"-append-char--method-push"},"\u25c9 Append char / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"push")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"push")," sama kegunaannya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"push_str"),", namun untuk penambahan data ",(0,i.kt)("inlineCode",{parentName:"p"},"char"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str8 = String::from("Pixel");\n\nstr8.push(\' \'); // "Pixel "\nstr8.push(\'7\'); // "Pixel 7"\n')),(0,i.kt)("h3",{id:"-clear-string--method-clear"},"\u25c9 Clear string / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"clear")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"clear")," digunakan untuk mengosongkan data string."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str11 = String::from("Nokia 3310");\nstr11.clear();\nprintln!("{str11}"); // ""\n')),(0,i.kt)("h2",{id:"a453-operasi-string-lainnya"},"A.45.3. Operasi string lainnya"),(0,i.kt)("h3",{id:"-cek-substring--method-contains"},"\u25c9 Cek substring / method ",(0,i.kt)("inlineCode",{parentName:"h3"},"contains")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"contains")," digunakan untuk mengecek apakah suatu substring yang dicari ada atau tidak. Method ini mengembalikan nilai bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"bool"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str11 = String::from("Nokia 3310");\n\nlet is_exists = str11.contains("3310");\nprintln!("{is_exists}"); // true\n\nlet is_exists = str11.contains("3315");\nprintln!("{is_exists}"); // false\n')),(0,i.kt)("h3",{id:"-concat-strings--slice-join"},"\u25c9 Concat strings / slice ",(0,i.kt)("inlineCode",{parentName:"h3"},"join")),(0,i.kt)("p",null,"Operasi concat string bisa dilakukan memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"insert_str")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"push_str"),". Selain itu juga bisa dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},".join")," milik slice. Caranya, jadikan string yang ingin di-gabung sebagai element array, kemudian akses method ",(0,i.kt)("inlineCode",{parentName:"p"},".join"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str12 = String::from("iPhone");\nlet str13 = String::from("12");\nlet str14 = String::from("Pro");\n\nlet str: String = [str12, str13, str14].join(" ");\n\nprintln!("{str}"); // iPhone 12 Pro\n')),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tipe_data_custom_type_string_slice"},"github.com/novalagung/dasarpemrogramanrust-example/../tipe_data_custom_type_string_slice")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-string-literal"},"Tipe Data \u279c String Literal (&str)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/static"},"Static Item")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/lifetime"},"Lifetime")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/string/struct.String.html"},"https://doc.rust-lang.org/std/string/struct.String.html"))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8d193b98.c7232d69.js b/assets/js/8d193b98.9b1c2896.js similarity index 61% rename from assets/js/8d193b98.c7232d69.js rename to assets/js/8d193b98.9b1c2896.js index 711b0a06..1f430ee6 100644 --- a/assets/js/8d193b98.c7232d69.js +++ b/assets/js/8d193b98.9b1c2896.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7505],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),p=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),m=p(a),k=n,b=m["".concat(l,".").concat(k)]||m[k]||c[k]||i;return a?r.createElement(b,o(o({ref:t},s),{},{components:a})):r.createElement(b,o({ref:t},s))}));function k(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var u={};for(var l in t)hasOwnProperty.call(t,l)&&(u[l]=t[l]);u.originalType=e,u.mdxType="string"==typeof e?e:n,o[1]=u;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>u,toc:()=>p});var r=a(7462),n=(a(7294),a(3905));const i={sidebar_position:3,title:"Contribution & Tech Stack",sidebar_label:"Contribution & Tech Stack"},o=void 0,u={unversionedId:"CONTRIBUTING",id:"CONTRIBUTING",title:"Contribution & Tech Stack",description:"Ebook Dasar Pemrograman Rust adalah project open source. Siapapun bebas untuk berkontribusi di sini, bisa dalam bentuk perbaikan typo, update kalimat, maupun submit tulisan baru.",source:"@site/docs/CONTRIBUTING.md",sourceDirName:".",slug:"/CONTRIBUTING",permalink:"/CONTRIBUTING",draft:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3,title:"Contribution & Tech Stack",sidebar_label:"Contribution & Tech Stack"},sidebar:"tutorialSidebar",previous:{title:"Pengenalan Rust Programming",permalink:"/pengelanan-rust-programming"},next:{title:"Download versi PDF",permalink:"/download-pdf"}},l={},p=[{value:"Checkout project",id:"checkout-project",level:2},{value:"Maintainer",id:"maintainer",level:2},{value:"Contributors",id:"contributors",level:2},{value:"Ebook/webhook techstack & architecture",id:"ebookwebhook-techstack--architecture",level:2}],s={toc:p};function c(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Ebook Dasar Pemrograman Rust adalah project open source. Siapapun bebas untuk berkontribusi di sini, bisa dalam bentuk perbaikan typo, update kalimat, maupun submit tulisan baru."),(0,n.kt)("p",null,"Bagi kawan-kawan yang berminat untuk berkontribusi, silakan fork ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/novalagung/dasarpemrogramanrust"},"github.com/novalagung/dasarpemrogramanrust"),", kemudian langsung saja cek/buat issue kemudian submit relevan pull request untuk issue tersebut \ud83d\ude0a"),(0,n.kt)("h2",{id:"checkout-project"},"Checkout project"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"git clone https://github.com/novalagung/dasarpemrogramanrust.git\ngit submodule update --init --recursive --remote\n")),(0,n.kt)("h2",{id:"maintainer"},"Maintainer"),(0,n.kt)("p",null,"E-book ini di-inisialisasi dan di-maintain oleh Noval Agung Prayogo."),(0,n.kt)("h2",{id:"contributors"},"Contributors"),(0,n.kt)("p",null,"Berikut merupakan hall of fame kontributor yang sudah berbaik hati menyisihkan waktunya untuk membantu pengembangan e-book ini."),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/acepsaepudin"},"Acep Saepudin")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/afifurrohman-id"},"Afifurrohman")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/d0tf"},"Fal")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/nferdazel"},"Fredianto")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/iyansr"},"I Putu Saputrayana")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/khisby"},"Khisby Al Ghofari")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/chud-lori"},"Lori")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/zakiego"},"M. Zakiyuddin Munziri")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/opakholis"},"Opa Kholis Majid")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/rian256"},"Rian")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/shandysiswandi"},"Shandy Siswandi")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/antheiz"},"Theis Andatu")),(0,n.kt)("li",{parentName:"ol"},"... anda :-)")),(0,n.kt)("h2",{id:"ebookwebhook-techstack--architecture"},"Ebook/webhook techstack & architecture"),(0,n.kt)("p",null,"Jika pembaca tertarik untuk membuat konten ebook berbasis web sekaligus versi PDF file-nya, bisa menggunakan link berikut sebagai referensi:"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://medium.com/geekculture/serverless-e-book-web-book-using-docusaurus-v2-github-pages-actions-and-pdf-tools-4fef54847b85"},"https://medium.com/geekculture/serverless-e-book-web-book-using-docusaurus-v2-github-pages-actions-and-pdf-tools-4fef54847b85"))),(0,n.kt)("p",null,"Tools yang digunakan:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Web-book engine \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/"},"Docusaurus v2")),(0,n.kt)("li",{parentName:"ul"},"PDF generator \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://www.princexml.com/"},"Prince XML")," + ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/signcl/docusaurus-prince-pdf"},"docusaurus-prince-pdf")," + ",(0,n.kt)("a",{parentName:"li",href:"https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/"},"PDFtk")),(0,n.kt)("li",{parentName:"ul"},"Source code repository \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/"},"GitHub")),(0,n.kt)("li",{parentName:"ul"},"Hosting \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://pages.github.com/"},"GitHub Pages")),(0,n.kt)("li",{parentName:"ul"},"CI/CD pipeline \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/features/actions"},"GitHub Actions")),(0,n.kt)("li",{parentName:"ul"},"Content Search \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/"},"Algolia DocSearch"))),(0,n.kt)("p",null,"Desain arsitektur:"),(0,n.kt)("p",null,(0,n.kt)("img",{parentName:"p",src:"https://raw.githubusercontent.com/novalagung/dasarpemrogramanrust/master/etc/base%20architecture.jpg",alt:"Dasar pemrograman python"})))}c.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7505],{3905:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>k});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var l=r.createContext({}),p=function(e){var t=r.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},s=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,l=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),m=p(a),k=n,b=m["".concat(l,".").concat(k)]||m[k]||c[k]||i;return a?r.createElement(b,o(o({ref:t},s),{},{components:a})):r.createElement(b,o({ref:t},s))}));function k(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,o=new Array(i);o[0]=m;var u={};for(var l in t)hasOwnProperty.call(t,l)&&(u[l]=t[l]);u.originalType=e,u.mdxType="string"==typeof e?e:n,o[1]=u;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>c,frontMatter:()=>i,metadata:()=>u,toc:()=>p});var r=a(7462),n=(a(7294),a(3905));const i={sidebar_position:3,title:"Contribution & Tech Stack",sidebar_label:"Contribution & Tech Stack"},o=void 0,u={unversionedId:"CONTRIBUTING",id:"CONTRIBUTING",title:"Contribution & Tech Stack",description:"Ebook Dasar Pemrograman Rust adalah project open source. Siapapun bebas untuk berkontribusi di sini, bisa dalam bentuk perbaikan typo, update kalimat, maupun submit tulisan baru.",source:"@site/docs/CONTRIBUTING.md",sourceDirName:".",slug:"/CONTRIBUTING",permalink:"/CONTRIBUTING",draft:!1,tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3,title:"Contribution & Tech Stack",sidebar_label:"Contribution & Tech Stack"},sidebar:"tutorialSidebar",previous:{title:"Pengenalan Rust Programming",permalink:"/pengelanan-rust-programming"},next:{title:"Download versi PDF",permalink:"/download-pdf"}},l={},p=[{value:"Checkout project",id:"checkout-project",level:2},{value:"Maintainer",id:"maintainer",level:2},{value:"Contributors",id:"contributors",level:2},{value:"Ebook/webhook techstack & architecture",id:"ebookwebhook-techstack--architecture",level:2}],s={toc:p};function c(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("p",null,"Ebook Dasar Pemrograman Rust adalah project open source. Siapapun bebas untuk berkontribusi di sini, bisa dalam bentuk perbaikan typo, update kalimat, maupun submit tulisan baru."),(0,n.kt)("p",null,"Bagi kawan-kawan yang berminat untuk berkontribusi, silakan fork ",(0,n.kt)("a",{parentName:"p",href:"https://github.com/novalagung/dasarpemrogramanrust"},"github.com/novalagung/dasarpemrogramanrust"),", kemudian langsung saja cek/buat issue kemudian submit relevan pull request untuk issue tersebut \ud83d\ude0a"),(0,n.kt)("h2",{id:"checkout-project"},"Checkout project"),(0,n.kt)("pre",null,(0,n.kt)("code",{parentName:"pre"},"git clone https://github.com/novalagung/dasarpemrogramanrust.git\ngit submodule update --init --recursive --remote\n")),(0,n.kt)("h2",{id:"maintainer"},"Maintainer"),(0,n.kt)("p",null,"E-book ini di-inisialisasi dan di-maintain oleh Noval Agung Prayogo."),(0,n.kt)("h2",{id:"contributors"},"Contributors"),(0,n.kt)("p",null,"Berikut merupakan hall of fame kontributor yang sudah berbaik hati menyisihkan waktunya untuk membantu pengembangan e-book ini."),(0,n.kt)("ol",null,(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/acepsaepudin"},"Acep Saepudin")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/afifurrohman-id"},"Afifurrohman")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/ardiantovn"},"ardiantovn")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/d0tf"},"Fal")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/nferdazel"},"Fredianto")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/iyansr"},"I Putu Saputrayana")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/khisby"},"Khisby Al Ghofari")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/chud-lori"},"Lori")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/zakiego"},"M. Zakiyuddin Munziri")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/opakholis"},"Opa Kholis Majid")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/rian256"},"Rian")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/shandysiswandi"},"Shandy Siswandi")),(0,n.kt)("li",{parentName:"ol"},(0,n.kt)("a",{parentName:"li",href:"https://github.com/antheiz"},"Theis Andatu")),(0,n.kt)("li",{parentName:"ol"},"... anda :-)")),(0,n.kt)("h2",{id:"ebookwebhook-techstack--architecture"},"Ebook/webhook techstack & architecture"),(0,n.kt)("p",null,"Jika pembaca tertarik untuk membuat konten ebook berbasis web sekaligus versi PDF file-nya, bisa menggunakan link berikut sebagai referensi:"),(0,n.kt)("blockquote",null,(0,n.kt)("p",{parentName:"blockquote"},(0,n.kt)("a",{parentName:"p",href:"https://medium.com/geekculture/serverless-e-book-web-book-using-docusaurus-v2-github-pages-actions-and-pdf-tools-4fef54847b85"},"https://medium.com/geekculture/serverless-e-book-web-book-using-docusaurus-v2-github-pages-actions-and-pdf-tools-4fef54847b85"))),(0,n.kt)("p",null,"Tools yang digunakan:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Web-book engine \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://docusaurus.io/"},"Docusaurus v2")),(0,n.kt)("li",{parentName:"ul"},"PDF generator \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://www.princexml.com/"},"Prince XML")," + ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/signcl/docusaurus-prince-pdf"},"docusaurus-prince-pdf")," + ",(0,n.kt)("a",{parentName:"li",href:"https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/"},"PDFtk")),(0,n.kt)("li",{parentName:"ul"},"Source code repository \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/"},"GitHub")),(0,n.kt)("li",{parentName:"ul"},"Hosting \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://pages.github.com/"},"GitHub Pages")),(0,n.kt)("li",{parentName:"ul"},"CI/CD pipeline \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://github.com/features/actions"},"GitHub Actions")),(0,n.kt)("li",{parentName:"ul"},"Content Search \u279c ",(0,n.kt)("a",{parentName:"li",href:"https://docsearch.algolia.com/"},"Algolia DocSearch"))),(0,n.kt)("p",null,"Desain arsitektur:"),(0,n.kt)("p",null,(0,n.kt)("img",{parentName:"p",src:"https://raw.githubusercontent.com/novalagung/dasarpemrogramanrust/master/etc/base%20architecture.jpg",alt:"Dasar pemrograman python"})))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/93422b31.2fa67f2b.js b/assets/js/93422b31.2fa67f2b.js new file mode 100644 index 00000000..071632ee --- /dev/null +++ b/assets/js/93422b31.2fa67f2b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8469],{3905:(a,e,t)=>{t.d(e,{Zo:()=>d,kt:()=>c});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var p=n.createContext({}),s=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},d=function(a){var e=s(a.components);return n.createElement(p.Provider,{value:e},a.children)},o={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,d=u(a,["components","mdxType","originalType","parentName"]),m=s(t),c=i,k=m["".concat(p,".").concat(c)]||m[c]||o[c]||r;return t?n.createElement(k,l(l({ref:e},d),{},{components:t})):n.createElement(k,l({ref:e},d))}));function c(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=m;var u={};for(var p in e)hasOwnProperty.call(e,p)&&(u[p]=e[p]);u.originalType=a,u.mdxType="string"==typeof a?a:i,l[1]=u;for(var s=2;s{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>u,toc:()=>s});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:23,title:"A.23. Struct",sidebar_label:"A.23. Struct"},l=void 0,u={unversionedId:"basic/struct",id:"basic/struct",title:"A.23. Struct",description:"Pada chapter ini kita akan belajar tentang struct.",source:"@site/docs/basic/struct.md",sourceDirName:"basic",slug:"/basic/struct",permalink:"/basic/struct",draft:!1,tags:[],version:"current",sidebarPosition:23,frontMatter:{sidebar_position:23,title:"A.23. Struct",sidebar_label:"A.23. Struct"},sidebar:"tutorialSidebar",previous:{title:"A.22. Module System \u279c Scope & Akses Item",permalink:"/basic/module-scope-item-access"},next:{title:"A.24. Associated Function",permalink:"/basic/associated-function"}},p={},s=[{value:"A.23.1. Konsep Struct",id:"a231-konsep-struct",level:2},{value:"A.23.2. Pembuatan struct",id:"a232-pembuatan-struct",level:2},{value:"\u25c9 Fungsi String::from()",id:"-fungsi-stringfrom",level:3},{value:"\u25c9 Naming convention struct",id:"-naming-convention-struct",level:3},{value:"A.23.3. Mutable struct",id:"a233-mutable-struct",level:2},{value:"A.23.4. Macam-macam notasi deklarasi variabel struct",id:"a234-macam-macam-notasi-deklarasi-variabel-struct",level:2},{value:"\u25c9 type inference / manifest typing",id:"-type-inference--manifest-typing",level:3},{value:"\u25c9 Variabel struct tanpa predefined value",id:"-variabel-struct-tanpa-predefined-value",level:3},{value:"\u25c9 Variabel struct dengan nilai berasal dari struct lain",id:"-variabel-struct-dengan-nilai-berasal-dari-struct-lain",level:3},{value:"\u25c9 Field init shorthand",id:"-field-init-shorthand",level:3},{value:"\u25c9 Deklarasi nilai struct secara horizontal",id:"-deklarasi-nilai-struct-secara-horizontal",level:3},{value:"\u25c9 Destructuring assignment",id:"-destructuring-assignment",level:3},{value:"A.23.5. Unit-like structs",id:"a235-unit-like-structs",level:2},{value:"A.23.6. Debugging value struct menggunakan #[derive(Debug)]",id:"a236-debugging-value-struct-menggunakan-derivedebug",level:2},{value:"A.23.7. Tuple struct",id:"a237-tuple-struct",level:2},{value:"A.23.8. Struct property visibility",id:"a238-struct-property-visibility",level:2},{value:"A.23.9. Tuple struct property visibility",id:"a239-tuple-struct-property-visibility",level:2},{value:"A.23.10. Generic pada struct",id:"a2310-generic-pada-struct",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:s};function o(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang struct."),(0,i.kt)("h2",{id:"a231-konsep-struct"},"A.23.1. Konsep Struct"),(0,i.kt)("p",null,"Struct (kependekan dari ",(0,i.kt)("em",{parentName:"p"},"structure"),") adalah tipe data custom yang dengannya kita bisa mengumpulkan beberapa definisi tipe data lalu menjadikannya sebagai satu buah tipe data dalam struktur tertentu."),(0,i.kt)("p",null,"Contoh analogi seperti sebuah mobil. Mobil memiliki roda, mesin, tempat kemudi, dan banyak lainnya. Mobil pada contoh ini adalah struct, sedang isi dari mobil tersebut biasa disebut dengan ",(0,i.kt)("em",{parentName:"p"},"attribute")," atau ",(0,i.kt)("em",{parentName:"p"},"property")," atau ",(0,i.kt)("em",{parentName:"p"},"field"),"."),(0,i.kt)("p",null,"Selain property, mobil juga bisa melakukan aksi, contohnya seperti jalan, belok kanan, berhenti. Aksi tersebut pada contoh ini adalah yang disebut dengan ",(0,i.kt)("em",{parentName:"p"},"method"),". Method sendiri adalah fungsi yang merupakan property sebuah struct."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Chapter ini fokus pada pembahasan struct beserta property-nya. Topik tentang method dibahas pada chapter selanjutnya, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/method"},"Method"),".")),(0,i.kt)("h2",{id:"a232-pembuatan-struct"},"A.23.2. Pembuatan struct"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"struct")," digunakan untuk membuat custom type struct. Notasi penulisannya seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct NamaStruct {\n property_satu: String,\n property_dua: u64,\n // ...\n}\n")),(0,i.kt)("p",null,"Contoh, sebuah struct bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," yang memiliki 4 buah property:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"name")," bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"sign_in_count")," bertipe numerik ",(0,i.kt)("inlineCode",{parentName:"li"},"u64")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"affliation")," bertipe vektor ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"active")," bertipe boolean")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct User {\n name: String,\n sign_in_count: u64,\n affliation: Vec,\n active: bool,\n}\n")),(0,i.kt)("p",null,"Struct adalah ",(0,i.kt)("em",{parentName:"p"},"hanya definisi structure"),"-nya saja, struct tidak menampung nilai atau value. Contoh pada struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," di atas bisa dilihat bahwa yang didefinisikan hanya nama struct dan property (beserta tipe datanya). Tidak ada pengisian nilai sama sekali."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," merupakan salah satu contoh penerapan generics. Topik ini nantinya dibahas lebih detail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics"},"Generics"),".")),(0,i.kt)("p",null,"Struct merupakan tipe data data custom, yang berarti tipe data tersebut bisa digunakan dalam pembuatan variabel. Sebagai contoh di bawah ini, sebuah variabel bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"user_one")," didefinisikan dengan tipe adalah struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," yang telah dibuat."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct User {\n name: String,\n sign_in_count: u64,\n affliation: Vec,\n active: bool,\n}\n\nfn main() {\n let user_one = User{\n name: String::from("Orgrim Doomhammer"),\n sign_in_count: 12,\n affliation: vec![\n String::from("Warchief of the Horde"),\n String::from("Blackrock Chieftain"),\n String::from("The Doomhammer"),\n ],\n active: false,\n };\n\n println!("name: {}", user_one.name);\n println!("sign-in count: {}", user_one.sign_in_count);\n println!("affliation: {:?}", user_one.affliation);\n println!("is active? {}", user_one.active);\n}\n')),(0,i.kt)("p",null,"Jalankan program di atas, lihat hasilnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(1226).Z,width:"572",height:"123"})),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"user_one")," didefinisikan tipe datanya adalah struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User"),". Notasinya penulisannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let user_one = User{\n // property_satu: value,\n // property_dua: value,\n // ...\n};\n")),(0,i.kt)("p",null,"Deklarasi variabel bertipe data struct mewajibkan isi masing-masing property harus dituliskan beserta nilainya. Sebagai contoh variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"user_one")," yang bertipe struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," di atas, dalam statement bisa dilihat ke-empat property milik struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," dituliskan beserta nilainya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let user_one = User{\n name: String::from("Orgrim Doomhammer"),\n sign_in_count: 12,\n affliation: vec![\n String::from("Warchief of the Horde"),\n String::from("Blackrock Chieftain"),\n String::from("The Doomhammer"),\n ],\n active: false,\n};\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Variabel yang tipe data-nya adalah struct biasa disebut dengan ",(0,i.kt)("em",{parentName:"p"},"object")," atau ",(0,i.kt)("em",{parentName:"p"},"instance"),".")),(0,i.kt)("h3",{id:"-fungsi-stringfrom"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::from()")),(0,i.kt)("p",null,"Pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/path-item#-stdstringstringnew"},"Module System \u279c Path & Item")," kita telah sedikit mengenal fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"String::new()")," yang kegunaannya adalah untuk membuat data string kosong bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("p",null,"Selain fungsi tersebut, ada juga fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"String::from()")," yang kegunaannya juga untuk pembuatan data string bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", tapi dengan isi ditentukan lewat argumen pemanggilan fungsi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let a = "";\n// variabel `a` bertipe data `&str`, isi value-nya ""\n\nlet b = String::new();\n// variabel `b` bertipe data `String`, isi value-nya ""\n\nlet c = "hello";\n// variabel `c` bertipe data `&str`, isi value-nya "hello"\n\nlet d = String::from("world");\n// variabel `d` bertipe data `String`, isi value-nya "world"\n')),(0,i.kt)("p",null,"Untuk sekarang, boleh menggunakan kesimpulan berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Hasil dari ",(0,i.kt)("inlineCode",{parentName:"li"},"String::new()")," adalah sama dengan literal string ",(0,i.kt)("inlineCode",{parentName:"li"},'""')," tapi bertipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," (bukan ",(0,i.kt)("inlineCode",{parentName:"li"},"&str"),")"),(0,i.kt)("li",{parentName:"ul"},"Hasil dari ",(0,i.kt)("inlineCode",{parentName:"li"},'String::from("hello")')," adalah sama dengan literal string ",(0,i.kt)("inlineCode",{parentName:"li"},'"hello"')," tapi bertipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," (bukan ",(0,i.kt)("inlineCode",{parentName:"li"},"&str"),")")),(0,i.kt)("p",null,"Sebenarnya perbedaannya tidak hanya itu saja, nantinya kita pelajari lebih detail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type"),"."),(0,i.kt)("h3",{id:"-naming-convention-struct"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Naming convention")," struct"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", upper camel case digunakan dalam penamaan struct dan camel case untuk penamaan property-nya. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct User {\n name: String,\n sign_in_count: u64,\n affliation: Vec,\n active: bool,\n}\n")),(0,i.kt)("h2",{id:"a233-mutable-struct"},"A.23.3. Mutable struct"),(0,i.kt)("p",null,"Penentuan ",(0,i.kt)("em",{parentName:"p"},"mutability")," sebuah struct dilakukan dengan cara menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," seperti pada umumnya variabel. Contohnya bisa dilihat pada variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"user_two")," berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut user_two: User = User{\n name: String::from("Varian Wrynn"),\n sign_in_count: 12,\n affliation: vec![\n String::from("High King of the Alliance"),\n String::from("King of Stormwind"),\n String::from("Champion of the Crimson Ring"),\n ],\n active: false,\n};\n\nuser_two.name = String::from("Anduin Wrynn");\nuser_two.affliation.pop();\nuser_two.active = true;\n\nprintln!("name: {}", user_two.name);\nprintln!("sign-in count: {}", user_two.sign_in_count);\nprintln!("affliation: {:?}", user_two.affliation);\nprintln!("is active? {}", user_two.active);\n')),(0,i.kt)("p",null,"Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"user_two")," adalah object struct yang bisa diubah nilainya (mutable). Perubahan nilai struct bisa dilakukan pada property, contohnya seperti property ",(0,i.kt)("inlineCode",{parentName:"p"},"name"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"affliation"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"active")," yang dicontohkan diubah nilainya."),(0,i.kt)("p",null,"Atau bisa juga perubahannya pada value struct itu sendiri, diganti dengan value baru."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut user_two = User{\n name: String::from("Varian Wrynn"),\n sign_in_count: 12,\n affliation: vec![\n String::from("High King of the Alliance"),\n String::from("King of Stormwind"),\n String::from("Champion of the Crimson Ring"),\n ],\n active: false,\n};\n\nuser_two = User{\n name: String::from("Anduin Wrynn"),\n sign_in_count: 12,\n affliation: vec![\n String::from("High King of the Alliance"),\n String::from("King of Stormwind"),\n ],\n active: true,\n};\n')),(0,i.kt)("h2",{id:"a234-macam-macam-notasi-deklarasi-variabel-struct"},"A.23.4. Macam-macam notasi deklarasi variabel struct"),(0,i.kt)("h3",{id:"-type-inference--manifest-typing"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"type inference")," / ",(0,i.kt)("em",{parentName:"h3"},"manifest typing")),(0,i.kt)("p",null,"Metode deklarasi ",(0,i.kt)("em",{parentName:"p"},"type inference")," ataupun ",(0,i.kt)("em",{parentName:"p"},"manifest typing")," bisa digunakan dalam variabel struct."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Car {\n brand: String,\n model: String,\n}\n\nlet car_one = Car{\n brand: String::from("Toyota"),\n model: String::from("Sprinter Trueno AE86"),\n};\n\nlet car_two: Car = Car{\n brand: String::from("BMW"),\n model: String::from("M3 GTR"),\n};\n')),(0,i.kt)("h3",{id:"-variabel-struct-tanpa-predefined-value"},"\u25c9 Variabel struct tanpa ",(0,i.kt)("em",{parentName:"h3"},"predefined value")),(0,i.kt)("p",null,"Variabel struct boleh didefinisikan tanpa ",(0,i.kt)("em",{parentName:"p"},"predefined value"),", jadi cukup tipe datanya saja yang ditentukan saat deklarasi variabel. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut car_three: Car;\ncar_three = Car{\n brand: String::from("Audi"),\n model: String::from("Le Mans Quattro"),\n};\n')),(0,i.kt)("h3",{id:"-variabel-struct-dengan-nilai-berasal-dari-struct-lain"},"\u25c9 Variabel struct dengan nilai berasal dari struct lain"),(0,i.kt)("p",null,"Jika ada kebutuhan untuk membuat variabel object struct yang nilai property-nya sebagian adalah berasal dari variabel struct lain, bisa manfaatkan syntax ",(0,i.kt)("inlineCode",{parentName:"p"},".."),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut car_three: Car;\ncar_three = Car{\n brand: String::from("Audi"),\n model: String::from("Le Mans Quattro"),\n};\nprintln!("{} {}", car_three.brand, car_three.model);\n\nlet mut car_four: Car;\ncar_four = Car{\n brand: String::from("Audi Brand"),\n ..car_three\n};\nprintln!("{} {}", car_four.brand, car_four.model);\n')),(0,i.kt)("p",null,"Pada contoh di atas, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"car_four")," property ",(0,i.kt)("inlineCode",{parentName:"p"},"brand"),"-nya diisi dengan ",(0,i.kt)("inlineCode",{parentName:"p"},'"Audi Brand"'),". Sedangkan property-property lainnya nilai didapat dari nilai propery milik ",(0,i.kt)("inlineCode",{parentName:"p"},"car_three"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(341).Z,width:"511",height:"108"})),(0,i.kt)("p",null,"Coba jalankan program, akan terlihat nilai dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"car_four")," untuk property selain ",(0,i.kt)("inlineCode",{parentName:"p"},"brand")," adalah sama dengan nilai property-property ",(0,i.kt)("inlineCode",{parentName:"p"},"car_three"),"."),(0,i.kt)("h3",{id:"-field-init-shorthand"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Field init shorthand")),(0,i.kt)("p",null,"Jika ada variabel yang namanya sama persis dengan nama property sebuah struct, maka dalam deklarasi variabel struct bisa menggunakan teknik penulisan seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let model = String::from("Corvette C1");\n\nlet car_five = Car{\n brand: String::from("Chevrolet"),\n model,\n};\n')),(0,i.kt)("p",null,"Cukup tulis nama variabelnya saja tanpa value."),(0,i.kt)("p",null,"Teknik ",(0,i.kt)("em",{parentName:"p"},"shorthand")," ini bisa juga digunakan dalam fungsi. Contoh di bawah ini ada fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"new_car")," yang memiliki nama parameter adalah sama persis dengan nama property struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Car"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn new_car(brand: String, model: String) -> Car {\n Car{\n brand,\n model,\n }\n}\n\nfn main() {\n let car_six = new_car(\n String::from("Chevrolet"),\n String::from("Corvette C6")\n );\n // ...\n}\n')),(0,i.kt)("h3",{id:"-deklarasi-nilai-struct-secara-horizontal"},"\u25c9 Deklarasi nilai struct secara horizontal"),(0,i.kt)("p",null,"Umumnya, operasi ",(0,i.kt)("em",{parentName:"p"},"assignment")," nilai struct dituliskan secara vertikal. Untuk struct yang property-nya sedikit biasanya dituliskan secara horizontal contohnya seperti di bawah ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct Point {\n x: f32,\n y: f32,\n}\n\nlet point_one = Point { x: 3.14, y: 8.0 };\n")),(0,i.kt)("h3",{id:"-destructuring-assignment"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Destructuring assignment")),(0,i.kt)("p",null,"Teknik penulisan ini bisa dipakai dalam case di mana nilai property struct perlu ditampung ke variabel baru. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let point_one = Point { x: 3.14, y: 8.0 };\n\nlet Point { x: x_one, y: y_one } = point_one;\nprintln!("x_one: {}", x_one);\nprintln!("y_one: {}", y_one);\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"x_one")," di atas akan menampung nilai dari ",(0,i.kt)("inlineCode",{parentName:"li"},"point_one.x")),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"y_one")," di atas akan menampung nilai dari ",(0,i.kt)("inlineCode",{parentName:"li"},"point_one.y"))),(0,i.kt)("p",null,"Jika tidak semua property struct perlu untuk ditampung ke variabel baru, maka gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," untuk property yang nilainya tidak ditampung. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let point_one = Point { x: 3.14, y: 8.0 };\n\nlet Point { x: _, y: y_one } = point_one;\nprintln!("y_one: {}", y_one);\n')),(0,i.kt)("h2",{id:"a235-unit-like-structs"},"A.23.5. ",(0,i.kt)("em",{parentName:"h2"},"Unit-like structs")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Unit-like structs")," adalah struct yang didefinisikan tanpa property. Cara deklrasinya bisa dilihat pada contoh berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct StructOne;\n\nlet data_one = StructOne;\n")),(0,i.kt)("p",null,"Teknik pembuatan struct ini berguna ketika ada case di mana ada kebutuhan untuk mengimplementasikan sebuah trait ke suatu tipe data. Lebih jelasnya akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),"."),(0,i.kt)("h2",{id:"a236-debugging-value-struct-menggunakan-derivedebug"},"A.23.6. Debugging value struct menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"#[derive(Debug)]")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"By default"),", error akan muncul saat berusaha menampilkan nilai variabel struct (bukan nilai property-nya, tapi nilai variabel struct-nya) menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Ini disebabkan karena data yang bisa ditampilkan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," harus memiliki trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Display"),")."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(6091).Z,width:"743",height:"308"})),(0,i.kt)("p",null,"Lalu jika ingin melihat nilai property struct bagaimana solusinya? Bisa dengan menampilkan nilai property satu per satu, tapi pastinya butuh effort."),(0,i.kt)("p",null,"Cara yang lebih elegan adalah dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]"),". Penerapannya cukup dengan menuliskan atribut tersebut tepat di atas deklarasi struct. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct GamingConsole {\n name: String\n}\n\nlet console_one = GamingConsole{\n name: String::from("PlayStation 5"),\n};\n\nprintln!("data_struct_one: {:#?}", console_one);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(7542).Z,width:"510",height:"330"})),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai traits dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai attribute dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/attributes"},"Attributes")))),(0,i.kt)("h2",{id:"a237-tuple-struct"},"A.23.7. Tuple struct"),(0,i.kt)("p",null,"Tuple struct adalah struct yang didefinisikan dengan gaya tuple. Property pada tuple struct diakses menggunakan notasi pengaksesan tuple item."),(0,i.kt)("p",null,"Pada contoh berikut tuple struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Color")," didefinisikan dengan isi 3 buah item yang kesemuanya bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),". Lalu tipe data tuple struct tersebut digunakan untuk membuat variabel baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"red"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Color(i32, i32, i32);\n\nlet red = Color(255, 0, 0);\n\nprintln!("{:?} {:?} {:?}", red.0, red.1, red.2);\n')),(0,i.kt)("p",null,"Bisa dilihat di contoh, property diakses menggunakan nomor indeks dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"variable.index"),"."),(0,i.kt)("p",null,"Contoh lainnya, tuple struct ",(0,i.kt)("inlineCode",{parentName:"p"},"SomeTupleStruct")," berikut dideklarasikan memiliki item ke-1 bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan item ke-2 bertipe boolean."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct SomeTupleStruct(i32, bool);\n\nlet some_data = SomeTupleStruct(0, false);\n\nprintln!("{:?} {:?}", some_data.0, some_data.1);\n')),(0,i.kt)("h2",{id:"a238-struct-property-visibility"},"A.23.8. Struct property visibility"),(0,i.kt)("p",null,"Sekarang mari kita coba praktikkan satu program lagi, namun kali ini sedikit berbeda, struct kita definisikan sebagai module item."),(0,i.kt)("p",null,"Silakan siapkan program dengan struktur seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u251c\u2500\u2500\u2500 models.rs\n \u2514\u2500\u2500\u2500 models\n \u2514\u2500\u2500\u2500 game.rs\n")),(0,i.kt)("p",null,"Lalu isi file program dengan kode di bawah ini. Sebuah struct dengan path ",(0,i.kt)("inlineCode",{parentName:"p"},"models::game::GamingConsole"),", dan satu buah object di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," yang dibuat dari struct tersebut. Pastikan definisi semua module item adalah publik (ada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod models;\n\nfn main() {\n let ps5 = models::game::GamingConsole{\n name: String::from("PS 5")\n };\n println!("{:#?}", ps5);\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"pub mod game;\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models/game.rs"',title:'"src/models/game.rs"'},"#[derive(Debug)]\npub struct GamingConsole {\n name: String\n}\n")),(0,i.kt)("p",null,"Ada yang aneh, baris kode pembuatan variabel object ",(0,i.kt)("inlineCode",{parentName:"p"},"ps5")," terdeteksi sebagai error. Padahal definisi submodule dan item-nya sudah publik semua."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(7728).Z,width:"419",height:"185"})),(0,i.kt)("p",null,"Jika dilihat dari keterangan error, sebenarnya cukup jelas bagian mana yang menjadi sumber masalah, yaitu field ",(0,i.kt)("inlineCode",{parentName:"p"},"name")," yang terdeteksi sebagai private property."),(0,i.kt)("p",null,"Struct jika didefinisikan di file yang sama dengan statement pemanggilan struct tersebut tidak akan menghasilkan error. Tetapi jika definisi struct-nya terpisah dari statement pemanggilan struct (seperti contoh di atas), maka field dari struct tersebut harus publik."),(0,i.kt)("p",null,"Caranya membuat field sebagai publik adalah dengan menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada property struct. Silakan ubah definisi struct ",(0,i.kt)("inlineCode",{parentName:"p"},"GamingConsole")," menjadi seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// before\npub struct GamingConsole {\n name: String\n}\n\n// after\npub struct GamingConsole {\n pub name: String\n}\n")),(0,i.kt)("p",null,"Bisa dilihat keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," ditambahkan pada deklarasi property struct. yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"p"},"name: String")," sekarang ada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," didepannya."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai visibility property dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("h2",{id:"a239-tuple-struct-property-visibility"},"A.23.9. Tuple struct property visibility"),(0,i.kt)("p",null,"Lalu bagaimana dengan tuple struct? apakah property-nya juga harus didefinisikan publik agar bisa diakses dari tempat lain? Jawabannya ada di praktik berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u251c\u2500\u2500\u2500 models.rs\n \u2514\u2500\u2500\u2500 models\n \u2514\u2500\u2500\u2500 color.rs\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod models;\n\nfn main() {\n let red = models::color::Color(255, 255, 0);\n println!("{:#?}", red);\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"pub mod color;\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models/color.rs"',title:'"src/models/color.rs"'},"#[derive(Debug)]\npub struct Color(i32, i32, i32);\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(6610).Z,width:"626",height:"255"})),(0,i.kt)("p",null,"Yap, error yang mirip juga muncul. Jadi jawaban dari pertanyaan sebelumnya adalah iya, property tuple struct juga harus publik agar bisa diakses dari tempat lain."),(0,i.kt)("p",null,"Cara deklarasi tuple struct dengan property publik adalah dengan menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," di masing-masing deklarasi parameter tuple struct. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// before\npub struct Color(i32, i32, i32);\n\n// after\npub struct Color(pub i32, pub i32, pub i32);\n")),(0,i.kt)("p",null,"Jalankan program untuk melihat hasilnya, error tidak muncul."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai visibility property dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("h2",{id:"a2310-generic-pada-struct"},"A.23.10. Generic pada struct"),(0,i.kt)("p",null,"Pembahasan mengenai generic pada struct ada pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics#a365-generics-struct"},"Generics"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/struct"},"github.com/novalagung/dasarpemrogramanrust-example/../struct")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-00-structs.html"},"https://doc.rust-lang.org/book/ch05-00-structs.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-01-defining-structs.html"},"https://doc.rust-lang.org/book/ch05-01-defining-structs.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.struct.html"},"https://doc.rust-lang.org/std/keyword.struct.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/custom_types/structs.html"},"https://doc.rust-lang.org/rust-by-example/custom_types/structs.html"))))}o.isMDXComponent=!0},1226:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAB7CAIAAAD/r80wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjZUMTU6NDg6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI2VDE3OjUzOjIzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI2VDE3OjUzOjIzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjhlMWU1N2MwLTVjNGIt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"},341:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAf8AAABsCAIAAADrFiywAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjZUMTY6MTc6NDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI2VDE3OjUyOjAxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI2VDE3OjUyOjAxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFjMmVkMjgwLTQxOGYt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"},6091:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/struct-4-86fb5f564d330bc2d1cc10e13ea2d649.png"},7542:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/struct-5-5e013d5895bef6a938e2c1333ff52205.png"},7728:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaMAAAC5CAIAAAAKzcfqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTM6NTI6MDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDE0OjI1OjM1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDE0OjI1OjM1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg4MWFmNWY1LTcyZTkt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S+ZfvbnGn0xWkE6HrqcXn25JOn+kwnSu6X63BmGs7KdrzkcZwNL2sFEh3YcmSrWqJF3mGEr1SjrpgpWoSpEuDaaGpDPxbOnTOZt0Qbqw585x1pqRThGkBenKkYTogKx29NqM1RajEA07E4t80vaw0SCdjk/t+lqfztlJN5Le1uBIV4TARr07dC1JJ3y64t/ufbqktHPnjydU+3cNSYdPh40m6XK/LHPuKkln+ua8gYj2/XR+n51AVWxYtgPS+TGvq25GJIKuAN0TJ/vpzHIV6Xrtp6vw+xr7dGIAl346bByj12NmaNXo1I06n84de53vaUTCDoxGRk4d58sde60bq83308Sn8926wZDOHXstElSSTo+9lhBpTzodgdZFtan0jZnI2Cs21KRb1y8teT5dn111A1Tkebphe/2L5+kwSDescoNi82heOphdWwXvSAw3iGl72HCRbtuW6axqvr7rR49+9rP7e3+yvta40euec8Oc58//9dr/bXp+CHOo33t92U1D28OGi3SqdqqqqSru//7kpz+a3PnOsz9mDWv6X0Pbw4aLdFnVVFLVNLtds4Y1/a+h7WHDRToMwzBIh2EYBukwDMMgHYZhGKTDMAyDdBiGYZAOwzAM0mEYBukwDMNG3/4fXrze1tJWD6UAAAAASUVORK5CYII="},6610:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/struct-7-517c0402e96dfd5898464887fa79ec98.png"}}]); \ No newline at end of file diff --git a/assets/js/93422b31.7d2d5eae.js b/assets/js/93422b31.7d2d5eae.js deleted file mode 100644 index b6e5e2df..00000000 --- a/assets/js/93422b31.7d2d5eae.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8469],{3905:(a,e,t)=>{t.d(e,{Zo:()=>d,kt:()=>c});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var p=n.createContext({}),s=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},d=function(a){var e=s(a.components);return n.createElement(p.Provider,{value:e},a.children)},o={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},m=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,d=u(a,["components","mdxType","originalType","parentName"]),m=s(t),c=i,k=m["".concat(p,".").concat(c)]||m[c]||o[c]||r;return t?n.createElement(k,l(l({ref:e},d),{},{components:t})):n.createElement(k,l({ref:e},d))}));function c(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=m;var u={};for(var p in e)hasOwnProperty.call(e,p)&&(u[p]=e[p]);u.originalType=a,u.mdxType="string"==typeof a?a:i,l[1]=u;for(var s=2;s{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>o,frontMatter:()=>r,metadata:()=>u,toc:()=>s});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:23,title:"A.23. Struct",sidebar_label:"A.23. Struct"},l=void 0,u={unversionedId:"basic/struct",id:"basic/struct",title:"A.23. Struct",description:"Pada chapter ini kita akan belajar tentang struct.",source:"@site/docs/basic/struct.md",sourceDirName:"basic",slug:"/basic/struct",permalink:"/basic/struct",draft:!1,tags:[],version:"current",sidebarPosition:23,frontMatter:{sidebar_position:23,title:"A.23. Struct",sidebar_label:"A.23. Struct"},sidebar:"tutorialSidebar",previous:{title:"A.22. Module System \u279c Scope & Akses Item",permalink:"/basic/module-scope-item-access"},next:{title:"A.24. Associated Function",permalink:"/basic/associated-function"}},p={},s=[{value:"A.23.1. Konsep Struct",id:"a231-konsep-struct",level:2},{value:"A.23.2. Pembuatan struct",id:"a232-pembuatan-struct",level:2},{value:"\u25c9 Fungsi String::from()",id:"-fungsi-stringfrom",level:3},{value:"\u25c9 Naming convention struct",id:"-naming-convention-struct",level:3},{value:"A.23.3. Mutable struct",id:"a233-mutable-struct",level:2},{value:"A.23.4. Macam-macam notasi deklarasi variabel struct",id:"a234-macam-macam-notasi-deklarasi-variabel-struct",level:2},{value:"\u25c9 type inference / manifest typing",id:"-type-inference--manifest-typing",level:3},{value:"\u25c9 Variabel struct tanpa predefined value",id:"-variabel-struct-tanpa-predefined-value",level:3},{value:"\u25c9 Variabel struct dengan nilai berasal dari struct lain",id:"-variabel-struct-dengan-nilai-berasal-dari-struct-lain",level:3},{value:"\u25c9 Field init shorthand",id:"-field-init-shorthand",level:3},{value:"\u25c9 Deklarasi nilai struct secara horizontal",id:"-deklarasi-nilai-struct-secara-horizontal",level:3},{value:"\u25c9 Destructuring assignment",id:"-destructuring-assignment",level:3},{value:"A.23.5. Unit-like structs",id:"a235-unit-like-structs",level:2},{value:"A.23.6. Debugging value struct menggunakan #[derive(Debug)]",id:"a236-debugging-value-struct-menggunakan-derivedebug",level:2},{value:"A.23.7. Tuple struct",id:"a237-tuple-struct",level:2},{value:"A.23.8. Struct property visibility",id:"a238-struct-property-visibility",level:2},{value:"A.23.9. Tuple struct property visibility",id:"a239-tuple-struct-property-visibility",level:2},{value:"A.23.10. Generic pada struct",id:"a2310-generic-pada-struct",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:s};function o(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang struct."),(0,i.kt)("h2",{id:"a231-konsep-struct"},"A.23.1. Konsep Struct"),(0,i.kt)("p",null,"Struct (kependekan dari ",(0,i.kt)("em",{parentName:"p"},"structure"),") adalah tipe data custom yang dengannya kita bisa mengumpulkan beberapa definisi tipe data lalu menjadikannya sebagai satu buah tipe data dalam struktur tertentu."),(0,i.kt)("p",null,"Contoh analogi seperti sebuah mobil. Mobil memiliki roda, mesin, tempat kemudi, dan banyak lainnya. Mobil pada contoh ini adalah struct, sedang isi dari mobil tersebut biasa disebut dengan ",(0,i.kt)("em",{parentName:"p"},"attribute")," atau ",(0,i.kt)("em",{parentName:"p"},"property")," atau ",(0,i.kt)("em",{parentName:"p"},"field"),"."),(0,i.kt)("p",null,"Selain property, mobil juga bisa melakukan aksi, contohnya seperti jalan, belok kanan, berhenti. Aksi tersebut pada contoh ini adalah yang disebut dengan ",(0,i.kt)("em",{parentName:"p"},"method"),". Method sendiri adalah fungsi yang merupakan property sebuah struct."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Chapter ini fokus pada pembahasan struct beserta property-nya. Topik tentang method dibahas pada chapter selanjutnya, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/method"},"Method"),".")),(0,i.kt)("h2",{id:"a232-pembuatan-struct"},"A.23.2. Pembuatan struct"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"struct")," digunakan untuk membuat custom type struct. Notasi penulisannya seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct NamaStruct {\n property_satu: String,\n property_dua: u64,\n // ...\n}\n")),(0,i.kt)("p",null,"Contoh, sebuah struct bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," yang memiliki 4 buah property:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"name")," bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"sign_in_count")," bertipe numerik ",(0,i.kt)("inlineCode",{parentName:"li"},"u64")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"affliation")," bertipe vektor ",(0,i.kt)("inlineCode",{parentName:"li"},"Vec")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"active")," bertipe boolean")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct User {\n name: String,\n sign_in_count: u64,\n affliation: Vec,\n active: bool,\n}\n")),(0,i.kt)("p",null,"Struct adalah ",(0,i.kt)("em",{parentName:"p"},"hanya definisi structure"),"-nya saja, struct tidak menampung nilai atau value. Contoh pada struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," di atas bisa dilihat bahwa yang didefinisikan hanya nama struct dan property (beserta tipe datanya). Tidak ada pengisian nilai sama sekali."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," merupakan salah satu contoh penerapan generics. Topik ini nantinya dibahas lebih detail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics"},"Generics"),".")),(0,i.kt)("p",null,"Struct merupakan tipe data data custom, yang berarti tipe data tersebut bisa digunakan dalam pembuatan variabel. Sebagai contoh dibawah ini, sebuah variabel bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"user_one")," didefinisikan dengan tipe adalah struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," yang telah dibuat."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct User {\n name: String,\n sign_in_count: u64,\n affliation: Vec,\n active: bool,\n}\n\nfn main() {\n let user_one = User{\n name: String::from("Orgrim Doomhammer"),\n sign_in_count: 12,\n affliation: vec![\n String::from("Warchief of the Horde"),\n String::from("Blackrock Chieftain"),\n String::from("The Doomhammer"),\n ],\n active: false,\n };\n\n println!("name: {}", user_one.name);\n println!("sign-in count: {}", user_one.sign_in_count);\n println!("affliation: {:?}", user_one.affliation);\n println!("is active? {}", user_one.active);\n}\n')),(0,i.kt)("p",null,"Jalankan program di atas, lihat hasilnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(1226).Z,width:"572",height:"123"})),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"user_one")," didefinisikan tipe datanya adalah struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User"),". Notasinya penulisannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let user_one = User{\n // property_satu: value,\n // property_dua: value,\n // ...\n};\n")),(0,i.kt)("p",null,"Deklarasi variabel bertipe data struct mewajibkan isi masing-masing property harus dituliskan beserta nilainya. Sebagai contoh variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"user_one")," yang bertipe struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," di atas, dalam statement bisa dilihat ke-empat property milik struct ",(0,i.kt)("inlineCode",{parentName:"p"},"User")," dituliskan beserta nilainya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let user_one = User{\n name: String::from("Orgrim Doomhammer"),\n sign_in_count: 12,\n affliation: vec![\n String::from("Warchief of the Horde"),\n String::from("Blackrock Chieftain"),\n String::from("The Doomhammer"),\n ],\n active: false,\n};\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Variabel yang tipe data-nya adalah struct biasa disebut dengan ",(0,i.kt)("em",{parentName:"p"},"object")," atau ",(0,i.kt)("em",{parentName:"p"},"instance"),".")),(0,i.kt)("h3",{id:"-fungsi-stringfrom"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"String::from()")),(0,i.kt)("p",null,"Pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/path-item#-stdstringstringnew"},"Module System \u279c Path & Item")," kita telah sedikit mengenal fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"String::new()")," yang kegunaannya adalah untuk membuat data string kosong bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("p",null,"Selain fungsi tersebut, ada juga fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"String::from()")," yang kegunaannya juga untuk pembuatan data string bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", tapi dengan isi ditentukan lewat argumen pemanggilan fungsi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let a = "";\n// variabel `a` bertipe data `&str`, isi value-nya ""\n\nlet b = String::new();\n// variabel `b` bertipe data `String`, isi value-nya ""\n\nlet c = "hello";\n// variabel `c` bertipe data `&str`, isi value-nya "hello"\n\nlet d = String::from("world");\n// variabel `d` bertipe data `String`, isi value-nya "world"\n')),(0,i.kt)("p",null,"Untuk sekarang, boleh menggunakan kesimpulan berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Hasil dari ",(0,i.kt)("inlineCode",{parentName:"li"},"String::new()")," adalah sama dengan literal string ",(0,i.kt)("inlineCode",{parentName:"li"},'""')," tapi bertipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," (bukan ",(0,i.kt)("inlineCode",{parentName:"li"},"&str"),")"),(0,i.kt)("li",{parentName:"ul"},"Hasil dari ",(0,i.kt)("inlineCode",{parentName:"li"},'String::from("hello")')," adalah sama dengan literal string ",(0,i.kt)("inlineCode",{parentName:"li"},'"hello"')," tapi bertipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," (bukan ",(0,i.kt)("inlineCode",{parentName:"li"},"&str"),")")),(0,i.kt)("p",null,"Sebenarnya perbedaannya tidak hanya itu saja, nantinya kita pelajari lebih detail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type"),"."),(0,i.kt)("h3",{id:"-naming-convention-struct"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Naming convention")," struct"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", upper camel case digunakan dalam penamaan struct dan camel case untuk penamaan property-nya. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct User {\n name: String,\n sign_in_count: u64,\n affliation: Vec,\n active: bool,\n}\n")),(0,i.kt)("h2",{id:"a233-mutable-struct"},"A.23.3. Mutable struct"),(0,i.kt)("p",null,"Penentuan ",(0,i.kt)("em",{parentName:"p"},"mutability")," sebuah struct dilakukan dengan cara menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," seperti pada umumnya variabel. Contohnya bisa dilihat pada variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"user_two")," berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut user_two: User = User{\n name: String::from("Varian Wrynn"),\n sign_in_count: 12,\n affliation: vec![\n String::from("High King of the Alliance"),\n String::from("King of Stormwind"),\n String::from("Champion of the Crimson Ring"),\n ],\n active: false,\n};\n\nuser_two.name = String::from("Anduin Wrynn");\nuser_two.affliation.pop();\nuser_two.active = true;\n\nprintln!("name: {}", user_two.name);\nprintln!("sign-in count: {}", user_two.sign_in_count);\nprintln!("affliation: {:?}", user_two.affliation);\nprintln!("is active? {}", user_two.active);\n')),(0,i.kt)("p",null,"Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"user_two")," adalah object struct yang bisa diubah nilainya (mutable). Perubahan nilai struct bisa dilakukan pada property, contohnya seperti property ",(0,i.kt)("inlineCode",{parentName:"p"},"name"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"affliation"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"active")," yang dicontohkan diubah nilainya."),(0,i.kt)("p",null,"Atau bisa juga perubahannya pada value struct itu sendiri, diganti dengan value baru."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut user_two = User{\n name: String::from("Varian Wrynn"),\n sign_in_count: 12,\n affliation: vec![\n String::from("High King of the Alliance"),\n String::from("King of Stormwind"),\n String::from("Champion of the Crimson Ring"),\n ],\n active: false,\n};\n\nuser_two = User{\n name: String::from("Anduin Wrynn"),\n sign_in_count: 12,\n affliation: vec![\n String::from("High King of the Alliance"),\n String::from("King of Stormwind"),\n ],\n active: true,\n};\n')),(0,i.kt)("h2",{id:"a234-macam-macam-notasi-deklarasi-variabel-struct"},"A.23.4. Macam-macam notasi deklarasi variabel struct"),(0,i.kt)("h3",{id:"-type-inference--manifest-typing"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"type inference")," / ",(0,i.kt)("em",{parentName:"h3"},"manifest typing")),(0,i.kt)("p",null,"Metode deklarasi ",(0,i.kt)("em",{parentName:"p"},"type inference")," ataupun ",(0,i.kt)("em",{parentName:"p"},"manifest typing")," bisa digunakan dalam variabel struct."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Car {\n brand: String,\n model: String,\n}\n\nlet car_one = Car{\n brand: String::from("Toyota"),\n model: String::from("Sprinter Trueno AE86"),\n};\n\nlet car_two: Car = Car{\n brand: String::from("BMW"),\n model: String::from("M3 GTR"),\n};\n')),(0,i.kt)("h3",{id:"-variabel-struct-tanpa-predefined-value"},"\u25c9 Variabel struct tanpa ",(0,i.kt)("em",{parentName:"h3"},"predefined value")),(0,i.kt)("p",null,"Variabel struct boleh didefinisikan tanpa ",(0,i.kt)("em",{parentName:"p"},"predefined value"),", jadi cukup tipe datanya saja yang ditentukan saat deklarasi variabel. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut car_three: Car;\ncar_three = Car{\n brand: String::from("Audi"),\n model: String::from("Le Mans Quattro"),\n};\n')),(0,i.kt)("h3",{id:"-variabel-struct-dengan-nilai-berasal-dari-struct-lain"},"\u25c9 Variabel struct dengan nilai berasal dari struct lain"),(0,i.kt)("p",null,"Jika ada kebutuhan untuk membuat variabel object struct yang nilai property-nya sebagian adalah berasal dari variabel struct lain, bisa manfaatkan syntax ",(0,i.kt)("inlineCode",{parentName:"p"},".."),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut car_three: Car;\ncar_three = Car{\n brand: String::from("Audi"),\n model: String::from("Le Mans Quattro"),\n};\nprintln!("{} {}", car_three.brand, car_three.model);\n\nlet mut car_four: Car;\ncar_four = Car{\n brand: String::from("Audi Brand"),\n ..car_three\n};\nprintln!("{} {}", car_four.brand, car_four.model);\n')),(0,i.kt)("p",null,"Pada contoh di atas, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"car_four")," property ",(0,i.kt)("inlineCode",{parentName:"p"},"brand"),"-nya diisi dengan ",(0,i.kt)("inlineCode",{parentName:"p"},'"Audi Brand"'),". Sedangkan property-property lainnya nilai didapat dari nilai propery milik ",(0,i.kt)("inlineCode",{parentName:"p"},"car_three"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(341).Z,width:"511",height:"108"})),(0,i.kt)("p",null,"Coba jalankan program, akan terlihat nilai dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"car_four")," untuk property selain ",(0,i.kt)("inlineCode",{parentName:"p"},"brand")," adalah sama dengan nilai property-property ",(0,i.kt)("inlineCode",{parentName:"p"},"car_three"),"."),(0,i.kt)("h3",{id:"-field-init-shorthand"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Field init shorthand")),(0,i.kt)("p",null,"Jika ada variabel yang namanya sama persis dengan nama property sebuah struct, maka dalam deklarasi variabel struct bisa menggunakan teknik penulisan seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let model = String::from("Corvette C1");\n\nlet car_five = Car{\n brand: String::from("Chevrolet"),\n model,\n};\n')),(0,i.kt)("p",null,"Cukup tulis nama variabelnya saja tanpa value."),(0,i.kt)("p",null,"Teknik ",(0,i.kt)("em",{parentName:"p"},"shorthand")," ini bisa juga digunakan dalam fungsi. Contoh dibawah ini ada fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"new_car")," yang memiliki nama parameter adalah sama persis dengan nama property struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Car"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn new_car(brand: String, model: String) -> Car {\n Car{\n brand,\n model,\n }\n}\n\nfn main() {\n let car_six = new_car(\n String::from("Chevrolet"),\n String::from("Corvette C6")\n );\n // ...\n}\n')),(0,i.kt)("h3",{id:"-deklarasi-nilai-struct-secara-horizontal"},"\u25c9 Deklarasi nilai struct secara horizontal"),(0,i.kt)("p",null,"Umumnya, operasi ",(0,i.kt)("em",{parentName:"p"},"assignment")," nilai struct dituliskan secara vertikal. Untuk struct yang property-nya sedikit biasanya dituliskan secara horizontal contohnya seperti di bawah ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct Point {\n x: f32,\n y: f32,\n}\n\nlet point_one = Point { x: 3.14, y: 8.0 };\n")),(0,i.kt)("h3",{id:"-destructuring-assignment"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Destructuring assignment")),(0,i.kt)("p",null,"Teknik penulisan ini bisa dipakai dalam case dimana nilai property struct perlu ditampung ke variabel baru. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let point_one = Point { x: 3.14, y: 8.0 };\n\nlet Point { x: x_one, y: y_one } = point_one;\nprintln!("x_one: {}", x_one);\nprintln!("y_one: {}", y_one);\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"x_one")," di atas akan menampung nilai dari ",(0,i.kt)("inlineCode",{parentName:"li"},"point_one.x")),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"y_one")," di atas akan menampung nilai dari ",(0,i.kt)("inlineCode",{parentName:"li"},"point_one.y"))),(0,i.kt)("p",null,"Jika tidak semua property struct perlu untuk ditampung ke variabel baru, maka gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"_")," untuk property yang nilainya tidak ditampung. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let point_one = Point { x: 3.14, y: 8.0 };\n\nlet Point { x: _, y: y_one } = point_one;\nprintln!("y_one: {}", y_one);\n')),(0,i.kt)("h2",{id:"a235-unit-like-structs"},"A.23.5. ",(0,i.kt)("em",{parentName:"h2"},"Unit-like structs")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Unit-like structs")," adalah struct yang didefinisikan tanpa property. Cara deklrasinya bisa dilihat pada contoh berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"struct StructOne;\n\nlet data_one = StructOne;\n")),(0,i.kt)("p",null,"Teknik pembuatan struct ini berguna ketika ada case dimana ada kebutuhan untuk mengimplementasikan sebuah trait ke suatu tipe data. Lebih jelasnya akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits"},"Traits"),"."),(0,i.kt)("h2",{id:"a236-debugging-value-struct-menggunakan-derivedebug"},"A.23.6. Debugging value struct menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"#[derive(Debug)]")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"By default"),", error akan muncul saat berusaha menampilkan nilai variabel struct (bukan nilai property-nya, tapi nilai variabel struct-nya) menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Ini disebabkan karena data yang bisa ditampilkan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," harus memiliki trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Display"),")."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(6091).Z,width:"743",height:"308"})),(0,i.kt)("p",null,"Lalu jika ingin melihat nilai property struct bagaimana solusinya? Bisa dengan menampilkan nilai property satu per satu, tapi pastinya butuh effort."),(0,i.kt)("p",null,"Cara yang lebih elegan adalah dengan menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]"),". Penerapannya cukup dengan menuliskan atribut tersebut tepat di atas deklarasi struct. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct GamingConsole {\n name: String\n}\n\nlet console_one = GamingConsole{\n name: String::from("PlayStation 5"),\n};\n\nprintln!("data_struct_one: {:#?}", console_one);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(7542).Z,width:"510",height:"330"})),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai traits dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai attribute dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/attributes"},"Attributes")))),(0,i.kt)("h2",{id:"a237-tuple-struct"},"A.23.7. Tuple struct"),(0,i.kt)("p",null,"Tuple struct adalah struct yang didefinisikan dengan gaya tuple. Property pada tuple struct diakses menggunakan notasi pengaksesan tuple item."),(0,i.kt)("p",null,"Pada contoh berikut tuple struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Color")," didefinisikan dengan isi 3 buah item yang kesemuanya bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),". Lalu tipe data tuple struct tersebut digunakan untuk membuat variabel baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"red"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Color(i32, i32, i32);\n\nlet red = Color(255, 0, 0);\n\nprintln!("{:?} {:?} {:?}", red.0, red.1, red.2);\n')),(0,i.kt)("p",null,"Bisa dilihat di contoh, property diakses menggunakan nomor indeks dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"variable.index"),"."),(0,i.kt)("p",null,"Contoh lainnya, tuple struct ",(0,i.kt)("inlineCode",{parentName:"p"},"SomeTupleStruct")," berikut dideklarasikan memiliki item ke-1 bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan item ke-2 bertipe boolean."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct SomeTupleStruct(i32, bool);\n\nlet some_data = SomeTupleStruct(0, false);\n\nprintln!("{:?} {:?}", some_data.0, some_data.1);\n')),(0,i.kt)("h2",{id:"a238-struct-property-visibility"},"A.23.8. Struct property visibility"),(0,i.kt)("p",null,"Sekarang mari kita coba praktikkan satu program lagi, namun kali ini sedikit berbeda, struct kita definisikan sebagai module item."),(0,i.kt)("p",null,"Silakan siapkan program dengan struktur seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u251c\u2500\u2500\u2500 models.rs\n \u2514\u2500\u2500\u2500 models\n \u2514\u2500\u2500\u2500 game.rs\n")),(0,i.kt)("p",null,"Lalu isi file program dengan kode di bawah ini. Sebuah struct dengan path ",(0,i.kt)("inlineCode",{parentName:"p"},"models::game::GamingConsole"),", dan satu buah object di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," yang dibuat dari struct tersebut. Pastikan definisi semua module item adalah publik (ada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub"),")."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod models;\n\nfn main() {\n let ps5 = models::game::GamingConsole{\n name: String::from("PS 5")\n };\n println!("{:#?}", ps5);\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"pub mod game;\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models/game.rs"',title:'"src/models/game.rs"'},"#[derive(Debug)]\npub struct GamingConsole {\n name: String\n}\n")),(0,i.kt)("p",null,"Ada yang aneh, baris kode pembuatan variabel object ",(0,i.kt)("inlineCode",{parentName:"p"},"ps5")," terdeteksi sebagai error. Padahal definisi submodule dan item-nya sudah publik semua."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(7728).Z,width:"419",height:"185"})),(0,i.kt)("p",null,"Jika dilihat dari keterangan error, sebenarnya cukup jelas bagian mana yang menjadi sumber masalah, yaitu field ",(0,i.kt)("inlineCode",{parentName:"p"},"name")," yang terdeteksi sebagai private property."),(0,i.kt)("p",null,"Struct jika didefinisikan di file yang sama dengan statement pemanggilan struct tersebut tidak akan menghasilkan error. Tetapi jika definisi struct-nya terpisah dari statement pemanggilan struct (seperti contoh di atas), maka field dari struct tersebut harus publik."),(0,i.kt)("p",null,"Caranya membuat field sebagai publik adalah dengan menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada property struct. Silakan ubah definisi struct ",(0,i.kt)("inlineCode",{parentName:"p"},"GamingConsole")," menjadi seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// before\npub struct GamingConsole {\n name: String\n}\n\n// after\npub struct GamingConsole {\n pub name: String\n}\n")),(0,i.kt)("p",null,"Bisa dilihat keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," ditambahkan pada deklarasi property struct. yang sebelumnya ",(0,i.kt)("inlineCode",{parentName:"p"},"name: String")," sekarang ada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," didepannya."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai visibility property dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("h2",{id:"a239-tuple-struct-property-visibility"},"A.23.9. Tuple struct property visibility"),(0,i.kt)("p",null,"Lalu bagaimana dengan tuple struct? apakah property-nya juga harus didefinisikan publik agar bisa diakses dari tempat lain? Jawabannya ada di praktik berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 main.rs\n \u251c\u2500\u2500\u2500 models.rs\n \u2514\u2500\u2500\u2500 models\n \u2514\u2500\u2500\u2500 color.rs\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod models;\n\nfn main() {\n let red = models::color::Color(255, 255, 0);\n println!("{:#?}", red);\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models.rs"',title:'"src/models.rs"'},"pub mod color;\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/models/color.rs"',title:'"src/models/color.rs"'},"#[derive(Debug)]\npub struct Color(i32, i32, i32);\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Struct",src:t(6610).Z,width:"626",height:"255"})),(0,i.kt)("p",null,"Yap, error yang mirip juga muncul. Jadi jawaban dari pertanyaan sebelumnya adalah iya, property tuple struct juga harus publik agar bisa diakses dari tempat lain."),(0,i.kt)("p",null,"Cara deklarasi tuple struct dengan property publik adalah dengan menambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," di masing-masing deklarasi parameter tuple struct. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// before\npub struct Color(i32, i32, i32);\n\n// after\npub struct Color(pub i32, pub i32, pub i32);\n")),(0,i.kt)("p",null,"Jalankan program untuk melihat hasilnya, error tidak muncul."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai visibility property dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("h2",{id:"a2310-generic-pada-struct"},"A.23.10. Generic pada struct"),(0,i.kt)("p",null,"Pembahasan mengenai generic pada struct ada pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics#a365-generics-struct"},"Generics"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/struct"},"github.com/novalagung/dasarpemrogramanrust-example/../struct")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-00-structs.html"},"https://doc.rust-lang.org/book/ch05-00-structs.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-01-defining-structs.html"},"https://doc.rust-lang.org/book/ch05-01-defining-structs.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.struct.html"},"https://doc.rust-lang.org/std/keyword.struct.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/custom_types/structs.html"},"https://doc.rust-lang.org/rust-by-example/custom_types/structs.html"))))}o.isMDXComponent=!0},1226:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjwAAAB7CAIAAAD/r80wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjZUMTU6NDg6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI2VDE3OjUzOjIzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI2VDE3OjUzOjIzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjhlMWU1N2MwLTVjNGIt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"},341:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAf8AAABsCAIAAADrFiywAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjZUMTY6MTc6NDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI2VDE3OjUyOjAxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI2VDE3OjUyOjAxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFjMmVkMjgwLTQxOGYt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"},6091:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/struct-4-86fb5f564d330bc2d1cc10e13ea2d649.png"},7542:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/struct-5-5e013d5895bef6a938e2c1333ff52205.png"},7728:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaMAAAC5CAIAAAAKzcfqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjlUMTM6NTI6MDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDE0OjI1OjM1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDE0OjI1OjM1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg4MWFmNWY1LTcyZTkt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S+ZfvbnGn0xWkE6HrqcXn25JOn+kwnSu6X63BmGs7KdrzkcZwNL2sFEh3YcmSrWqJF3mGEr1SjrpgpWoSpEuDaaGpDPxbOnTOZt0Qbqw585x1pqRThGkBenKkYTogKx29NqM1RajEA07E4t80vaw0SCdjk/t+lqfztlJN5Le1uBIV4TARr07dC1JJ3y64t/ufbqktHPnjydU+3cNSYdPh40m6XK/LHPuKkln+ua8gYj2/XR+n51AVWxYtgPS+TGvq25GJIKuAN0TJ/vpzHIV6Xrtp6vw+xr7dGIAl346bByj12NmaNXo1I06n84de53vaUTCDoxGRk4d58sde60bq83308Sn8926wZDOHXstElSSTo+9lhBpTzodgdZFtan0jZnI2Cs21KRb1y8teT5dn111A1Tkebphe/2L5+kwSDescoNi82heOphdWwXvSAw3iGl72HCRbtuW6axqvr7rR49+9rP7e3+yvta40euec8Oc58//9dr/bXp+CHOo33t92U1D28OGi3SqdqqqqSru//7kpz+a3PnOsz9mDWv6X0Pbw4aLdFnVVFLVNLtds4Y1/a+h7WHDRToMwzBIh2EYBukwDMMgHYZhGKTDMAyDdBiGYZAOwzAM0mEYBukwDMNG3/4fXrze1tJWD6UAAAAASUVORK5CYII="},6610:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/struct-7-517c0402e96dfd5898464887fa79ec98.png"}}]); \ No newline at end of file diff --git a/assets/js/9a3629a6.035a9d13.js b/assets/js/9a3629a6.035a9d13.js new file mode 100644 index 00000000..f74e1486 --- /dev/null +++ b/assets/js/9a3629a6.035a9d13.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7865],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>h});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},o=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,o=p(e,["components","mdxType","originalType","parentName"]),m=u(a),h=i,k=m["".concat(s,".").concat(h)]||m[h]||d[h]||r;return a?n.createElement(k,l(l({ref:t},o),{},{components:a})):n.createElement(k,l({ref:t},o))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,l=new Array(r);l[0]=m;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p.mdxType="string"==typeof e?e:i,l[1]=p;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=a(7462),i=(a(7294),a(3905));const r={sidebar_position:51,title:"A.51. File, Path, Directory",sidebar_label:"A.51. File, Path, Directory"},l=void 0,p={unversionedId:"basic/file-path-directory",id:"basic/file-path-directory",title:"A.51. File, Path, Directory",description:"Pada chapter ini kita akan belajar tentang beberapa API milik Rust yang disediakan untuk manajemen path dan file system.",source:"@site/docs/basic/file-path-directory.md",sourceDirName:"basic",slug:"/basic/file-path-directory",permalink:"/basic/file-path-directory",draft:!1,tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_position:51,title:"A.51. File, Path, Directory",sidebar_label:"A.51. File, Path, Directory"},sidebar:"tutorialSidebar",previous:{title:"A.50. Date Time",permalink:"/basic/datetime"}},s={},u=[{value:"A.51.1. File path (std::path::Path)",id:"a511-file-path-stdpathpath",level:2},{value:"A.52.2. Method filepath",id:"a522-method-filepath",level:2},{value:"\u25c9 Associated function Path::new()",id:"-associated-function-pathnew",level:3},{value:"\u25c9 Method join()",id:"-method-join",level:3},{value:"\u25c9 Method exists()",id:"-method-exists",level:3},{value:"\u25c9 Method is_file() & is_dir()",id:"-method-is_file--is_dir",level:3},{value:"\u25c9 Method is_absolute() & is_relative()",id:"-method-is_absolute--is_relative",level:3},{value:"A.52.3. Module std::fs (file system)",id:"a523-module-stdfs-file-system",level:2},{value:"A.52.4. Manajemen file system",id:"a524-manajemen-file-system",level:2},{value:"\u25c9 Pembuatan folder (fs::create_dir)",id:"-pembuatan-folder-fscreate_dir",level:3},{value:"\u25c9 Menulis konten file (fs::write)",id:"-menulis-konten-file-fswrite",level:3},{value:"\u25c9 Menghapus file (fs::remove_file)",id:"-menghapus-file-fsremove_file",level:3},{value:"\u25c9 Menghapus folder (fs::remove_dir)",id:"-menghapus-folder-fsremove_dir",level:3},{value:"\u25c9 List items dalam folder",id:"-list-items-dalam-folder",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:u};function d(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},o,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang beberapa API milik Rust yang disediakan untuk manajemen path dan file system."),(0,i.kt)("h2",{id:"a511-file-path-stdpathpath"},"A.51.1. File path (",(0,i.kt)("inlineCode",{parentName:"h2"},"std::path::Path"),")"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},'"/home/novalagung/Desktop/my text.txt"')," adalah salah satu contoh file path. Di Rust, file path bisa direpresentasikan sebagai string (seperti yang sudah dicontohkan), atau menggunakan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Path"),"."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Path")," tersedia dalam module ",(0,i.kt)("inlineCode",{parentName:"p"},"std::path"),". Cara penggunaannya cukup mudah, sebagai contoh, beberapa filepath berikut menghasilkan path yang sama:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let filepath_1 = "/home/novalagung/Desktop/my text.txt";\nlet filepath_2 = Path::new("/home/novalagung/Desktop/my text.txt");\nlet filepath_3 = Path::new("/home/novalagung/Desktop").join("my text.txt");\nlet filepath_4 = Path::new("/home/novalagung").join("Desktop").join("my text.txt");\nlet filepath_5 = Path::new("/home").join("novalagung/Desktop/my text.txt");\n')),(0,i.kt)("h2",{id:"a522-method-filepath"},"A.52.2. Method filepath"),(0,i.kt)("h3",{id:"-associated-function-pathnew"},"\u25c9 Associated function ",(0,i.kt)("inlineCode",{parentName:"h3"},"Path::new()")),(0,i.kt)("p",null,"Digunakan untuk membuat object ",(0,i.kt)("inlineCode",{parentName:"p"},"Path")," dari suatu string. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'Path::new("/home/novalagung/Desktop/my text.txt");\n')),(0,i.kt)("h3",{id:"-method-join"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"join()")),(0,i.kt)("p",null,"Digunakan untuk menggabungkan segment filepath. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'Path::new("/home/novalagung").join("Desktop").join("my text.txt");\n')),(0,i.kt)("p",null,"Hasil dari operasi di atas adalah path:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"/home/novalagung/Desktop/my text.txt\n")),(0,i.kt)("h3",{id:"-method-exists"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"exists()")),(0,i.kt)("p",null,"Digunakan untuk mengecek apakah suatu filepath ada atau tidak."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).exists() {\n // path exists\n}\n")),(0,i.kt)("h3",{id:"-method-is_file--is_dir"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_file()")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_dir()")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_file()")," digunakan untuk mengecek apakah suatu filepath berisi file."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_file() {\n // path is a file\n}\n")),(0,i.kt)("p",null,"Sedangkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_dir()")," digunakan untuk mengecek apakah suatu filepath adalah folder/directory."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_dir() {\n // path contains directory\n}\n")),(0,i.kt)("h3",{id:"-method-is_absolute--is_relative"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_absolute()")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_relative()")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_absolute()")," digunakan untuk mengecek apakah suatu filepath adalah ",(0,i.kt)("em",{parentName:"p"},"absolute path"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_absolute() {\n // path is an absolute path\n}\n")),(0,i.kt)("p",null,"Sedangkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_relative()")," digunakan untuk mengecek apakah suatu filepath adalah ",(0,i.kt)("em",{parentName:"p"},"relative path"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_relative() {\n // path is a relative path\n}\n")),(0,i.kt)("h2",{id:"a523-module-stdfs-file-system"},"A.52.3. Module ",(0,i.kt)("inlineCode",{parentName:"h2"},"std::fs")," (file system)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"std::fs")," merupakan module yang disediakan Rust untuk pengolahan file system. Di dalamnya berisinya banyak sekali fungsi untuk keperluan seperti pembuatan file, modifikasi konten file, dan lainnya."),(0,i.kt)("p",null,"Sebagai contoh, untuk membuat suatu directory bisa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::create_dir"),". Isi argument pemanggilan fungsi dengan path dalam bentuk string (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"std::path::Path")," juga boleh)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = "./files";\nlet res = fs::create_dir(path);\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::create_dir")," mengembalikan value bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result<(), Error>"),". Gunakan pattern matching ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk mengecek hasil operasi apakah sukses atau tidak."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match fs::create_dir("./files") {\n Err(err) => {\n println!("error on creating directory! {}", err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"Result")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result"),"."),(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai pattern matching dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching"),"."))),(0,i.kt)("h2",{id:"a524-manajemen-file-system"},"A.52.4. Manajemen file system"),(0,i.kt)("h3",{id:"-pembuatan-folder-fscreate_dir"},"\u25c9 Pembuatan folder (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::create_dir"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::create_dir")," digunakan untuk membuat folder. Contoh penerapannya sudah dibahas di sesi ",(0,i.kt)("a",{parentName:"p",href:"/basic/file-path-directory#a523-module-stdfs-file-system"},"A.52.3. Module std::fs (file system)")," di atas."),(0,i.kt)("h3",{id:"-menulis-konten-file-fswrite"},"\u25c9 Menulis konten file (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::write"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::write")," digunakan untuk membuat folder. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("./files").join("target.txt");\nlet content = "hello rust!";\nlet res = fs::write(path, content);\n\nmatch res {\n Err(err) => {\n println!("error on writing file {}! {}", path.to_str().unwrap_or_default(), err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::write")," melakukan penulisan konten pada variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"content")," ke path ",(0,i.kt)("inlineCode",{parentName:"p"},"path"),". Mode penulisannya adalah ",(0,i.kt)("em",{parentName:"p"},"overwrite")," (bukan ",(0,i.kt)("em",{parentName:"p"},"append"),"), yang artinya konten lama pada filepath akan di-",(0,i.kt)("em",{parentName:"p"},"replace")," total dengan konten baru."),(0,i.kt)("p",null,"Jika file tidak ada pada ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," tujuan, maka otomatis dibuatkan file baru. Namun jika folder/directory di mana file akan dibuat/ditulis tidak ada, maka muncul error."),(0,i.kt)("h3",{id:"-menghapus-file-fsremove_file"},"\u25c9 Menghapus file (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::remove_file"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::remove_file")," digunakan untuk menghapus file pada suatu path. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("./files").join("target.txt");\nlet res = fs::remove_file(path);\n\nmatch res {\n Err(err) => {\n println!("error on deleting file {}! {}", path.to_str().unwrap_or_default(), err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("h3",{id:"-menghapus-folder-fsremove_dir"},"\u25c9 Menghapus folder (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::remove_dir"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::remove_dir")," digunakan untuk menghapus folder/directory. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("./files");\nlet res = fs::remove_dir(path);\n\nmatch res {\n Err(err) => {\n println!("error on deleting directory {}! {}", path.to_str().unwrap_or_default(), err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("h3",{id:"-list-items-dalam-folder"},"\u25c9 List items dalam folder"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::read_dir")," digunakan untuk menampilkan list items suatu folder (baik subfolder ataupun file). Fungsi ini mengmbalikan nilai bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),", untuk mengakses list items bisa menggunakan teknik pattern matching, atau boleh juga langsung di ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap()")," (dengan resiko program bisa panic ketika ada error)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("D:\\\\Labs\\\\Adam Studio\\\\Ebook\\\\dasarpemrogramanrust\\\\file_path_directory_1");\nlet paths = fs::read_dir(path).unwrap();\n\nfor path in paths {\n let item = path.unwrap();\n println!("file name: {:?}, file path: {:?}", item.file_name(), item.path().display())\n}\n')),(0,i.kt)("p",null,"Pada contoh di atas, penulis menggunakan testing path yang isinya 4 buah item:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"File, Path, Directory",src:a(2944).Z,width:"595",height:"176"})),(0,i.kt)("p",null,"Output program bisa dilihat pada gambar berikut:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"File, Path, Directory",src:a(214).Z,width:"887",height:"149"})),(0,i.kt)("p",null,"Tipe data variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"paths")," di atas adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"ReadDir")," yang merupakan tipe data iterator. Jika digunakan pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for"),", maka variabel element perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," akan bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Dari tipe ini kita bisa mengakses file name maupun file path."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/file_path_directory"},"github.com/novalagung/dasarpemrogramanrust-example/../file_path_directory")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang append content file (",(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/30684624/what-is-the-best-variant-for-appending-a-new-line-in-a-text-file"},"https://stackoverflow.com/questions/30684624/what-is-the-best-variant-for-appending-a-new-line-in-a-text-file"),")")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/path/struct.Path.html"},"https://doc.rust-lang.org/std/path/struct.Path.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std_misc/path.html"},"https://doc.rust-lang.org/rust-by-example/std_misc/path.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std_misc/fs.html"},"https://doc.rust-lang.org/rust-by-example/std_misc/fs.html"))))}d.isMDXComponent=!0},2944:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlMAAACwCAIAAACkbHy6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFvGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDQtMDdUMTk6MTk6MDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA0LTA3VDE5OjI5OjA5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA0LTA3VDE5OjI5OjA5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0MWZkNDUwNy1lZGEzLWRkNGMtOTBkMC00NGNjZGQ2MjQwNDUiIHhtcE1NOkRvY3VtZW50SUQ9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"},214:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/file-path-directory-2-bbe0bb5499225e418b251930c44fb8f6.png"}}]); \ No newline at end of file diff --git a/assets/js/9a3629a6.fcabd2cf.js b/assets/js/9a3629a6.fcabd2cf.js deleted file mode 100644 index 7b7954f5..00000000 --- a/assets/js/9a3629a6.fcabd2cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7865],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>h});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=n.createContext({}),u=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},o=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},m=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,s=e.parentName,o=p(e,["components","mdxType","originalType","parentName"]),m=u(a),h=i,k=m["".concat(s,".").concat(h)]||m[h]||d[h]||r;return a?n.createElement(k,l(l({ref:t},o),{},{components:a})):n.createElement(k,l({ref:t},o))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,l=new Array(r);l[0]=m;var p={};for(var s in t)hasOwnProperty.call(t,s)&&(p[s]=t[s]);p.originalType=e,p.mdxType="string"==typeof e?e:i,l[1]=p;for(var u=2;u{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=a(7462),i=(a(7294),a(3905));const r={sidebar_position:51,title:"A.51. File, Path, Directory",sidebar_label:"A.51. File, Path, Directory"},l=void 0,p={unversionedId:"basic/file-path-directory",id:"basic/file-path-directory",title:"A.51. File, Path, Directory",description:"Pada chapter ini kita akan belajar tentang beberapa API milik Rust yang disediakan untuk manajemen path dan file system.",source:"@site/docs/basic/file-path-directory.md",sourceDirName:"basic",slug:"/basic/file-path-directory",permalink:"/basic/file-path-directory",draft:!1,tags:[],version:"current",sidebarPosition:51,frontMatter:{sidebar_position:51,title:"A.51. File, Path, Directory",sidebar_label:"A.51. File, Path, Directory"},sidebar:"tutorialSidebar",previous:{title:"A.50. Date Time",permalink:"/basic/datetime"}},s={},u=[{value:"A.51.1. File path (std::path::Path)",id:"a511-file-path-stdpathpath",level:2},{value:"A.52.2. Method filepath",id:"a522-method-filepath",level:2},{value:"\u25c9 Associated function Path::new()",id:"-associated-function-pathnew",level:3},{value:"\u25c9 Method join()",id:"-method-join",level:3},{value:"\u25c9 Method exists()",id:"-method-exists",level:3},{value:"\u25c9 Method is_file() & is_dir()",id:"-method-is_file--is_dir",level:3},{value:"\u25c9 Method is_absolute() & is_relative()",id:"-method-is_absolute--is_relative",level:3},{value:"A.52.3. Module std::fs (file system)",id:"a523-module-stdfs-file-system",level:2},{value:"A.52.4. Manajemen file system",id:"a524-manajemen-file-system",level:2},{value:"\u25c9 Pembuatan folder (fs::create_dir)",id:"-pembuatan-folder-fscreate_dir",level:3},{value:"\u25c9 Menulis konten file (fs::write)",id:"-menulis-konten-file-fswrite",level:3},{value:"\u25c9 Menghapus file (fs::remove_file)",id:"-menghapus-file-fsremove_file",level:3},{value:"\u25c9 Menghapus folder (fs::remove_dir)",id:"-menghapus-folder-fsremove_dir",level:3},{value:"\u25c9 List items dalam folder",id:"-list-items-dalam-folder",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:u};function d(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},o,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang beberapa API milik Rust yang disediakan untuk manajemen path dan file system."),(0,i.kt)("h2",{id:"a511-file-path-stdpathpath"},"A.51.1. File path (",(0,i.kt)("inlineCode",{parentName:"h2"},"std::path::Path"),")"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},'"/home/novalagung/Desktop/my text.txt"')," adalah salah satu contoh file path. Di Rust, file path bisa direpresentasikan sebagai string (seperti yang sudah dicontohkan), atau menggunakan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Path"),"."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Path")," tersedia dalam module ",(0,i.kt)("inlineCode",{parentName:"p"},"std::path"),". Cara penggunaannya cukup mudah, sebagai contoh, beberapa filepath berikut menghasilkan path yang sama:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let filepath_1 = "/home/novalagung/Desktop/my text.txt";\nlet filepath_2 = Path::new("/home/novalagung/Desktop/my text.txt");\nlet filepath_3 = Path::new("/home/novalagung/Desktop").join("my text.txt");\nlet filepath_4 = Path::new("/home/novalagung").join("Desktop").join("my text.txt");\nlet filepath_5 = Path::new("/home").join("novalagung/Desktop/my text.txt");\n')),(0,i.kt)("h2",{id:"a522-method-filepath"},"A.52.2. Method filepath"),(0,i.kt)("h3",{id:"-associated-function-pathnew"},"\u25c9 Associated function ",(0,i.kt)("inlineCode",{parentName:"h3"},"Path::new()")),(0,i.kt)("p",null,"Digunakan untuk membuat object ",(0,i.kt)("inlineCode",{parentName:"p"},"Path")," dari suatu string. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'Path::new("/home/novalagung/Desktop/my text.txt");\n')),(0,i.kt)("h3",{id:"-method-join"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"join()")),(0,i.kt)("p",null,"Digunakan untuk menggabungkan segment filepath. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'Path::new("/home/novalagung").join("Desktop").join("my text.txt");\n')),(0,i.kt)("p",null,"Hasil dari operasi di atas adalah path:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre"},"/home/novalagung/Desktop/my text.txt\n")),(0,i.kt)("h3",{id:"-method-exists"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"exists()")),(0,i.kt)("p",null,"Digunakan untuk mengecek apakah suatu filepath ada atau tidak."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).exists() {\n // path exists\n}\n")),(0,i.kt)("h3",{id:"-method-is_file--is_dir"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_file()")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_dir()")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_file()")," digunakan untuk mengecek apakah suatu filepath berisi file."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_file() {\n // path is a file\n}\n")),(0,i.kt)("p",null,"Sedangkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_dir()")," digunakan untuk mengecek apakah suatu filepath adalah folder/directory."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_dir() {\n // path contains directory\n}\n")),(0,i.kt)("h3",{id:"-method-is_absolute--is_relative"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_absolute()")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_relative()")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_absolute()")," digunakan untuk mengecek apakah suatu filepath adalah ",(0,i.kt)("em",{parentName:"p"},"absolute path"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_absolute() {\n // path is an absolute path\n}\n")),(0,i.kt)("p",null,"Sedangkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_relative()")," digunakan untuk mengecek apakah suatu filepath adalah ",(0,i.kt)("em",{parentName:"p"},"relative path"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"if Path::new(path).is_relative() {\n // path is a relative path\n}\n")),(0,i.kt)("h2",{id:"a523-module-stdfs-file-system"},"A.52.3. Module ",(0,i.kt)("inlineCode",{parentName:"h2"},"std::fs")," (file system)"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"std::fs")," merupakan module yang disediakan Rust untuk pengolahan file system. Didalamnya berisinya banyak sekali fungsi untuk keperluan seperti pembuatan file, modifikasi konten file, dan lainnya."),(0,i.kt)("p",null,"Sebagai contoh, untuk membuat suatu directory bisa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::create_dir"),". Isi argument pemanggilan fungsi dengan path dalam bentuk string (atau ",(0,i.kt)("inlineCode",{parentName:"p"},"std::path::Path")," juga boleh)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = "./files";\nlet res = fs::create_dir(path);\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::create_dir")," mengembalikan value bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result<(), Error>"),". Gunakan pattern matching ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk mengecek hasil operasi apakah sukses atau tidak."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'match fs::create_dir("./files") {\n Err(err) => {\n println!("error on creating directory! {}", err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"Result")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result"),"."),(0,i.kt)("li",{parentName:"ul"},"Lebih detailnya mengenai pattern matching dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching"),"."))),(0,i.kt)("h2",{id:"a524-manajemen-file-system"},"A.52.4. Manajemen file system"),(0,i.kt)("h3",{id:"-pembuatan-folder-fscreate_dir"},"\u25c9 Pembuatan folder (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::create_dir"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::create_dir")," digunakan untuk membuat folder. Contoh penerapannya sudah dibahas di sesi ",(0,i.kt)("a",{parentName:"p",href:"/basic/file-path-directory#a523-module-stdfs-file-system"},"A.52.3. Module std::fs (file system)")," di atas."),(0,i.kt)("h3",{id:"-menulis-konten-file-fswrite"},"\u25c9 Menulis konten file (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::write"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::write")," digunakan untuk membuat folder. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("./files").join("target.txt");\nlet content = "hello rust!";\nlet res = fs::write(path, content);\n\nmatch res {\n Err(err) => {\n println!("error on writing file {}! {}", path.to_str().unwrap_or_default(), err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::write")," melakukan penulisan konten pada variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"content")," ke path ",(0,i.kt)("inlineCode",{parentName:"p"},"path"),". Mode penulisannya adalah ",(0,i.kt)("em",{parentName:"p"},"overwrite")," (bukan ",(0,i.kt)("em",{parentName:"p"},"append"),"), yang artinya konten lama pada filepath akan di-",(0,i.kt)("em",{parentName:"p"},"replace")," total dengan konten baru."),(0,i.kt)("p",null,"Jika file tidak ada pada ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," tujuan, maka otomatis dibuatkan file baru. Namun jika folder/directory dimana file akan dibuat/ditulis tidak ada, maka muncul error."),(0,i.kt)("h3",{id:"-menghapus-file-fsremove_file"},"\u25c9 Menghapus file (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::remove_file"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::remove_file")," digunakan untuk menghapus file pada suatu path. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("./files").join("target.txt");\nlet res = fs::remove_file(path);\n\nmatch res {\n Err(err) => {\n println!("error on deleting file {}! {}", path.to_str().unwrap_or_default(), err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("h3",{id:"-menghapus-folder-fsremove_dir"},"\u25c9 Menghapus folder (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::remove_dir"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::remove_dir")," digunakan untuk menghapus folder/directory. Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("./files");\nlet res = fs::remove_dir(path);\n\nmatch res {\n Err(err) => {\n println!("error on deleting directory {}! {}", path.to_str().unwrap_or_default(), err);\n return\n },\n _ => {},\n}\n')),(0,i.kt)("h3",{id:"-list-items-dalam-folder"},"\u25c9 List items dalam folder"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::read_dir")," digunakan untuk menampilkan list items suatu folder (baik subfolder ataupun file). Fungsi ini mengmbalikan nilai bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),", untuk mengakses list items bisa menggunakan teknik pattern matching, atau boleh juga langsung di ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap()")," (dengan resiko program bisa panic ketika ada error)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let path = Path::new("D:\\\\Labs\\\\Adam Studio\\\\Ebook\\\\dasarpemrogramanrust\\\\file_path_directory_1");\nlet paths = fs::read_dir(path).unwrap();\n\nfor path in paths {\n let item = path.unwrap();\n println!("file name: {:?}, file path: {:?}", item.file_name(), item.path().display())\n}\n')),(0,i.kt)("p",null,"Pada contoh di atas, penulis menggunakan testing path yang isinya 4 buah item:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"File, Path, Directory",src:a(2944).Z,width:"595",height:"176"})),(0,i.kt)("p",null,"Output program bisa dilihat pada gambar berikut:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"File, Path, Directory",src:a(214).Z,width:"887",height:"149"})),(0,i.kt)("p",null,"Tipe data variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"paths")," di atas adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"ReadDir")," yang merupakan tipe data iterator. Jika digunakan pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for"),", maka variabel element perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"path")," akan bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Dari tipe ini kita bisa mengakses file name maupun file path."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/file_path_directory"},"github.com/novalagung/dasarpemrogramanrust-example/../file_path_directory")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang append content file (",(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/30684624/what-is-the-best-variant-for-appending-a-new-line-in-a-text-file"},"https://stackoverflow.com/questions/30684624/what-is-the-best-variant-for-appending-a-new-line-in-a-text-file"),")")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/path/struct.Path.html"},"https://doc.rust-lang.org/std/path/struct.Path.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std_misc/path.html"},"https://doc.rust-lang.org/rust-by-example/std_misc/path.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std_misc/fs.html"},"https://doc.rust-lang.org/rust-by-example/std_misc/fs.html"))))}d.isMDXComponent=!0},2944:(e,t,a)=>{a.d(t,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlMAAACwCAIAAACkbHy6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFvGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgMTM3LmRhNGE3ZTUsIDIwMjIvMTEvMjctMDk6MzU6MDMgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyNC4xIChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMDQtMDdUMTk6MTk6MDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTA0LTA3VDE5OjI5OjA5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTA0LTA3VDE5OjI5OjA5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0MWZkNDUwNy1lZGEzLWRkNGMtOTBkMC00NGNjZGQ2MjQwNDUiIHhtcE1NOkRvY3VtZW50SUQ9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"},214:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/file-path-directory-2-bbe0bb5499225e418b251930c44fb8f6.png"}}]); \ No newline at end of file diff --git a/assets/js/a2bea3ed.53e03a1b.js b/assets/js/a2bea3ed.53e03a1b.js new file mode 100644 index 00000000..aea9a296 --- /dev/null +++ b/assets/js/a2bea3ed.53e03a1b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6345],{3905:(a,e,t)=>{t.d(e,{Zo:()=>o,kt:()=>u});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var p=n.createContext({}),d=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},o=function(a){var e=d(a.components);return n.createElement(p.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,o=s(a,["components","mdxType","originalType","parentName"]),k=d(t),u=i,g=k["".concat(p,".").concat(u)]||k[u]||m[u]||r;return t?n.createElement(g,l(l({ref:e},o),{},{components:t})):n.createElement(g,l({ref:e},o))}));function u(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=k;var s={};for(var p in e)hasOwnProperty.call(e,p)&&(s[p]=e[p]);s.originalType=a,s.mdxType="string"==typeof a?a:i,l[1]=s;for(var d=2;d{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:44,title:"A.44. String Literal (&str) vs. String Custom Type",sidebar_label:"A.44. String Literal (&str) vs. String Custom Type"},l=void 0,s={unversionedId:"basic/string-slice-vs-string-literal",id:"basic/string-slice-vs-string-literal",title:"A.44. String Literal (&str) vs. String Custom Type",description:"Pada chapter sebelumnya kita telah membahas tentang bagaimana data slice di-manage di memory. Ada beberapa tipe data yang masuk dalam kategori slice, yang salah satunya adalah string slice atau String.",source:"@site/docs/basic/string-slice-vs-string-literal.md",sourceDirName:"basic",slug:"/basic/string-slice-vs-string-literal",permalink:"/basic/string-slice-vs-string-literal",draft:!1,tags:[],version:"current",sidebarPosition:44,frontMatter:{sidebar_position:44,title:"A.44. String Literal (&str) vs. String Custom Type",sidebar_label:"A.44. String Literal (&str) vs. String Custom Type"},sidebar:"tutorialSidebar",previous:{title:"A.43. Slice Memory Management",permalink:"/basic/slice-memory-management"},next:{title:"A.45. Tipe Data \u279c String Custom Type",permalink:"/basic/tipe-data-custom-type-string-slice"}},p={},d=[{value:"A.44.1. String slice (String)",id:"a441-string-slice-string",level:2},{value:"A.44.2. String literal (&str)",id:"a442-string-literal-str",level:2},{value:"A.44.3. Konversi data string",id:"a443-konversi-data-string",level:2},{value:"\u25c9 Konversi String ke &str",id:"-konversi-string-ke-str",level:3},{value:"\u25c9 Konversi &str ke String",id:"-konversi-str-ke-string",level:3},{value:"A.44.4. String literal & string slice",id:"a444-string-literal--string-slice",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:d};function m(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},o,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter sebelumnya kita telah membahas tentang bagaimana data slice di-manage di memory. Ada beberapa tipe data yang masuk dalam kategori slice, yang salah satunya adalah string slice atau ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("p",null,"Di chapter ini kita akan bahas apa perbedaan antara tipe data string slice (",(0,i.kt)("inlineCode",{parentName:"p"},"String"),") dan string literal ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Pembahasan mengenai topik ini sengaja dilakukan tidak di awal-awal ebook, karena ada banyak hal yang perlu dipahami sebelum mempelajarinya, contohnya seperti aspek management memory dan ownership. Dan karena topik tersebut sudah selesai dibahas, berarti ini adalah waktu yang tepat untuk membahas string slice."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Silakan pelajari kembali pembahasan detail tentang tipe slice pada chapter sebelumnya jika diperlukan. Chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/slice-memory-management"},"Slice Memory Management"))),(0,i.kt)("h2",{id:"a441-string-slice-string"},"A.44.1. String slice (",(0,i.kt)("inlineCode",{parentName:"h2"},"String"),")"),(0,i.kt)("p",null,"String slice atau custom type ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," merupakan tipe data bawaan Rust, dibuat via ",(0,i.kt)("inlineCode",{parentName:"p"},"struct"),", kegunaannya untuk menampung data UTF-8 bytes yang dinamis (bisa berkembang isinya)."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"String")," masuk dalam kategori tipe data slice, isinya adalah data kolektif bertipe bytes, datanya disimpan di heap memory, dan metadata-nya di stack memory. Tipe data ini dikategorikan sebagai tipe data ",(0,i.kt)("strong",{parentName:"p"},"owned"),", yang artinya owner data bisa direpresentasikan oleh variabel. Sebagai contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("Lisa Blackpink");\nprintln!("str1: {str1}");\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"str1")," di atas merupakan owner dari string ",(0,i.kt)("inlineCode",{parentName:"p"},"Lisa Blackpink"),". Dari string tersebut operasi borrow bisa dilakukan. Contohnya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("Lisa Blackpink");\nlet slice1 = &str1[..]; // "Lisa Blackpink"\nlet slice2 = &str1[4..7]; // " Bl"\n')),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"slice1")," adalah variabel baru yang datanya didapat dari borrowing seluruh elemen string milik ",(0,i.kt)("inlineCode",{parentName:"p"},"str1"),". Sedangkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"slice2")," hanya meminjam elemen indeks ke-4 hingga elemen sebelum 7 (yaitu 6)."),(0,i.kt)("p",null,"Karena ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," sebenarnya adalah UTF-8 bytes, maka kita bisa juga membuatnya menggunakan data Bytes. Tipe bytes (atau kadang disebut ",(0,i.kt)("em",{parentName:"p"},"chars"),") di Rust direpresentasikan oleh tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"[u8]"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let bytes = vec![69, 108, 117, 118, 101, 105, 116, 105, 101, 32, 243, 159, 164, 152];\nlet str2 = String::from_utf8(bytes).unwrap();\nprintln!("str2: {}", str2);\n')),(0,i.kt)("p",null,"Pada contoh di atas, data bytes dipersiapkan dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),". Data tersebut kemudian digunakan untuk membuat string menggunakan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"String::from_utf8()"),". Nilai balik fungsi tersebut adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Pemanggilan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," di situ agar data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"-nya di-return."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"String slcie vs string literal",src:t(108).Z,width:"458",height:"108"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Kita akan bahas tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h2",{id:"a442-string-literal-str"},"A.44.2. String literal (",(0,i.kt)("inlineCode",{parentName:"h2"},"&str"),")"),(0,i.kt)("p",null,"Tipe data string literal atau ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah tipe yang menampung data kolektif UTF-8 bytes (seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),") tetapi ",(0,i.kt)("strong",{parentName:"p"},"immutable")," dan disimpannya tidak di heap dan tidak juga di stack, melainkan di static storage."),(0,i.kt)("p",null,"String literal hanya bisa direpresentasikan dalam bentuk reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," (pointer yang mengarah ke suatu bytes)."),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," termasuk kategori tipe data yang ",(0,i.kt)("strong",{parentName:"p"},"unowned")," atau reference tanpa owner (atau boleh juga diartikan sebagai tipe data yang owner-nya adalah program)."),(0,i.kt)("p",null,"Rust menjamin data string literal selalu valid. Kita juga bisa menentukan lifetime-nya secara eksplist jike diperlukan, contohnya pada tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&'static str"),"."),(0,i.kt)("p",null,"Cara termudah membuat ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah menggunakan string literal."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str3 = "Helena Iren Michaelsen Epica";\nprintln!("str3: {str3}");\n')),(0,i.kt)("h2",{id:"a443-konversi-data-string"},"A.44.3. Konversi data string"),(0,i.kt)("h3",{id:"-konversi-string-ke-str"},"\u25c9 Konversi ",(0,i.kt)("inlineCode",{parentName:"h3"},"String")," ke ",(0,i.kt)("inlineCode",{parentName:"h3"},"&str")),(0,i.kt)("p",null,"Data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," juga didapat melalui operasi borrow dari data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", caranya dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str4: String = String::from("Hiroyuki Sawano");\nlet str4_slice1: &str = str4.as_str();\nprintln!("str4: {str4}"); // str4: Hiroyuki Sawano\nprintln!("str4_slice1: {str4_slice1}"); // str4_slice1: Hiroyuki Sawano\n')),(0,i.kt)("p",null,"Bisa juga menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_mut_str")," untuk mutable borrow. Namun dalam penggunaannya, owner data diwajibkan mutable. Contohnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str5: String = String::from("Hans Zimmer");\nlet str5_slice1: &mut str = str5.as_mut_str();\nprintln!("str5: {str5}");\nprintln!("str5_slice1: {str5_slice1}");\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"String slcie vs string literal",src:t(6484).Z,width:"650",height:"237"})),(0,i.kt)("p",null,"Hmm, error. Perlu diingat kembali aturan ",(0,i.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing")," bahwa tidak boleh ada operasi borrow dan juga mutable borrow dalam satu waktu. Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," dipinjam oleh ",(0,i.kt)("inlineCode",{parentName:"p"},"str5_slice1")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_mut_str")," (yang di dalamnya menjalankan operasi mutable borrow). Selain itu, operasi mutable borrow maksimal hanya boleh dilakukan 1x dalam satu waktu, inilah kenapa ketika kita berusaha menampilkan data ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," hasilnya error, karena statement print data ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," adalah operasi borrow."),(0,i.kt)("p",null,"Solusinya masalah di atas bisa menggunakan block expression:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str5: String = String::from("Hans Zimmer");\n{\n let str5_slice1: &mut str = str5.as_mut_str();\n println!("str5_slice1: {str5_slice1}"); // str5_slice1: Hans Zimmer\n}\nprintln!("str5: {}", str5); // str5_slice1: Hans Zimmer\n')),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," bisa diakses mutable reference-nya karena memang tipe tersebut size-nya adalah dinamis."),(0,i.kt)("h3",{id:"-konversi-str-ke-string"},"\u25c9 Konversi ",(0,i.kt)("inlineCode",{parentName:"h3"},"&str")," ke ",(0,i.kt)("inlineCode",{parentName:"h3"},"String")),(0,i.kt)("p",null,"Masih dalam topik konversi tipe data string. Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," memiliki method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"to_string")," yang gunanya adalah untuk konversi data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str6: &str = "John Towner Williams";\nlet str6_slice1: String = str6.to_string();\nprintln!("str6: {str6}"); // str6: John Towner Williams\nprintln!("str6_slice1: {str6_slice1}"); // str6_slice1: John Towner Williams\n')),(0,i.kt)("p",null,"Konversi pada tipe data ini sedikit berbeda dibandingkan konversi ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),". Pada contoh di atas, yang terjadi adalah data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," di-copy sebagai data baru bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," yang kemudian ditampung variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"str6_slice1")," (yang juga berperan sebagai owner untuk data baru tersebut)."),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"to_string")," melakukan operasi copy, bukan borrow. Artinya setelah dipanggil akan ada 2 data yang reference-nya sudah berbeda."),(0,i.kt)("h2",{id:"a444-string-literal--string-slice"},"A.44.4. String literal & string slice"),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," memiliki hubungan dekat dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),". Data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," reference-nya bisa diakses dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"&String"),", maupun dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," (menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"as_mut_str"),"). Data text pada string tersebut bisa dimodifikasi, ditambahi, dan juga dikurangi."),(0,i.kt)("p",null,"Berbeda dengan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ",(0,i.kt)("strong",{parentName:"p"},"(di paragraph ini dan setelahnya yang kita bahas adalah data yang dari awal tipe-nya sudah ",(0,i.kt)("inlineCode",{parentName:"strong"},"&str"),", bukan data hasil operasi pinjam dari ",(0,i.kt)("inlineCode",{parentName:"strong"},"String"),")"),", data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah fixed dan immutable. Konversi data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," menghasilkan data baru dengan owner baru. Bisa dibilang sangat terbatas apa yang bisa kita lakukan pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Meski demikian, tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," lebih cepat performa-nya dibanding ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," karena disimpan di static storage. Selain itu dijamin valid oleh Rust. Kekurangannya hanya pada ownership-nya. Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah ",(0,i.kt)("strong",{parentName:"p"},"unowned"),", operasi mutability tidak bisa dilakukan pada tipe ini."),(0,i.kt)("p",null,"Dalam case normal, sangat dianjurkan untuk menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", kecuali memang yang dibutuhkan adalah ",(0,i.kt)("strong",{parentName:"p"},"owned")," string."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/string_slice_vs_string_literal"},"github.com/novalagung/dasarpemrogramanrust-example/../string_slice_vs_string_literal")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-string-literal"},"Tipe Data \u279c String Literal (&str)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch08-02-strings.html"},"https://doc.rust-lang.org/book/ch08-02-strings.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://users.rust-lang.org/t/str-string-literals/29635"},"https://users.rust-lang.org/t/str-string-literals/29635")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.quora.com/Why-does-Rust-have-two-different-string-types-static-str-and-String"},"https://www.quora.com/Why-does-Rust-have-two-different-string-types-static-str-and-String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/24158114/what-are-the-differences-between-rusts-string-and-str"},"https://stackoverflow.com/questions/24158114/what-are-the-differences-between-rusts-string-and-str")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/30154541/how-do-i-concatenate-strings"},"https://stackoverflow.com/questions/30154541/how-do-i-concatenate-strings"))))}m.isMDXComponent=!0},108:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcoAAABsCAIAAABlzGXMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTRUMTY6NDg6MTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjQ3OjQ1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjQ3OjQ1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZmMDQyOGQzLTFiOTYt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"},6484:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/string-slice-vs-string-literal-2-1b0caccba69a37db29f101f921a76df1.png"}}]); \ No newline at end of file diff --git a/assets/js/a2bea3ed.c14ec614.js b/assets/js/a2bea3ed.c14ec614.js deleted file mode 100644 index 2c91d368..00000000 --- a/assets/js/a2bea3ed.c14ec614.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6345],{3905:(a,e,t)=>{t.d(e,{Zo:()=>o,kt:()=>u});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var p=n.createContext({}),d=function(a){var e=n.useContext(p),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},o=function(a){var e=d(a.components);return n.createElement(p.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,o=s(a,["components","mdxType","originalType","parentName"]),k=d(t),u=i,g=k["".concat(p,".").concat(u)]||k[u]||m[u]||r;return t?n.createElement(g,l(l({ref:e},o),{},{components:t})):n.createElement(g,l({ref:e},o))}));function u(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=k;var s={};for(var p in e)hasOwnProperty.call(e,p)&&(s[p]=e[p]);s.originalType=a,s.mdxType="string"==typeof a?a:i,l[1]=s;for(var d=2;d{t.r(e),t.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>s,toc:()=>d});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:44,title:"A.44. String Literal (&str) vs. String Custom Type",sidebar_label:"A.44. String Literal (&str) vs. String Custom Type"},l=void 0,s={unversionedId:"basic/string-slice-vs-string-literal",id:"basic/string-slice-vs-string-literal",title:"A.44. String Literal (&str) vs. String Custom Type",description:"Pada chapter sebelumnya kita telah membahas tentang bagaimana data slice di-manage di memory. Ada beberapa tipe data yang masuk dalam kategori slice, yang salah satunya adalah string slice atau String.",source:"@site/docs/basic/string-slice-vs-string-literal.md",sourceDirName:"basic",slug:"/basic/string-slice-vs-string-literal",permalink:"/basic/string-slice-vs-string-literal",draft:!1,tags:[],version:"current",sidebarPosition:44,frontMatter:{sidebar_position:44,title:"A.44. String Literal (&str) vs. String Custom Type",sidebar_label:"A.44. String Literal (&str) vs. String Custom Type"},sidebar:"tutorialSidebar",previous:{title:"A.43. Slice Memory Management",permalink:"/basic/slice-memory-management"},next:{title:"A.45. Tipe Data \u279c String Custom Type",permalink:"/basic/tipe-data-custom-type-string-slice"}},p={},d=[{value:"A.44.1. String slice (String)",id:"a441-string-slice-string",level:2},{value:"A.44.2. String literal (&str)",id:"a442-string-literal-str",level:2},{value:"A.44.3. Konversi data string",id:"a443-konversi-data-string",level:2},{value:"\u25c9 Konversi String ke &str",id:"-konversi-string-ke-str",level:3},{value:"\u25c9 Konversi &str ke String",id:"-konversi-str-ke-string",level:3},{value:"A.44.4. String literal & string slice",id:"a444-string-literal--string-slice",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:d};function m(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},o,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter sebelumnya kita telah membahas tentang bagaimana data slice di-manage di memory. Ada beberapa tipe data yang masuk dalam kategori slice, yang salah satunya adalah string slice atau ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("p",null,"Di chapter ini kita akan bahas apa perbedaan antara tipe data string slice (",(0,i.kt)("inlineCode",{parentName:"p"},"String"),") dan string literal ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Pembahasan mengenai topik ini sengaja dilakukan tidak di awal-awal ebook, karena ada banyak hal yang perlu dipahami sebelum mempelajarinya, contohnya seperti aspek management memory dan ownership. Dan karena topik tersebut sudah selesai dibahas, berarti ini adalah waktu yang tepat untuk membahas string slice."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Silakan pelajari kembali pembahasan detail tentang tipe slice pada chapter sebelumnya jika diperlukan. Chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/slice-memory-management"},"Slice Memory Management"))),(0,i.kt)("h2",{id:"a441-string-slice-string"},"A.44.1. String slice (",(0,i.kt)("inlineCode",{parentName:"h2"},"String"),")"),(0,i.kt)("p",null,"String slice atau custom type ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," merupakan tipe data bawaan Rust, dibuat via ",(0,i.kt)("inlineCode",{parentName:"p"},"struct"),", kegunaannya untuk menampung data UTF-8 bytes yang dinamis (bisa berkembang isinya)."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"String")," masuk dalam kategori tipe data slice, isinya adalah data kolektif bertipe bytes, datanya disimpan di heap memory, dan metadata-nya di stack memory. Tipe data ini dikategorikan sebagai tipe data ",(0,i.kt)("strong",{parentName:"p"},"owned"),", yang artinya owner data bisa direpresentasikan oleh variabel. Sebagai contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("Lisa Blackpink");\nprintln!("str1: {str1}");\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"str1")," di atas merupakan owner dari string ",(0,i.kt)("inlineCode",{parentName:"p"},"Lisa Blackpink"),". Dari string tersebut operasi borrow bisa dilakukan. Contohnya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("Lisa Blackpink");\nlet slice1 = &str1[..]; // "Lisa Blackpink"\nlet slice2 = &str1[4..7]; // " Bl"\n')),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"slice1")," adalah variabel baru yang datanya didapat dari borrowing seluruh elemen string milik ",(0,i.kt)("inlineCode",{parentName:"p"},"str1"),". Sedangkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"slice2")," hanya meminjam elemen indeks ke-4 hingga elemen sebelum 7 (yaitu 6)."),(0,i.kt)("p",null,"Karena ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," sebenarnya adalah UTF-8 bytes, maka kita bisa juga membuatnya menggunakan data Bytes. Tipe bytes (atau kadang disebut ",(0,i.kt)("em",{parentName:"p"},"chars"),") di Rust direpresentasikan oleh tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"[u8]"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let bytes = vec![69, 108, 117, 118, 101, 105, 116, 105, 101, 32, 243, 159, 164, 152];\nlet str2 = String::from_utf8(bytes).unwrap();\nprintln!("str2: {}", str2);\n')),(0,i.kt)("p",null,"Pada contoh di atas, data bytes dipersiapkan dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),". Data tersebut kemudian digunakan untuk membuat string menggunakan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"String::from_utf8()"),". Nilai balik fungsi tersebut adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Pemanggilan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," disitu agar data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"-nya di-return."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"String slcie vs string literal",src:t(108).Z,width:"458",height:"108"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Kita akan bahas tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h2",{id:"a442-string-literal-str"},"A.44.2. String literal (",(0,i.kt)("inlineCode",{parentName:"h2"},"&str"),")"),(0,i.kt)("p",null,"Tipe data string literal atau ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah tipe yang menampung data kolektif UTF-8 bytes (seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),") tetapi ",(0,i.kt)("strong",{parentName:"p"},"immutable")," dan disimpannya tidak di heap dan tidak juga di stack, melainkan di static storage."),(0,i.kt)("p",null,"String literal hanya bisa direpresentasikan dalam bentuk reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," (pointer yang mengarah ke suatu bytes)."),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," termasuk kategori tipe data yang ",(0,i.kt)("strong",{parentName:"p"},"unowned")," atau reference tanpa owner (atau boleh juga diartikan sebagai tipe data yang owner-nya adalah program)."),(0,i.kt)("p",null,"Rust menjamin data string literal selalu valid. Kita juga bisa menentukan lifetime-nya secara eksplist jike diperlukan, contohnya pada tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&'static str"),"."),(0,i.kt)("p",null,"Cara termudah membuat ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah menggunakan string literal."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str3 = "Helena Iren Michaelsen Epica";\nprintln!("str3: {str3}");\n')),(0,i.kt)("h2",{id:"a443-konversi-data-string"},"A.44.3. Konversi data string"),(0,i.kt)("h3",{id:"-konversi-string-ke-str"},"\u25c9 Konversi ",(0,i.kt)("inlineCode",{parentName:"h3"},"String")," ke ",(0,i.kt)("inlineCode",{parentName:"h3"},"&str")),(0,i.kt)("p",null,"Data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," juga didapat melalui operasi borrow dari data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", caranya dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str4: String = String::from("Hiroyuki Sawano");\nlet str4_slice1: &str = str4.as_str();\nprintln!("str4: {str4}"); // str4: Hiroyuki Sawano\nprintln!("str4_slice1: {str4_slice1}"); // str4_slice1: Hiroyuki Sawano\n')),(0,i.kt)("p",null,"Bisa juga menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_mut_str")," untuk mutable borrow. Namun dalam penggunaannya, owner data diwajibkan mutable. Contohnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str5: String = String::from("Hans Zimmer");\nlet str5_slice1: &mut str = str5.as_mut_str();\nprintln!("str5: {str5}");\nprintln!("str5_slice1: {str5_slice1}");\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"String slcie vs string literal",src:t(6484).Z,width:"650",height:"237"})),(0,i.kt)("p",null,"Hmm, error. Perlu diingat kembali aturan ",(0,i.kt)("a",{parentName:"p",href:"/basic/borrowing"},"Borrowing")," bahwa tidak boleh ada operasi borrow dan juga mutable borrow dalam satu waktu. Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," dipinjam oleh ",(0,i.kt)("inlineCode",{parentName:"p"},"str5_slice1")," menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_mut_str")," (yang di dalamnya menjalankan operasi mutable borrow). Selain itu, operasi mutable borrow maksimal hanya boleh dilakukan 1x dalam satu waktu, inilah kenapa ketika kita berusaha menampilkan data ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," hasilnya error, karena statement print data ",(0,i.kt)("inlineCode",{parentName:"p"},"str5")," adalah operasi borrow."),(0,i.kt)("p",null,"Solusinya masalah di atas bisa menggunakan block expression:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut str5: String = String::from("Hans Zimmer");\n{\n let str5_slice1: &mut str = str5.as_mut_str();\n println!("str5_slice1: {str5_slice1}"); // str5_slice1: Hans Zimmer\n}\nprintln!("str5: {}", str5); // str5_slice1: Hans Zimmer\n')),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," bisa diakses mutable reference-nya karena memang tipe tersebut size-nya adalah dinamis."),(0,i.kt)("h3",{id:"-konversi-str-ke-string"},"\u25c9 Konversi ",(0,i.kt)("inlineCode",{parentName:"h3"},"&str")," ke ",(0,i.kt)("inlineCode",{parentName:"h3"},"String")),(0,i.kt)("p",null,"Masih dalam topik konversi tipe data string. Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," memiliki method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"to_string")," yang gunanya adalah untuk konversi data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str6: &str = "John Towner Williams";\nlet str6_slice1: String = str6.to_string();\nprintln!("str6: {str6}"); // str6: John Towner Williams\nprintln!("str6_slice1: {str6_slice1}"); // str6_slice1: John Towner Williams\n')),(0,i.kt)("p",null,"Konversi pada tipe data ini sedikit berbeda dibandingkan konversi ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),". Pada contoh di atas, yang terjadi adalah data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," di-copy sebagai data baru bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," yang kemudian ditampung variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"str6_slice1")," (yang juga berperan sebagai owner untuk data baru tersebut)."),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"to_string")," melakukan operasi copy, bukan borrow. Artinya setelah dipanggil akan ada 2 data yang reference-nya sudah berbeda."),(0,i.kt)("h2",{id:"a444-string-literal--string-slice"},"A.44.4. String literal & string slice"),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," memiliki hubungan dekat dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),". Data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," reference-nya bisa diakses dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"&String"),", maupun dalam bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," (menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"as_mut_str"),"). Data text pada string tersebut bisa dimodifikasi, ditambahi, dan juga dikurangi."),(0,i.kt)("p",null,"Berbeda dengan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ",(0,i.kt)("strong",{parentName:"p"},"(di paragraph ini dan setelahnya yang kita bahas adalah data yang dari awal tipe-nya sudah ",(0,i.kt)("inlineCode",{parentName:"strong"},"&str"),", bukan data hasil operasi pinjam dari ",(0,i.kt)("inlineCode",{parentName:"strong"},"String"),")"),", data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah fixed dan immutable. Konversi data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," menghasilkan data baru dengan owner baru. Bisa dibilang sangat terbatas apa yang bisa kita lakukan pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Meski demikian, tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," lebih cepat performa-nya dibanding ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," karena disimpan di static storage. Selain itu dijamin valid oleh Rust. Kekurangannya hanya pada ownership-nya. Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," adalah ",(0,i.kt)("strong",{parentName:"p"},"unowned"),", operasi mutability tidak bisa dilakukan pada tipe ini."),(0,i.kt)("p",null,"Dalam case normal, sangat dianjurkan untuk menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", kecuali memang yang dibutuhkan adalah ",(0,i.kt)("strong",{parentName:"p"},"owned")," string."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/string_slice_vs_string_literal"},"github.com/novalagung/dasarpemrogramanrust-example/../string_slice_vs_string_literal")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-string-literal"},"Tipe Data \u279c String Literal (&str)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch08-02-strings.html"},"https://doc.rust-lang.org/book/ch08-02-strings.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://users.rust-lang.org/t/str-string-literals/29635"},"https://users.rust-lang.org/t/str-string-literals/29635")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.quora.com/Why-does-Rust-have-two-different-string-types-static-str-and-String"},"https://www.quora.com/Why-does-Rust-have-two-different-string-types-static-str-and-String")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/24158114/what-are-the-differences-between-rusts-string-and-str"},"https://stackoverflow.com/questions/24158114/what-are-the-differences-between-rusts-string-and-str")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/30154541/how-do-i-concatenate-strings"},"https://stackoverflow.com/questions/30154541/how-do-i-concatenate-strings"))))}m.isMDXComponent=!0},108:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcoAAABsCAIAAABlzGXMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTRUMTY6NDg6MTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE0OjQ3OjQ1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE0OjQ3OjQ1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZmMDQyOGQzLTFiOTYt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"},6484:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/string-slice-vs-string-literal-2-1b0caccba69a37db29f101f921a76df1.png"}}]); \ No newline at end of file diff --git a/assets/js/af6aab29.62e5b74a.js b/assets/js/af6aab29.62e5b74a.js new file mode 100644 index 00000000..e3d71402 --- /dev/null +++ b/assets/js/af6aab29.62e5b74a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8794],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>c});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var d=n.createContext({}),p=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},o=function(e){var t=p(e.components);return n.createElement(d.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,d=e.parentName,o=m(e,["components","mdxType","originalType","parentName"]),s=p(a),c=i,u=s["".concat(d,".").concat(c)]||s[c]||k[c]||r;return a?n.createElement(u,l(l({ref:t},o),{},{components:a})):n.createElement(u,l({ref:t},o))}));function c(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,l=new Array(r);l[0]=s;var m={};for(var d in t)hasOwnProperty.call(t,d)&&(m[d]=t[d]);m.originalType=e,m.mdxType="string"==typeof e?e:i,l[1]=m;for(var p=2;p{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>m,toc:()=>p});var n=a(7462),i=(a(7294),a(3905));const r={sidebar_position:50,title:"A.50. Date Time",sidebar_label:"A.50. Date Time"},l=void 0,m={unversionedId:"basic/datetime",id:"basic/datetime",title:"A.50. Date Time",description:"Pada chapter ini kita akan mempelajari tentang tipe data datetime yang ada di Rust programming.",source:"@site/docs/basic/datetime.md",sourceDirName:"basic",slug:"/basic/datetime",permalink:"/basic/datetime",draft:!1,tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_position:50,title:"A.50. Date Time",sidebar_label:"A.50. Date Time"},sidebar:"tutorialSidebar",previous:{title:"A.49. Attributes",permalink:"/basic/attributes"},next:{title:"A.51. File, Path, Directory",permalink:"/basic/file-path-directory"}},d={},p=[{value:"A.50.1. Persiapan",id:"a501-persiapan",level:2},{value:"A.50.2. Tipe data DateTime",id:"a502-tipe-data-datetime",level:2},{value:"\u25c9 Tipe DateTime<Utc>",id:"-tipe-datetimeutc",level:3},{value:"\u25c9 Tipe DateTime<Local>",id:"-tipe-datetimelocal",level:3},{value:"\u25c9 Tipe NaiveDateTime",id:"-tipe-naivedatetime",level:3},{value:"A.50.3. Pembuatan objek DateTime",id:"a503-pembuatan-objek-datetime",level:2},{value:"\u25c9 Via Utc::now()",id:"-via-utcnow",level:3},{value:"\u25c9 Via Utc.with_ymd_and_hms()",id:"-via-utcwith_ymd_and_hms",level:3},{value:"\u25c9 Via DateTime::<Utc>::from()",id:"-via-datetimeutcfrom",level:3},{value:"\u25c9 Via String method parse()",id:"-via-string-method-parse",level:3},{value:"\u25c9 Cara lainnya",id:"-cara-lainnya",level:3},{value:"A.50.4. Utc vs Local",id:"a504-utc-vs-local",level:2},{value:"A.50.5. Tipe NaiveDateTime",id:"a505-tipe-naivedatetime",level:2},{value:"A.50.6. Konversi datetime UTC ke local timezone, dan sebaliknya",id:"a506-konversi-datetime-utc-ke-local-timezone-dan-sebaliknya",level:2},{value:"A.50.7. UNIX time",id:"a507-unix-time",level:2},{value:"A.50.8. Date formatting & parsing",id:"a508-date-formatting--parsing",level:2},{value:"A.50.9. DateTime formatting syntax",id:"a509-datetime-formatting-syntax",level:2},{value:"\u25c9 Date specifiers",id:"-date-specifiers",level:3},{value:"\u25c9 Time specifiers",id:"-time-specifiers",level:3},{value:"\u25c9 Timezone specifiers",id:"-timezone-specifiers",level:3},{value:"\u25c9 Date & time specifiers",id:"-date--time-specifiers",level:3},{value:"\u25c9 Special specifiers",id:"-special-specifiers",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:p};function k(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},o,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan mempelajari tentang tipe data datetime yang ada di Rust programming."),(0,i.kt)("p",null,"Rust menyediakan cukup banyak API untuk keperluan pengolahan datetime, tersedia dalam Standard Library crate. Namun pada chapter ini kita tidak akan menggunakannya, karena yang akan dipakai adalah ",(0,i.kt)("a",{parentName:"p",href:"https://crates.io/crates/chrono"},(0,i.kt)("inlineCode",{parentName:"a"},"chrono")," crate")," (dianjurkan untuk menggunakan crate ini karena fiturnya lebih banyak)."),(0,i.kt)("h2",{id:"a501-persiapan"},"A.50.1. Persiapan"),(0,i.kt)("p",null,"Sebelum memulai pembelajaran, siapkan satu project baru, kemudian tambahkan care ",(0,i.kt)("inlineCode",{parentName:"p"},"crono")," dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = "time_chrono"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nchrono = "0.4.23"\n')),(0,i.kt)("h2",{id:"a502-tipe-data-datetime"},"A.50.2. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"DateTime")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"crono")," menyediakan cukup banyak tipe data untuk merepresentasikan informasi tanggal dan waktu, tetapi yang paling penting untuk diketahui dan dipahami ada dua, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"DateTime")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"DateTime")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"NaiveDateTime"))),(0,i.kt)("h3",{id:"-tipe-datetimeutc"},"\u25c9 Tipe ",(0,i.kt)("inlineCode",{parentName:"h3"},"DateTime")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," (gabungan dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::datetime::DateTime")," dan generic ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::offset::utc::Utc"),") adalah representasi untuk tipe data datetime dengan timezone offset ",(0,i.kt)("strong",{parentName:"p"},"UTC")," (atau ",(0,i.kt)("strong",{parentName:"p"},"GMT+0"),")."),(0,i.kt)("h3",{id:"-tipe-datetimelocal"},"\u25c9 Tipe ",(0,i.kt)("inlineCode",{parentName:"h3"},"DateTime")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," (gabungan dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::datetime::DateTime")," dan generic ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::offset::local::Local"),") adalah representasi untuk tipe data datetime dengan ",(0,i.kt)("strong",{parentName:"p"},"timezone offset sesuai dengan di mana program dijalankan"),"."),(0,i.kt)("p",null,"Sebagai contoh, penulis berlokasi di Jawa Timur, maka ketika ada suatu data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," artinya timezone offset-nya adalah WIB (atau GMT+7)."),(0,i.kt)("h3",{id:"-tipe-naivedatetime"},"\u25c9 Tipe ",(0,i.kt)("inlineCode",{parentName:"h3"},"NaiveDateTime")),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::naive::datetime::NaiveDateTime")," merupakan tipe data datetime yang tidak menyimpan informasi timezone. Nanti akan kita bahas apa kegunaan dari tipe ini."),(0,i.kt)("h2",{id:"a503-pembuatan-objek-datetime"},"A.50.3. Pembuatan objek ",(0,i.kt)("inlineCode",{parentName:"h2"},"DateTime")),(0,i.kt)("h3",{id:"-via-utcnow"},"\u25c9 Via ",(0,i.kt)("inlineCode",{parentName:"h3"},"Utc::now()")),(0,i.kt)("p",null,"Ada banyak cara untuk membuat date time, dan kita akan bahas satu-per-satu."),(0,i.kt)("p",null,"Cara yang pertama, mari kita pelajari sambil praktek. Isi file program ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," dengan kode berikut, lalu jalankan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use chrono::prelude::*;\nuse std::time::{UNIX_EPOCH, Duration};\n\nfn main() {\n let sample_date1_in_utc: DateTime = Utc::now();\n println!("sample date 1 (in utc): {sample_date1_in_utc}");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(6635).Z,width:"571",height:"95"})),(0,i.kt)("p",null,"Contoh sederhana di atas adalah salah satu cara membuat object datetime dengan isi adalah informasi waktu sekarang (waktu ketika baris kode tersebut dieksekusi)."),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc::now()")," mengembalikan informasi waktu sekarang dalam timezone UTC (representasi tipe data-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),")."),(0,i.kt)("p",null,"Module item ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc")," sendiri harus diimport terlebih dahulu agar bisa digunakan. Itulah kenapa ada statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use chrono::prelude::*"),"."),(0,i.kt)("h3",{id:"-via-utcwith_ymd_and_hms"},"\u25c9 Via ",(0,i.kt)("inlineCode",{parentName:"h3"},"Utc.with_ymd_and_hms()")),(0,i.kt)("p",null,"Pembuatan object datetime dengan isi informasi waktu spesifik bisa dilakukan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc.with_ymd_and_hms()"),". Fungsi ini mewajibkan developer untuk mengisi 6 parameternya dengan segment waktu (tahun, bulan, dan lainnya)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sample_date2_in_utc = Utc.with_ymd_and_hms(2023, 3, 1, 1, 2, 3).unwrap();\nprintln!("sample date 2 (in utc): {sample_date2_in_utc}");\n// output: sample date 2 (in utc): 2023-03-01 01:02:03 UTC\n')),(0,i.kt)("p",null,"Statement di atas menghasilkan data datetime dengan isi ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-01 01:02:03 UTC"),"."),(0,i.kt)("h3",{id:"-via-datetimeutcfrom"},"\u25c9 Via ",(0,i.kt)("inlineCode",{parentName:"h3"},"DateTime::::from()")),(0,i.kt)("p",null,"Cara ini pas digunakan pada situasi di mana kita perlu membuat object datetime dari sebuah ",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Unix_time"},"UNIX timestamp"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sample_date3_in_utc = DateTime::::from(UNIX_EPOCH + Duration::from_secs(1524885322));\nprintln!("sample date 3 (in utc): {sample_date3_in_utc}");\n// output: sample date 3 (in utc): 2018-04-28 03:15:22 UTC\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime::::from()")," di atas menghasilkan data datetime ",(0,i.kt)("inlineCode",{parentName:"p"},"2018-04-28 03:15:22 UTC"),", karena nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"1524885322")," adalah representasi UNIX time untuk waktu tersebut."),(0,i.kt)("h3",{id:"-via-string-method-parse"},"\u25c9 Via String method ",(0,i.kt)("inlineCode",{parentName:"h3"},"parse()")),(0,i.kt)("p",null,"Tipe data string bisa langsung dikonversi ke bentuk datetime menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"parse()")," yang dikombinasikan dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," sebagai generic parameter."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sample_date4_in_utc = "2023-03-01 01:02:03 UTC".parse::>().unwrap();\nprintln!("sample date 4 (in utc): {sample_date4_in_utc}");\n// output: sample date 4 (in utc): 2023-03-01 01:02:03 UTC\n')),(0,i.kt)("p",null,"Statement parsing di atas menghasilkan data datetime ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-01 01:02:03 UTC"),", sesuai dengan isi data string."),(0,i.kt)("p",null,"O iya, perlu diketahui bahwa tidak semua string bisa di-parse ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),". Jika data string memiliki format yang tidak sesuai dengan aturan parsing di Rust, maka proses parsing menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"parse()")," pasti menghasilkan error."),(0,i.kt)("p",null,"Penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"parse::>()")," sebenarnya mengembalikan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result, ParseError>"),", itulah kenapa pada contoh perlu di chain lagi dengan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h3",{id:"-cara-lainnya"},"\u25c9 Cara lainnya"),(0,i.kt)("p",null,"Ada beberapa cara lain yang bisa digunakan untuk pembuatan object datetime, dan kita akan bahas juga sebentar lagi."),(0,i.kt)("h2",{id:"a504-utc-vs-local"},"A.50.4. ",(0,i.kt)("inlineCode",{parentName:"h2"},"Utc")," vs ",(0,i.kt)("inlineCode",{parentName:"h2"},"Local")),(0,i.kt)("p",null,"Kesemua cara yang sudah dipelajari di atas juga bisa diterapkan dalam pembuatan object date time dengan timezone offset ",(0,i.kt)("inlineCode",{parentName:"p"},"Local"),". Penerapannya kurang lebih sama, cukup ganti ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc")," menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"Local"),"."),(0,i.kt)("p",null,"Jika disandingkan, akan seperti ini kodenya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date1_in_utc: DateTime = Utc::now();\nlet date2_in_utc = Utc.with_ymd_and_hms(2023, 3, 1, 1, 2, 3).unwrap();\nlet date3_in_utc = DateTime::::from(UNIX_EPOCH + Duration::from_secs(1524885322));\nlet date4_in_utc = "2023-03-01 01:02:03 UTC".parse::>().unwrap();\n\nprintln!("sample date 1 (in utc): {date1_in_utc}");\nprintln!("sample date 2 (in utc): {date2_in_utc}");\nprintln!("sample date 3 (in utc): {date3_in_utc}");\nprintln!("sample date 4 (in utc): {date4_in_utc}");\n\n// vs\n\nlet date1_in_local_tz: DateTime = Local::now();\nlet date2_in_local_tz = Local.with_ymd_and_hms(2023, 3, 1, 1, 2, 3).unwrap();\nlet date3_in_local_tz = DateTime::::from(UNIX_EPOCH + Duration::from_secs(1524885322));\nlet date4_in_local_tz = "2023-03-01 01:02:03 UTC".parse::>().unwrap();\n\nprintln!("sample date 1 (in local_tz): {date1_in_local_tz}");\nprintln!("sample date 2 (in local_tz): {date2_in_local_tz}");\nprintln!("sample date 3 (in local_tz): {date3_in_local_tz}");\nprintln!("sample date 4 (in local_tz): {date4_in_local_tz}");\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(239).Z,width:"571",height:"231"})),(0,i.kt)("p",null,"Semoga cukup jelas."),(0,i.kt)("p",null,"Dari contoh di atas, sebenarnya ada 2 variabel yang menarik untuk dibahas, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"sample_date1_in_utc")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"sample_date1_in_local_tz"),". Dua variabel tersebut berisi informasi waktu sekarang, perbedaannya hanya pada timezone offset saja. Namun, meski timezone offset-nya berbeda, kedua datetime tersebut sejatinya adalah merepresentasikan waktu yang sama (ekuivalen)."),(0,i.kt)("p",null,"Agar lebih jelas, silakan perhatikan contoh berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sample date 1 (in utc): 2023-03-02 09:53:44.561519500 UTC\nsample date 1 (in local_tz): 2023-03-02 16:53:44.562389600 +07:00\n")),(0,i.kt)("p",null,"Kedua datetime tersebut terpaku ",(0,i.kt)("strong",{parentName:"p"},"7 jam")," persis. Data ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 09:53:44")," UTC (atau GMT+0), jika dikonversi ke waktu lokal penulis (WIB atau GMT+7) maka akan menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 16:53:44"),". Selisihnya sesuai dengan timezone offset, yaitu 7 jam."),(0,i.kt)("h2",{id:"a505-tipe-naivedatetime"},"A.50.5. Tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"NaiveDateTime")),(0,i.kt)("p",null,"Rust memilik caranya sendiri dalam pengelolaan data datetime (yang menurut penulis cukup unik). Ada satu tipe data bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime"),", yang kegunaannya adalah untuk menampung tipe data datetime ",(0,i.kt)("strong",{parentName:"p"},"tanpa spesifik timezone offset"),"."),(0,i.kt)("p",null,"Tipe data ini sangat berguna dibeberapa case yang kebanyakan adalah perihal konversi data ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),"."),(0,i.kt)("p",null,"Mari kita praktekan dengan contoh agar lebih jelas. Dimisalkan ada keperluan di mana data UNIX time perlu di konversi ke 2 bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),", dengan timezone offset ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Local"),". Pada kasus ini, cara ke-3 dari praktek sebelumnya bisa dilakukan untuk penyelesaian case ini."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let timestamp: u64 = 1524885322;\nlet date2_in_utc = DateTime::::from(UNIX_EPOCH + Duration::from_secs(timestamp));\nlet date2_in_local_tz = DateTime::::from(UNIX_EPOCH + Duration::from_secs(timestamp));\n")),(0,i.kt)("p",null,"Cara lain adalah dengan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime"),", yang contoh penerapannnya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let timestamp_in_ms: i64 = 1524885322000;\nlet naive_date_time: NaiveDateTime = NaiveDateTime::from_timestamp_millis(timestamp_in_ms).unwrap();\n\nlet sample_date_in_utc = Utc.from_utc_datetime(&naive_date_time);\nlet sample_date_in_local_tz = Local.from_local_datetime(&naive_date_time).unwrap();\n\nprintln!("sample date 1 (in utc): {sample_date_in_utc}");\nprintln!("sample date 2 (in local_tz): {sample_date_in_local_tz}");\n\n// output:\n// sample date 1 (in utc): 2018-04-28 03:15:22 UTC\n// sample date 2 (in local_tz): 2018-04-28 03:15:22 +07:00\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime::from_timestamp_millis")," berguna untuk mengkonversi data UNIX time (milisecond) ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime"),". Kemudian, dari data tersebut dapat kita konversi lagi ke bentuk UTC dengan mudah menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc.from_utc_datetime()")," dan local timezone menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Local.from_local_datetime()"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(2330).Z,width:"571",height:"115"})),(0,i.kt)("p",null,"Bisa dilihat pada output di atas, bahwa hasil data datetime berbeda untuk timezone UTC dan local."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Jangan sampai bingung, 2 data datetime di atas tidak sama dan tidak ekuivalen meskipun informasi jam menit detiknya sama persis. Hal ini dikarenakan timezone offset-nya berbeda.")),(0,i.kt)("h2",{id:"a506-konversi-datetime-utc-ke-local-timezone-dan-sebaliknya"},"A.50.6. Konversi datetime UTC ke local timezone, dan sebaliknya"),(0,i.kt)("p",null,"Dalam bekerja dengan tipe data datetime, selalu memperhatikan timezone adalah hal yang sangat penting. Bisa saja dua buah datetime memiliki informasi tanggal dan waktu sama persis, tapi jika timezone-nya berbeda maka keduanya adalah berbeda!"),(0,i.kt)("p",null,"Agar lebih jelas, silakan perhatikan kode berikut beserta outputnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date1_in_local_tz: DateTime = Local::now();\nprintln!("date (in local): {date1_in_local_tz}");\n\nlet date_in_utc = DateTime::::from(date1_in_local_tz);\nprintln!("date (in utc): {date_in_utc}");\n\nlet date2_in_local_tz = DateTime::::from(date_in_utc);\nprintln!("date (in local): {date2_in_local_tz}");\n\n// output:\n// date (in local): 2023-03-02 17:33:37.750279900 +07:00\n// date (in utc): 2023-03-02 10:33:37.750279900 UTC\n// date (in local): 2023-03-02 17:33:37.750279900 +07:00\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(7934).Z,width:"571",height:"129"})),(0,i.kt)("p",null,"Ketiga data datetime di atas adalah ekuivalen:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"date1_in_local_tz")," berisi informasi datetime waktu sekarang, dengan timezone GMT+7."),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"date_in_utc")," adalah datetime yang ekuivalen dengan ",(0,i.kt)("inlineCode",{parentName:"li"},"date1_in_local_tz"),", hanya saja direpresentasikan dalam timezone UTC."),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"date2_in_local_tz")," juga ekuivalen dengan ",(0,i.kt)("inlineCode",{parentName:"li"},"date_in_utc")," dan juga ",(0,i.kt)("inlineCode",{parentName:"li"},"date1_in_local_tz"),".")),(0,i.kt)("p",null,"Data ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 10 UTC")," jika ditambah 7 jam offset, maka menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 17 GMT+7"),"."),(0,i.kt)("h2",{id:"a507-unix-time"},"A.50.7. UNIX time"),(0,i.kt)("p",null,"Cara konversi data ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," ke bentuk UNIX time bisa dilakukan lewat 3 cara:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"timestamp"),", nilai baliknya dalam bentuk detik/second"),(0,i.kt)("li",{parentName:"ul"},"menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"timestamp_millis"),", nilai baliknya dalam bentuk miliseconds"),(0,i.kt)("li",{parentName:"ul"},"menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"timestamp_micros"),", nilai baliknya dalam bentuk microseconds")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date_in_local_tz: DateTime = Local::now();\nprintln!("date: {date_in_local_tz}");\nprintln!("date (in second timestamp): {}", date_in_local_tz.timestamp());\nprintln!("date (in milisecond timestamp): {}", date_in_local_tz.timestamp_millis());\nprintln!("date (in microsecond timestamp): {}", date_in_local_tz.timestamp_micros());\n')),(0,i.kt)("p",null,"Sedangkan cara untuk mengkonversi data timestamp ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," bisa dilakukan via ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime")," ataupun ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime::from"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// via NaiveDateTime\nlet naive_date_time = NaiveDateTime::from_timestamp_millis(date_in_local_tz.timestamp_millis()).unwrap();\nlet new_datetime1 = Local.from_local_datetime(&naive_date_time).unwrap();\nprintln!("date1: {new_datetime1}");\n\n// via DateTime::from\nlet new_datetime2 = DateTime::::from(UNIX_EPOCH + Duration::from_millis(date_in_local_tz.timestamp_millis().unsigned_abs()));\nprintln!("date2: {new_datetime2}");\n')),(0,i.kt)("p",null,"Output program di atas:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(6451).Z,width:"571",height:"182"})),(0,i.kt)("h2",{id:"a508-date-formatting--parsing"},"A.50.8. Date formatting & parsing"),(0,i.kt)("p",null,"Konversi datetime ke string (atau biasa disebut dengan date formatting) dilakukan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"format")," yang dalam penerapannya membutuhkan argument ",(0,i.kt)("em",{parentName:"p"},"datetime formatting syntax"),"."),(0,i.kt)("p",null,"Sedangkan konversi dari string ke datetime dilakukan via ",(0,i.kt)("inlineCode",{parentName:"p"},"Local.datetime_from_str")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc.datetime_from_str"),"."),(0,i.kt)("p",null,"Contoh pengaplikasian keduanya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date1: DateTime = Local::now();\nprintln!("date1 (in local): {}", date1);\n// date1 (in local): 2023-03-02 18:13:39.954831600 +07:00\n\nlet str_from_date1 = date1.format("%Y-%m-%d %H:%M:%S %z").to_string();\nprintln!("date1 (in string): {}", str_from_date1);\n// date1 (in string): 2023-03-02 18:13:39 +0700\n\nlet date1_from_str = Local.datetime_from_str(&str_from_date1, "%Y-%m-%d %H:%M:%S %z").unwrap();\nprintln!("date1 (in local): {}", date1_from_str);\n// date1 (in local): 2023-03-02 18:13:39 +07:00\n\nlet date2_from_str = Utc.datetime_from_str("03/01/2023 13:04 +0000", "%m/%d/%Y %H:%M %z").unwrap();\nprintln!("date2 (in utc): {}", date2_from_str);\n// date2 (in utc): 2023-03-01 13:04:00 UTC\n\nlet str_from_date2 = date2_from_str.format("%Y-%m-%d %H:%M:%S %z").to_string();\nprintln!("date2 (in string): {}", str_from_date2);\n// date2 (in string): 2023-03-01 13:04:00 +0000\n')),(0,i.kt)("h2",{id:"a509-datetime-formatting-syntax"},"A.50.9. DateTime formatting syntax"),(0,i.kt)("p",null,"Berikut adalah tabel formatting syntax untuk tipe data datetime."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Selengkapnya silakan cek ",(0,i.kt)("a",{parentName:"p",href:"https://docs.rs/chrono/latest/chrono/format/strftime/index.html"},"https://docs.rs/chrono/latest/chrono/format/strftime/index.html"))),(0,i.kt)("h3",{id:"-date-specifiers"},"\u25c9 Date specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%Y"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The full proleptic Gregorian year, zero-padded to 4 digits. chrono supports years from -262144 to 262143.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%C"),(0,i.kt)("td",{parentName:"tr",align:"center"},"20"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The proleptic Gregorian year divided by 100, zero-padded to 2 digits. 1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%y"),(0,i.kt)("td",{parentName:"tr",align:"center"},"01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The proleptic Gregorian year modulo 100, zero-padded to 2 digits. 1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%m"),(0,i.kt)("td",{parentName:"tr",align:"center"},"07"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Month number (01\u201312), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%b"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Jul"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Abbreviated month name. Always 3 letters.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%B"),(0,i.kt)("td",{parentName:"tr",align:"center"},"July"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Full month name. Also accepts corresponding abbreviation in parsing.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%h"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Jul"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %b.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%d"),(0,i.kt)("td",{parentName:"tr",align:"center"},"08"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Day number (01\u201331), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%e"),(0,i.kt)("td",{parentName:"tr",align:"center"},"8"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %d but space-padded. Same as %_d.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%a"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Sun"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Abbreviated weekday name. Always 3 letters.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%A"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Sunday"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Full weekday name. Also accepts corresponding abbreviation in parsing.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%w"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Sunday = 0, Monday = 1, \u2026, Saturday = 6.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%u"),(0,i.kt)("td",{parentName:"tr",align:"center"},"7"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Monday = 1, Tuesday = 2, \u2026, Sunday = 7. (ISO 8601)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%U"),(0,i.kt)("td",{parentName:"tr",align:"center"},"28"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Week number starting with Sunday (00\u201353), zero-padded to 2 digits. 2")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%W"),(0,i.kt)("td",{parentName:"tr",align:"center"},"27"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %U, but week 1 starts with the first Monday in that year instead.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%G"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %Y but uses the year number in ISO 8601 week date. 3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%g"),(0,i.kt)("td",{parentName:"tr",align:"center"},"01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %y but uses the year number in ISO 8601 week date. 3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%V"),(0,i.kt)("td",{parentName:"tr",align:"center"},"27"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %U but uses the week number in ISO 8601 week date (01\u201353). 3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%j"),(0,i.kt)("td",{parentName:"tr",align:"center"},"189"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Day of the year (001\u2013366), zero-padded to 3 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%D"),(0,i.kt)("td",{parentName:"tr",align:"center"},"07/08/01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Month-day-year format. Same as %m/%d/%y.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%x"),(0,i.kt)("td",{parentName:"tr",align:"center"},"07/08/01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Locale\u2019s date representation (e.g., 12/31/99).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%F"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001-07-08"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Year-month-day format (ISO 8601). Same as %Y-%m-%d.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%v"),(0,i.kt)("td",{parentName:"tr",align:"center"},"8-Jul-2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Day-month-year format. Same as %e-%b-%Y.")))),(0,i.kt)("h3",{id:"-time-specifiers"},"\u25c9 Time specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%H"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour number (00\u201323), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%k"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %H but space-padded. Same as %_H.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%I"),(0,i.kt)("td",{parentName:"tr",align:"center"},"12"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour number in 12-hour clocks (01\u201312), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%l"),(0,i.kt)("td",{parentName:"tr",align:"center"},"12"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %I but space-padded. Same as %_I.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%P"),(0,i.kt)("td",{parentName:"tr",align:"center"},"am"),(0,i.kt)("td",{parentName:"tr",align:"left"},"am or pm in 12-hour clocks.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%p"),(0,i.kt)("td",{parentName:"tr",align:"center"},"AM"),(0,i.kt)("td",{parentName:"tr",align:"left"},"AM or PM in 12-hour clocks.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%M"),(0,i.kt)("td",{parentName:"tr",align:"center"},"34"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Minute number (00\u201359), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%S"),(0,i.kt)("td",{parentName:"tr",align:"center"},"60"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Second number (00\u201360), zero-padded to 2 digits. 4")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026490000"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The fractional seconds (in nanoseconds) since last whole second. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026490"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned. These all consume the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.3f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned but fixed to a length of 3. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.6f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026490"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned but fixed to a length of 6. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.9f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026490000"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned but fixed to a length of 9. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%3f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to %.3f but without the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%6f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026490"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to %.6f but without the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%9f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026490000"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to %.9f but without the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%R"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00:34"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour-minute format. Same as %H:%M.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%T"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00:34:60"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour-minute-second format. Same as %H:%M:%S.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%X"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00:34:60"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Locale\u2019s time representation (e.g., 23:13:48).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%r"),(0,i.kt)("td",{parentName:"tr",align:"center"},"12:34:60 AM"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour-minute-second format in 12-hour clocks. Same as %I:%M:%S %p.")))),(0,i.kt)("h3",{id:"-timezone-specifiers"},"\u25c9 Timezone specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%Z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"ACST"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Local time zone name. Skips all non-whitespace characters during parsing. 6")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+0930"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Offset from the local time to UTC (with UTC being +0000).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%:z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09:30"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %z but with a colon.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%::z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09:30:00"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Offset from the local time to UTC with seconds.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%:::z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Offset from the local time to UTC without minutes.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%#z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Parsing only: Same as %z but allows minutes to be missing or present.")))),(0,i.kt)("h3",{id:"-date--time-specifiers"},"\u25c9 Date & time specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%c"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Sun Jul 8 00:34:60 2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Locale\u2019s date and time (e.g., Thu Mar 3 23:05:25 2005).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%+"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001-07-08T00:34:60.026490+09:30"),(0,i.kt)("td",{parentName:"tr",align:"left"},"ISO 8601 / RFC 3339 date & time format. 7")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%s"),(0,i.kt)("td",{parentName:"tr",align:"center"},"994518299"),(0,i.kt)("td",{parentName:"tr",align:"left"},"UNIX timestamp, the number of seconds since 1970-01-01 00:00 UTC. 8")))),(0,i.kt)("h3",{id:"-special-specifiers"},"\u25c9 Special specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%t"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Literal tab (\\t).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%n"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Literal newline (\\n).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%%"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Literal percent sign.")))),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/datetime"},"github.com/novalagung/dasarpemrogramanrust-example/../datetime")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generic"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/time/index.html"},"https://doc.rust-lang.org/std/time/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.rs/time/latest/time/"},"https://docs.rs/time/latest/time/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/rust-lang/rust-wiki-backup/blob/master/Lib-datetime.md"},"https://github.com/rust-lang/rust-wiki-backup/blob/master/Lib-datetime.md")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.rs/chrono/latest/chrono/"},"https://docs.rs/chrono/latest/chrono/"))))}k.isMDXComponent=!0},6635:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-1-c0119211ce2f1f5f14eaf24316a52b54.png"},239:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-2-998514b9bc7ad92870392305578f2a14.png"},2330:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-3-52a5ccd1fb458c09958eafdba3f6c0d4.png"},7934:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-4-62b94d0c3e24bea70a3355c814ed8d79.png"},6451:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-5-eb678ecf97453409d153b4f9727e6347.png"}}]); \ No newline at end of file diff --git a/assets/js/af6aab29.fff2a138.js b/assets/js/af6aab29.fff2a138.js deleted file mode 100644 index 2aa4ed4d..00000000 --- a/assets/js/af6aab29.fff2a138.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8794],{3905:(e,t,a)=>{a.d(t,{Zo:()=>o,kt:()=>c});var n=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function r(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var d=n.createContext({}),p=function(e){var t=n.useContext(d),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},o=function(e){var t=p(e.components);return n.createElement(d.Provider,{value:t},e.children)},k={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},s=n.forwardRef((function(e,t){var a=e.components,i=e.mdxType,r=e.originalType,d=e.parentName,o=m(e,["components","mdxType","originalType","parentName"]),s=p(a),c=i,u=s["".concat(d,".").concat(c)]||s[c]||k[c]||r;return a?n.createElement(u,l(l({ref:t},o),{},{components:a})):n.createElement(u,l({ref:t},o))}));function c(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var r=a.length,l=new Array(r);l[0]=s;var m={};for(var d in t)hasOwnProperty.call(t,d)&&(m[d]=t[d]);m.originalType=e,m.mdxType="string"==typeof e?e:i,l[1]=m;for(var p=2;p{a.r(t),a.d(t,{assets:()=>d,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>m,toc:()=>p});var n=a(7462),i=(a(7294),a(3905));const r={sidebar_position:50,title:"A.50. Date Time",sidebar_label:"A.50. Date Time"},l=void 0,m={unversionedId:"basic/datetime",id:"basic/datetime",title:"A.50. Date Time",description:"Pada chapter ini kita akan mempelajari tentang tipe data datetime yang ada di Rust programming.",source:"@site/docs/basic/datetime.md",sourceDirName:"basic",slug:"/basic/datetime",permalink:"/basic/datetime",draft:!1,tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_position:50,title:"A.50. Date Time",sidebar_label:"A.50. Date Time"},sidebar:"tutorialSidebar",previous:{title:"A.49. Attributes",permalink:"/basic/attributes"},next:{title:"A.51. File, Path, Directory",permalink:"/basic/file-path-directory"}},d={},p=[{value:"A.50.1. Persiapan",id:"a501-persiapan",level:2},{value:"A.50.2. Tipe data DateTime",id:"a502-tipe-data-datetime",level:2},{value:"\u25c9 Tipe DateTime<Utc>",id:"-tipe-datetimeutc",level:3},{value:"\u25c9 Tipe DateTime<Local>",id:"-tipe-datetimelocal",level:3},{value:"\u25c9 Tipe NaiveDateTime",id:"-tipe-naivedatetime",level:3},{value:"A.50.3. Pembuatan objek DateTime",id:"a503-pembuatan-objek-datetime",level:2},{value:"\u25c9 Via Utc::now()",id:"-via-utcnow",level:3},{value:"\u25c9 Via Utc.with_ymd_and_hms()",id:"-via-utcwith_ymd_and_hms",level:3},{value:"\u25c9 Via DateTime::<Utc>::from()",id:"-via-datetimeutcfrom",level:3},{value:"\u25c9 Via String method parse()",id:"-via-string-method-parse",level:3},{value:"\u25c9 Cara lainnya",id:"-cara-lainnya",level:3},{value:"A.50.4. Utc vs Local",id:"a504-utc-vs-local",level:2},{value:"A.50.5. Tipe NaiveDateTime",id:"a505-tipe-naivedatetime",level:2},{value:"A.50.6. Konversi datetime UTC ke local timezone, dan sebaliknya",id:"a506-konversi-datetime-utc-ke-local-timezone-dan-sebaliknya",level:2},{value:"A.50.7. UNIX time",id:"a507-unix-time",level:2},{value:"A.50.8. Date formatting & parsing",id:"a508-date-formatting--parsing",level:2},{value:"A.50.9. DateTime formatting syntax",id:"a509-datetime-formatting-syntax",level:2},{value:"\u25c9 Date specifiers",id:"-date-specifiers",level:3},{value:"\u25c9 Time specifiers",id:"-time-specifiers",level:3},{value:"\u25c9 Timezone specifiers",id:"-timezone-specifiers",level:3},{value:"\u25c9 Date & time specifiers",id:"-date--time-specifiers",level:3},{value:"\u25c9 Special specifiers",id:"-special-specifiers",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:p};function k(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},o,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan mempelajari tentang tipe data datetime yang ada di Rust programming."),(0,i.kt)("p",null,"Rust menyediakan cukup banyak API untuk keperluan pengolahan datetime, tersedia dalam Standard Library crate. Namun pada chapter ini kita tidak akan menggunakannya, karena yang akan dipakai adalah ",(0,i.kt)("a",{parentName:"p",href:"https://crates.io/crates/chrono"},(0,i.kt)("inlineCode",{parentName:"a"},"chrono")," crate")," (dianjurkan untuk menggunakan crate ini karena fiturnya lebih banyak)."),(0,i.kt)("h2",{id:"a501-persiapan"},"A.50.1. Persiapan"),(0,i.kt)("p",null,"Sebelum memulai pembelajaran, siapkan satu project baru, kemudian tambahkan care ",(0,i.kt)("inlineCode",{parentName:"p"},"crono")," dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"Cargo.toml"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-toml"},'[package]\nname = "time_chrono"\nversion = "0.1.0"\nedition = "2021"\n\n[dependencies]\nchrono = "0.4.23"\n')),(0,i.kt)("h2",{id:"a502-tipe-data-datetime"},"A.50.2. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"DateTime")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"crono")," menyediakan cukup banyak tipe data untuk merepresentasikan informasi tanggal dan waktu, tetapi yang paling penting untuk diketahui dan dipahami ada dua, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"DateTime")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"DateTime")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"NaiveDateTime"))),(0,i.kt)("h3",{id:"-tipe-datetimeutc"},"\u25c9 Tipe ",(0,i.kt)("inlineCode",{parentName:"h3"},"DateTime")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," (gabungan dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::datetime::DateTime")," dan generic ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::offset::utc::Utc"),") adalah representasi untuk tipe data datetime dengan timezone offset ",(0,i.kt)("strong",{parentName:"p"},"UTC")," (atau ",(0,i.kt)("strong",{parentName:"p"},"GMT+0"),")."),(0,i.kt)("h3",{id:"-tipe-datetimelocal"},"\u25c9 Tipe ",(0,i.kt)("inlineCode",{parentName:"h3"},"DateTime")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," (gabungan dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::datetime::DateTime")," dan generic ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::offset::local::Local"),") adalah representasi untuk tipe data datetime dengan ",(0,i.kt)("strong",{parentName:"p"},"timezone offset sesuai dengan dimana program dijalankan"),"."),(0,i.kt)("p",null,"Sebagai contoh, penulis berlokasi di Jawa Timur, maka ketika ada suatu data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," artinya timezone offset-nya adalah WIB (atau GMT+7)."),(0,i.kt)("h3",{id:"-tipe-naivedatetime"},"\u25c9 Tipe ",(0,i.kt)("inlineCode",{parentName:"h3"},"NaiveDateTime")),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"chrono::naive::datetime::NaiveDateTime")," merupakan tipe data datetime yang tidak menyimpan informasi timezone. Nanti akan kita bahas apa kegunaan dari tipe ini."),(0,i.kt)("h2",{id:"a503-pembuatan-objek-datetime"},"A.50.3. Pembuatan objek ",(0,i.kt)("inlineCode",{parentName:"h2"},"DateTime")),(0,i.kt)("h3",{id:"-via-utcnow"},"\u25c9 Via ",(0,i.kt)("inlineCode",{parentName:"h3"},"Utc::now()")),(0,i.kt)("p",null,"Ada banyak cara untuk membuat date time, dan kita akan bahas satu-per-satu."),(0,i.kt)("p",null,"Cara yang pertama, mari kita pelajari sambil praktek. Isi file program ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," dengan kode berikut, lalu jalankan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use chrono::prelude::*;\nuse std::time::{UNIX_EPOCH, Duration};\n\nfn main() {\n let sample_date1_in_utc: DateTime = Utc::now();\n println!("sample date 1 (in utc): {sample_date1_in_utc}");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(6635).Z,width:"571",height:"95"})),(0,i.kt)("p",null,"Contoh sederhana di atas adalah salah satu cara membuat object datetime dengan isi adalah informasi waktu sekarang (waktu ketika baris kode tersebut dieksekusi)."),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc::now()")," mengembalikan informasi waktu sekarang dalam timezone UTC (representasi tipe data-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),")."),(0,i.kt)("p",null,"Module item ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc")," sendiri harus diimport terlebih dahulu agar bisa digunakan. Itulah kenapa ada statement ",(0,i.kt)("inlineCode",{parentName:"p"},"use chrono::prelude::*"),"."),(0,i.kt)("h3",{id:"-via-utcwith_ymd_and_hms"},"\u25c9 Via ",(0,i.kt)("inlineCode",{parentName:"h3"},"Utc.with_ymd_and_hms()")),(0,i.kt)("p",null,"Pembuatan object datetime dengan isi informasi waktu spesifik bisa dilakukan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc.with_ymd_and_hms()"),". Fungsi ini mewajibkan developer untuk mengisi 6 parameternya dengan segment waktu (tahun, bulan, dan lainnya)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sample_date2_in_utc = Utc.with_ymd_and_hms(2023, 3, 1, 1, 2, 3).unwrap();\nprintln!("sample date 2 (in utc): {sample_date2_in_utc}");\n// output: sample date 2 (in utc): 2023-03-01 01:02:03 UTC\n')),(0,i.kt)("p",null,"Statement di atas menghasilkan data datetime dengan isi ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-01 01:02:03 UTC"),"."),(0,i.kt)("h3",{id:"-via-datetimeutcfrom"},"\u25c9 Via ",(0,i.kt)("inlineCode",{parentName:"h3"},"DateTime::::from()")),(0,i.kt)("p",null,"Cara ini pas digunakan pada situasi dimana kita perlu membuat object datetime dari sebuah ",(0,i.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Unix_time"},"UNIX timestamp"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sample_date3_in_utc = DateTime::::from(UNIX_EPOCH + Duration::from_secs(1524885322));\nprintln!("sample date 3 (in utc): {sample_date3_in_utc}");\n// output: sample date 3 (in utc): 2018-04-28 03:15:22 UTC\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime::::from()")," di atas menghasilkan data datetime ",(0,i.kt)("inlineCode",{parentName:"p"},"2018-04-28 03:15:22 UTC"),", karena nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"1524885322")," adalah representasi UNIX time untuk waktu tersebut."),(0,i.kt)("h3",{id:"-via-string-method-parse"},"\u25c9 Via String method ",(0,i.kt)("inlineCode",{parentName:"h3"},"parse()")),(0,i.kt)("p",null,"Tipe data string bisa langsung dikonversi ke bentuk datetime menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"parse()")," yang dikombinasikan dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," sebagai generic parameter."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let sample_date4_in_utc = "2023-03-01 01:02:03 UTC".parse::>().unwrap();\nprintln!("sample date 4 (in utc): {sample_date4_in_utc}");\n// output: sample date 4 (in utc): 2023-03-01 01:02:03 UTC\n')),(0,i.kt)("p",null,"Statement parsing di atas menghasilkan data datetime ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-01 01:02:03 UTC"),", sesuai dengan isi data string."),(0,i.kt)("p",null,"O iya, perlu diketahui bahwa tidak semua string bisa di-parse ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),". Jika data string memiliki format yang tidak sesuai dengan aturan parsing di Rust, maka proses parsing menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"parse()")," pasti menghasilkan error."),(0,i.kt)("p",null,"Penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"parse::>()")," sebenarnya mengembalikan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result, ParseError>"),", itulah kenapa pada contoh perlu di chain lagi dengan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h3",{id:"-cara-lainnya"},"\u25c9 Cara lainnya"),(0,i.kt)("p",null,"Ada beberapa cara lain yang bisa digunakan untuk pembuatan object datetime, dan kita akan bahas juga sebentar lagi."),(0,i.kt)("h2",{id:"a504-utc-vs-local"},"A.50.4. ",(0,i.kt)("inlineCode",{parentName:"h2"},"Utc")," vs ",(0,i.kt)("inlineCode",{parentName:"h2"},"Local")),(0,i.kt)("p",null,"Kesemua cara yang sudah dipelajari di atas juga bisa diterapkan dalam pembuatan object date time dengan timezone offset ",(0,i.kt)("inlineCode",{parentName:"p"},"Local"),". Penerapannya kurang lebih sama, cukup ganti ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc")," menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"Local"),"."),(0,i.kt)("p",null,"Jika disandingkan, akan seperti ini kodenya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date1_in_utc: DateTime = Utc::now();\nlet date2_in_utc = Utc.with_ymd_and_hms(2023, 3, 1, 1, 2, 3).unwrap();\nlet date3_in_utc = DateTime::::from(UNIX_EPOCH + Duration::from_secs(1524885322));\nlet date4_in_utc = "2023-03-01 01:02:03 UTC".parse::>().unwrap();\n\nprintln!("sample date 1 (in utc): {date1_in_utc}");\nprintln!("sample date 2 (in utc): {date2_in_utc}");\nprintln!("sample date 3 (in utc): {date3_in_utc}");\nprintln!("sample date 4 (in utc): {date4_in_utc}");\n\n// vs\n\nlet date1_in_local_tz: DateTime = Local::now();\nlet date2_in_local_tz = Local.with_ymd_and_hms(2023, 3, 1, 1, 2, 3).unwrap();\nlet date3_in_local_tz = DateTime::::from(UNIX_EPOCH + Duration::from_secs(1524885322));\nlet date4_in_local_tz = "2023-03-01 01:02:03 UTC".parse::>().unwrap();\n\nprintln!("sample date 1 (in local_tz): {date1_in_local_tz}");\nprintln!("sample date 2 (in local_tz): {date2_in_local_tz}");\nprintln!("sample date 3 (in local_tz): {date3_in_local_tz}");\nprintln!("sample date 4 (in local_tz): {date4_in_local_tz}");\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(239).Z,width:"571",height:"231"})),(0,i.kt)("p",null,"Semoga cukup jelas."),(0,i.kt)("p",null,"Dari contoh di atas, sebenarnya ada 2 variabel yang menarik untuk dibahas, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"sample_date1_in_utc")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"sample_date1_in_local_tz"),". Dua variabel tersebut berisi informasi waktu sekarang, perbedaannya hanya pada timezone offset saja. Namun, meski timezone offset-nya berbeda, kedua datetime tersebut sejatinya adalah merepresentasikan waktu yang sama (ekuivalen)."),(0,i.kt)("p",null,"Agar lebih jelas, silakan perhatikan contoh berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash"},"sample date 1 (in utc): 2023-03-02 09:53:44.561519500 UTC\nsample date 1 (in local_tz): 2023-03-02 16:53:44.562389600 +07:00\n")),(0,i.kt)("p",null,"Kedua datetime tersebut terpaku ",(0,i.kt)("strong",{parentName:"p"},"7 jam")," persis. Data ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 09:53:44")," UTC (atau GMT+0), jika dikonversi ke waktu lokal penulis (WIB atau GMT+7) maka akan menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 16:53:44"),". Selisihnya sesuai dengan timezone offset, yaitu 7 jam."),(0,i.kt)("h2",{id:"a505-tipe-naivedatetime"},"A.50.5. Tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"NaiveDateTime")),(0,i.kt)("p",null,"Rust memilik caranya sendiri dalam pengelolaan data datetime (yang menurut penulis cukup unik). Ada satu tipe data bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime"),", yang kegunaannya adalah untuk menampung tipe data datetime ",(0,i.kt)("strong",{parentName:"p"},"tanpa spesifik timezone offset"),"."),(0,i.kt)("p",null,"Tipe data ini sangat berguna dibeberapa case yang kebanyakan adalah perihal konversi data ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),"."),(0,i.kt)("p",null,"Mari kita praktekan dengan contoh agar lebih jelas. Dimisalkan ada keperluan dimana data UNIX time perlu di konversi ke 2 bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime"),", dengan timezone offset ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Local"),". Pada kasus ini, cara ke-3 dari praktek sebelumnya bisa dilakukan untuk penyelesaian case ini."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let timestamp: u64 = 1524885322;\nlet date2_in_utc = DateTime::::from(UNIX_EPOCH + Duration::from_secs(timestamp));\nlet date2_in_local_tz = DateTime::::from(UNIX_EPOCH + Duration::from_secs(timestamp));\n")),(0,i.kt)("p",null,"Cara lain adalah dengan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime"),", yang contoh penerapannnya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let timestamp_in_ms: i64 = 1524885322000;\nlet naive_date_time: NaiveDateTime = NaiveDateTime::from_timestamp_millis(timestamp_in_ms).unwrap();\n\nlet sample_date_in_utc = Utc.from_utc_datetime(&naive_date_time);\nlet sample_date_in_local_tz = Local.from_local_datetime(&naive_date_time).unwrap();\n\nprintln!("sample date 1 (in utc): {sample_date_in_utc}");\nprintln!("sample date 2 (in local_tz): {sample_date_in_local_tz}");\n\n// output:\n// sample date 1 (in utc): 2018-04-28 03:15:22 UTC\n// sample date 2 (in local_tz): 2018-04-28 03:15:22 +07:00\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime::from_timestamp_millis")," berguna untuk mengkonversi data UNIX time (milisecond) ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime"),". Kemudian, dari data tersebut dapat kita konversi lagi ke bentuk UTC dengan mudah menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc.from_utc_datetime()")," dan local timezone menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Local.from_local_datetime()"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(2330).Z,width:"571",height:"115"})),(0,i.kt)("p",null,"Bisa dilihat pada output di atas, bahwa hasil data datetime berbeda untuk timezone UTC dan local."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Jangan sampai bingung, 2 data datetime di atas tidak sama dan tidak ekuivalen meskipun informasi jam menit detiknya sama persis. Hal ini dikarenakan timezone offset-nya berbeda.")),(0,i.kt)("h2",{id:"a506-konversi-datetime-utc-ke-local-timezone-dan-sebaliknya"},"A.50.6. Konversi datetime UTC ke local timezone, dan sebaliknya"),(0,i.kt)("p",null,"Dalam bekerja dengan tipe data datetime, selalu memperhatikan timezone adalah hal yang sangat penting. Bisa saja dua buah datetime memiliki informasi tanggal dan waktu sama persis, tapi jika timezone-nya berbeda maka keduanya adalah berbeda!"),(0,i.kt)("p",null,"Agar lebih jelas, silakan perhatikan kode berikut beserta outputnya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date1_in_local_tz: DateTime = Local::now();\nprintln!("date (in local): {date1_in_local_tz}");\n\nlet date_in_utc = DateTime::::from(date1_in_local_tz);\nprintln!("date (in utc): {date_in_utc}");\n\nlet date2_in_local_tz = DateTime::::from(date_in_utc);\nprintln!("date (in local): {date2_in_local_tz}");\n\n// output:\n// date (in local): 2023-03-02 17:33:37.750279900 +07:00\n// date (in utc): 2023-03-02 10:33:37.750279900 UTC\n// date (in local): 2023-03-02 17:33:37.750279900 +07:00\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(7934).Z,width:"571",height:"129"})),(0,i.kt)("p",null,"Ketiga data datetime di atas adalah ekuivalen:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"date1_in_local_tz")," berisi informasi datetime waktu sekarang, dengan timezone GMT+7."),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"date_in_utc")," adalah datetime yang ekuivalen dengan ",(0,i.kt)("inlineCode",{parentName:"li"},"date1_in_local_tz"),", hanya saja direpresentasikan dalam timezone UTC."),(0,i.kt)("li",{parentName:"ul"},"Variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"date2_in_local_tz")," juga ekuivalen dengan ",(0,i.kt)("inlineCode",{parentName:"li"},"date_in_utc")," dan juga ",(0,i.kt)("inlineCode",{parentName:"li"},"date1_in_local_tz"),".")),(0,i.kt)("p",null,"Data ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 10 UTC")," jika ditambah 7 jam offset, maka menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"2023-03-02 17 GMT+7"),"."),(0,i.kt)("h2",{id:"a507-unix-time"},"A.50.7. UNIX time"),(0,i.kt)("p",null,"Cara konversi data ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," ke bentuk UNIX time bisa dilakukan lewat 3 cara:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"timestamp"),", nilai baliknya dalam bentuk detik/second"),(0,i.kt)("li",{parentName:"ul"},"menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"timestamp_millis"),", nilai baliknya dalam bentuk miliseconds"),(0,i.kt)("li",{parentName:"ul"},"menggunakan method ",(0,i.kt)("inlineCode",{parentName:"li"},"timestamp_micros"),", nilai baliknya dalam bentuk microseconds")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date_in_local_tz: DateTime = Local::now();\nprintln!("date: {date_in_local_tz}");\nprintln!("date (in second timestamp): {}", date_in_local_tz.timestamp());\nprintln!("date (in milisecond timestamp): {}", date_in_local_tz.timestamp_millis());\nprintln!("date (in microsecond timestamp): {}", date_in_local_tz.timestamp_micros());\n')),(0,i.kt)("p",null,"Sedangkan cara untuk mengkonversi data timestamp ke bentuk ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime")," bisa dilakukan via ",(0,i.kt)("inlineCode",{parentName:"p"},"NaiveDateTime")," ataupun ",(0,i.kt)("inlineCode",{parentName:"p"},"DateTime::from"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// via NaiveDateTime\nlet naive_date_time = NaiveDateTime::from_timestamp_millis(date_in_local_tz.timestamp_millis()).unwrap();\nlet new_datetime1 = Local.from_local_datetime(&naive_date_time).unwrap();\nprintln!("date1: {new_datetime1}");\n\n// via DateTime::from\nlet new_datetime2 = DateTime::::from(UNIX_EPOCH + Duration::from_millis(date_in_local_tz.timestamp_millis().unsigned_abs()));\nprintln!("date2: {new_datetime2}");\n')),(0,i.kt)("p",null,"Output program di atas:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"DateTime",src:a(6451).Z,width:"571",height:"182"})),(0,i.kt)("h2",{id:"a508-date-formatting--parsing"},"A.50.8. Date formatting & parsing"),(0,i.kt)("p",null,"Konversi datetime ke string (atau biasa disebut dengan date formatting) dilakukan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"format")," yang dalam penerapannya membutuhkan argument ",(0,i.kt)("em",{parentName:"p"},"datetime formatting syntax"),"."),(0,i.kt)("p",null,"Sedangkan konversi dari string ke datetime dilakukan via ",(0,i.kt)("inlineCode",{parentName:"p"},"Local.datetime_from_str")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Utc.datetime_from_str"),"."),(0,i.kt)("p",null,"Contoh pengaplikasian keduanya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let date1: DateTime = Local::now();\nprintln!("date1 (in local): {}", date1);\n// date1 (in local): 2023-03-02 18:13:39.954831600 +07:00\n\nlet str_from_date1 = date1.format("%Y-%m-%d %H:%M:%S %z").to_string();\nprintln!("date1 (in string): {}", str_from_date1);\n// date1 (in string): 2023-03-02 18:13:39 +0700\n\nlet date1_from_str = Local.datetime_from_str(&str_from_date1, "%Y-%m-%d %H:%M:%S %z").unwrap();\nprintln!("date1 (in local): {}", date1_from_str);\n// date1 (in local): 2023-03-02 18:13:39 +07:00\n\nlet date2_from_str = Utc.datetime_from_str("03/01/2023 13:04 +0000", "%m/%d/%Y %H:%M %z").unwrap();\nprintln!("date2 (in utc): {}", date2_from_str);\n// date2 (in utc): 2023-03-01 13:04:00 UTC\n\nlet str_from_date2 = date2_from_str.format("%Y-%m-%d %H:%M:%S %z").to_string();\nprintln!("date2 (in string): {}", str_from_date2);\n// date2 (in string): 2023-03-01 13:04:00 +0000\n')),(0,i.kt)("h2",{id:"a509-datetime-formatting-syntax"},"A.50.9. DateTime formatting syntax"),(0,i.kt)("p",null,"Berikut adalah tabel formatting syntax untuk tipe data datetime."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Selengkapnya silakan cek ",(0,i.kt)("a",{parentName:"p",href:"https://docs.rs/chrono/latest/chrono/format/strftime/index.html"},"https://docs.rs/chrono/latest/chrono/format/strftime/index.html"))),(0,i.kt)("h3",{id:"-date-specifiers"},"\u25c9 Date specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%Y"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The full proleptic Gregorian year, zero-padded to 4 digits. chrono supports years from -262144 to 262143.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%C"),(0,i.kt)("td",{parentName:"tr",align:"center"},"20"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The proleptic Gregorian year divided by 100, zero-padded to 2 digits. 1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%y"),(0,i.kt)("td",{parentName:"tr",align:"center"},"01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The proleptic Gregorian year modulo 100, zero-padded to 2 digits. 1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%m"),(0,i.kt)("td",{parentName:"tr",align:"center"},"07"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Month number (01\u201312), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%b"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Jul"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Abbreviated month name. Always 3 letters.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%B"),(0,i.kt)("td",{parentName:"tr",align:"center"},"July"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Full month name. Also accepts corresponding abbreviation in parsing.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%h"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Jul"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %b.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%d"),(0,i.kt)("td",{parentName:"tr",align:"center"},"08"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Day number (01\u201331), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%e"),(0,i.kt)("td",{parentName:"tr",align:"center"},"8"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %d but space-padded. Same as %_d.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%a"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Sun"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Abbreviated weekday name. Always 3 letters.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%A"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Sunday"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Full weekday name. Also accepts corresponding abbreviation in parsing.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%w"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Sunday = 0, Monday = 1, \u2026, Saturday = 6.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%u"),(0,i.kt)("td",{parentName:"tr",align:"center"},"7"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Monday = 1, Tuesday = 2, \u2026, Sunday = 7. (ISO 8601)")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%U"),(0,i.kt)("td",{parentName:"tr",align:"center"},"28"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Week number starting with Sunday (00\u201353), zero-padded to 2 digits. 2")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%W"),(0,i.kt)("td",{parentName:"tr",align:"center"},"27"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %U, but week 1 starts with the first Monday in that year instead.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%G"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %Y but uses the year number in ISO 8601 week date. 3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%g"),(0,i.kt)("td",{parentName:"tr",align:"center"},"01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %y but uses the year number in ISO 8601 week date. 3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%V"),(0,i.kt)("td",{parentName:"tr",align:"center"},"27"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %U but uses the week number in ISO 8601 week date (01\u201353). 3")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%j"),(0,i.kt)("td",{parentName:"tr",align:"center"},"189"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Day of the year (001\u2013366), zero-padded to 3 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%D"),(0,i.kt)("td",{parentName:"tr",align:"center"},"07/08/01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Month-day-year format. Same as %m/%d/%y.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%x"),(0,i.kt)("td",{parentName:"tr",align:"center"},"07/08/01"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Locale\u2019s date representation (e.g., 12/31/99).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%F"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001-07-08"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Year-month-day format (ISO 8601). Same as %Y-%m-%d.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%v"),(0,i.kt)("td",{parentName:"tr",align:"center"},"8-Jul-2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Day-month-year format. Same as %e-%b-%Y.")))),(0,i.kt)("h3",{id:"-time-specifiers"},"\u25c9 Time specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%H"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour number (00\u201323), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%k"),(0,i.kt)("td",{parentName:"tr",align:"center"},"0"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %H but space-padded. Same as %_H.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%I"),(0,i.kt)("td",{parentName:"tr",align:"center"},"12"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour number in 12-hour clocks (01\u201312), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%l"),(0,i.kt)("td",{parentName:"tr",align:"center"},"12"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %I but space-padded. Same as %_I.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%P"),(0,i.kt)("td",{parentName:"tr",align:"center"},"am"),(0,i.kt)("td",{parentName:"tr",align:"left"},"am or pm in 12-hour clocks.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%p"),(0,i.kt)("td",{parentName:"tr",align:"center"},"AM"),(0,i.kt)("td",{parentName:"tr",align:"left"},"AM or PM in 12-hour clocks.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%M"),(0,i.kt)("td",{parentName:"tr",align:"center"},"34"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Minute number (00\u201359), zero-padded to 2 digits.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%S"),(0,i.kt)("td",{parentName:"tr",align:"center"},"60"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Second number (00\u201360), zero-padded to 2 digits. 4")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026490000"),(0,i.kt)("td",{parentName:"tr",align:"left"},"The fractional seconds (in nanoseconds) since last whole second. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026490"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned. These all consume the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.3f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned but fixed to a length of 3. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.6f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026490"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned but fixed to a length of 6. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%.9f"),(0,i.kt)("td",{parentName:"tr",align:"center"},".026490000"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to .%f but left-aligned but fixed to a length of 9. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%3f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to %.3f but without the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%6f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026490"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to %.6f but without the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%9f"),(0,i.kt)("td",{parentName:"tr",align:"center"},"026490000"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Similar to %.9f but without the leading dot. 5")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%R"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00:34"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour-minute format. Same as %H:%M.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%T"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00:34:60"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour-minute-second format. Same as %H:%M:%S.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%X"),(0,i.kt)("td",{parentName:"tr",align:"center"},"00:34:60"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Locale\u2019s time representation (e.g., 23:13:48).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%r"),(0,i.kt)("td",{parentName:"tr",align:"center"},"12:34:60 AM"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Hour-minute-second format in 12-hour clocks. Same as %I:%M:%S %p.")))),(0,i.kt)("h3",{id:"-timezone-specifiers"},"\u25c9 Timezone specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%Z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"ACST"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Local time zone name. Skips all non-whitespace characters during parsing. 6")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+0930"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Offset from the local time to UTC (with UTC being +0000).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%:z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09:30"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Same as %z but with a colon.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%::z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09:30:00"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Offset from the local time to UTC with seconds.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%:::z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Offset from the local time to UTC without minutes.")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%#z"),(0,i.kt)("td",{parentName:"tr",align:"center"},"+09"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Parsing only: Same as %z but allows minutes to be missing or present.")))),(0,i.kt)("h3",{id:"-date--time-specifiers"},"\u25c9 Date & time specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"center"},"Example"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%c"),(0,i.kt)("td",{parentName:"tr",align:"center"},"Sun Jul 8 00:34:60 2001"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Locale\u2019s date and time (e.g., Thu Mar 3 23:05:25 2005).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%+"),(0,i.kt)("td",{parentName:"tr",align:"center"},"2001-07-08T00:34:60.026490+09:30"),(0,i.kt)("td",{parentName:"tr",align:"left"},"ISO 8601 / RFC 3339 date & time format. 7")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%s"),(0,i.kt)("td",{parentName:"tr",align:"center"},"994518299"),(0,i.kt)("td",{parentName:"tr",align:"left"},"UNIX timestamp, the number of seconds since 1970-01-01 00:00 UTC. 8")))),(0,i.kt)("h3",{id:"-special-specifiers"},"\u25c9 Special specifiers"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:"center"},"Spec"),(0,i.kt)("th",{parentName:"tr",align:"left"},"Description"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%t"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Literal tab (\\t).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%n"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Literal newline (\\n).")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:"center"},"%%"),(0,i.kt)("td",{parentName:"tr",align:"left"},"Literal percent sign.")))),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/datetime"},"github.com/novalagung/dasarpemrogramanrust-example/../datetime")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generic"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/time/index.html"},"https://doc.rust-lang.org/std/time/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.rs/time/latest/time/"},"https://docs.rs/time/latest/time/")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/rust-lang/rust-wiki-backup/blob/master/Lib-datetime.md"},"https://github.com/rust-lang/rust-wiki-backup/blob/master/Lib-datetime.md")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.rs/chrono/latest/chrono/"},"https://docs.rs/chrono/latest/chrono/"))))}k.isMDXComponent=!0},6635:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-1-c0119211ce2f1f5f14eaf24316a52b54.png"},239:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-2-998514b9bc7ad92870392305578f2a14.png"},2330:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-3-52a5ccd1fb458c09958eafdba3f6c0d4.png"},7934:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-4-62b94d0c3e24bea70a3355c814ed8d79.png"},6451:(e,t,a)=>{a.d(t,{Z:()=>n});const n=a.p+"assets/images/datetime-5-eb678ecf97453409d153b4f9727e6347.png"}}]); \ No newline at end of file diff --git a/assets/js/bc4edc5c.30092a0e.js b/assets/js/bc4edc5c.30092a0e.js new file mode 100644 index 00000000..c11e3780 --- /dev/null +++ b/assets/js/bc4edc5c.30092a0e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4452],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>o});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var m=i.createContext({}),s=function(a){var e=i.useContext(m),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},d=function(a){var e=s(a.components);return i.createElement(m.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},p=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,m=a.parentName,d=u(a,["components","mdxType","originalType","parentName"]),p=s(n),o=t,c=p["".concat(m,".").concat(o)]||p[o]||k[o]||l;return n?i.createElement(c,r(r({ref:e},d),{},{components:n})):i.createElement(c,r({ref:e},d))}));function o(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=p;var u={};for(var m in e)hasOwnProperty.call(e,m)&&(u[m]=e[m]);u.originalType=a,u.mdxType="string"==typeof a?a:t,r[1]=u;for(var s=2;s{n.r(e),n.d(e,{assets:()=>m,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>s});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:46,title:"A.46. Closures",sidebar_label:"A.46. Closures"},r=void 0,u={unversionedId:"basic/closures",id:"basic/closures",title:"A.46. Closures",description:"Chapter ini membahas tentang closures. Closures sendiri merupakan block fungsi anonimus (anonymous function) yang memiliki kelebihan bisa mengakses item-tem yang posisinya berada di luar block closure tersebut tetapi masih dalam current block scope.",source:"@site/docs/basic/closures.md",sourceDirName:"basic",slug:"/basic/closures",permalink:"/basic/closures",draft:!1,tags:[],version:"current",sidebarPosition:46,frontMatter:{sidebar_position:46,title:"A.46. Closures",sidebar_label:"A.46. Closures"},sidebar:"tutorialSidebar",previous:{title:"A.45. Tipe Data \u279c String Custom Type",permalink:"/basic/tipe-data-custom-type-string-slice"},next:{title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",permalink:"/basic/trait-function"}},m={},s=[{value:"A.46.1. Konsep Closures",id:"a461-konsep-closures",level:2},{value:"\u25c9 formatted print {:.n}",id:"-formatted-print-n",level:3},{value:"A.46.2. Notasi penulisan closure",id:"a462-notasi-penulisan-closure",level:2},{value:"A.46.3. Mutable closure",id:"a463-mutable-closure",level:2},{value:"A.46.4. Borrowing pada closure",id:"a464-borrowing-pada-closure",level:2},{value:"A.46.5. Keyword move",id:"a465-keyword-move",level:2},{value:"A.46.6. Closure sebagai return type",id:"a466-closure-sebagai-return-type",level:2},{value:"\u25c9 Praktik ke-1",id:"-praktik-ke-1",level:3},{value:"\u25c9 Praktik ke-2",id:"-praktik-ke-2",level:3},{value:"A.46.7. Closure sebagai parameter fungsi",id:"a467-closure-sebagai-parameter-fungsi",level:2},{value:"\u25c9 Praktik ke-1",id:"-praktik-ke-1-1",level:3},{value:"\u25c9 Praktik ke-2",id:"-praktik-ke-2-1",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:s};function k(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},d,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Chapter ini membahas tentang closures. Closures sendiri merupakan block fungsi anonimus (anonymous function) yang memiliki kelebihan bisa mengakses item-tem yang posisinya berada di luar block closure tersebut tetapi masih dalam current block scope."),(0,t.kt)("p",null,"Topik closures sangat erat hubungannya dengan ",(0,t.kt)("a",{parentName:"p",href:"/basic/trait-function"},"Trait \u279c Function"),", namun pada chapter ini pembahasan hanya difokuskan pada bagian penerapan closures saja. Penulis anjurkan untuk lanjut ke chapter berikutnya setelah selesai dengan chapter ini."),(0,t.kt)("h2",{id:"a461-konsep-closures"},"A.46.1. Konsep Closures"),(0,t.kt)("p",null,"Cara penerapan closure sangat mirip seperti fungsi, perbedaannya ada pada notasi penulisan-nya. Agar lebih jelas silakan perhatikan program sederhana di bawah ini."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let r = 10.0;\n let volume = calculate_circle_volume_v1(r);\n println!("{volume:.2}");\n}\n\nfn calculate_circle_volume_v1(e: f64) -> f64 {\n const PI: f64 = 3.14;\n let volume = 4.0 / 3.0 * PI * e.powi(3);\n volume\n}\n')),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"calculate_circle_volume_v1")," akan kita refactor ke bentuk closure, hasilnya adalah berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let calculate_circle_volume_v2 = |e: f64| -> f64 {\n const PI: f64 = 3.14;\n let volume = 4.0 / 3.0 * PI * e.powi(3);\n volume\n };\n \n let r = 10.0;\n let volume = calculate_circle_volume_v2(r);\n println!("{:.2}", volume);\n}\n')),(0,t.kt)("p",null,"Silakan pelajari perbedaan dan juga kemiripannya."),(0,t.kt)("p",null,"Fungsi dideklarasikan menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"fn")," dan memiliki nama. Closure tidak memiliki nama, namun bisa disimpan dalam variabel (yang disimpan adalah block closure-nya, bukan return value-nya). Contohnya variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"calculate_circle_volume_v2")," di atas."),(0,t.kt)("p",null,"Perbedaan minor lainnya ada pada notasi penulisan parameter. Pada fungsi tanda ",(0,t.kt)("inlineCode",{parentName:"p"},"()")," digunakan sebagai penanda parameter, sedangkan pada closure tanda ",(0,t.kt)("inlineCode",{parentName:"p"},"||")," digunakan."),(0,t.kt)("h3",{id:"-formatted-print-n"},"\u25c9 formatted print ",(0,t.kt)("inlineCode",{parentName:"h3"},"{:.n}")),(0,t.kt)("p",null,"Notasi penulisan formatted print ",(0,t.kt)("inlineCode",{parentName:"p"},"{:.n}")," digunakan untuk mem-format bilangan desimal di mana ",(0,t.kt)("inlineCode",{parentName:"p"},"n")," adalah jumlah digit setelah tanda ",(0,t.kt)("inlineCode",{parentName:"p"},"."),"."),(0,t.kt)("p",null,"Sebagai contoh, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"pi")," berikut memiliki 0 digit angka dibelakang koma. Untuk menampilkan hanya 4 angka terdepan, bisa gunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"{:.4}"),". Perlu diketahui bahwa angka dibelakang koma yang muncul otomatis dibulatkan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let pi = 3.1415926535;\n\nprintln!("{:.4}", pi); // 3.1416\nprintln!("{pi:.4}"); // 3.1416\n')),(0,t.kt)("h2",{id:"a462-notasi-penulisan-closure"},"A.46.2. Notasi penulisan closure"),(0,t.kt)("p",null,"Closure ",(0,t.kt)("inlineCode",{parentName:"p"},"calculate_circle_volume_v2")," pada contoh di atas adalah salah satu contoh penulisan closure. Sebuah closure bisa memiliki parameter, bisa juga tidak, dan aturan tersebut juga berlaku pada return value."),(0,t.kt)("p",null,"Bebebrapa contoh lain penulisan closure bisa dilihat di bawah ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// closure dengan 2 parameter tanpa return value\nlet do_something_v1 = | a: i32, b: String | {\n // ...\n};\n\n// closure dengan 2 parameter dan return value bertipe tuple\nlet do_something_v2 = | a: i32, b: String | -> (i32, bool) {\n // ...\n};\n\n// closure tanpa parameter dan return value bertipe Vec\nlet do_something_v3 = || -> Vec {\n // ...\n};\n\n// closure tanpa parameter dan tanpa return value\nlet do_something_v4 = || {\n // ...\n};\n")),(0,t.kt)("p",null,"Jika tipe return value tidak dideklarasikan secara eksplist, maka Rust menganggap tipe return value adalah sesuai dengan tipe data pada statement terakhir."),(0,t.kt)("p",null,"Untuk closure yang isinya hanya 1 baris statement, boleh tidak dituliskan block kurung kurawal-nya (",(0,t.kt)("inlineCode",{parentName:"p"},"{}"),")."),(0,t.kt)("p",null,"Tambahan contoh, satu fungsi dan tiga buah closures berikut adalah ekuivalen."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn pow_v1(x: i32) -> i32 {\n x.pow(2)\n}\n\nlet pow_v2 = |x: i32| -> i32 {\n x.pow(2)\n};\n\nlet pow_v3 = |x: i32| {\n x.pow(2)\n};\n\nlet pow_v4 = |x: i32| x.pow(2);\n")),(0,t.kt)("p",null,"Ok, sekarang bagaimana dengan closure yang tidak memiliki parameter dengan isi hanya return value saja? Penulisannya seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let get_pi = || 3.14;\n\nprintln!("{:?}", get_pi());\n')),(0,t.kt)("h2",{id:"a463-mutable-closure"},"A.46.3. Mutable closure"),(0,t.kt)("p",null,"Tidak ada yang spesial mengenai cara mengakses item yang berada di luar block closure. Caranya cukup dengan panggil saja item seperti biasanya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let num = 5;\nlet display = || println!("{num}");\n\nprintln!("{num}"); // 5\ndisplay(); // 5\n')),(0,t.kt)("p",null,"Beda lagi jika data di luar block closure adalah diubah (di-mutate) nilainya dari dalam closure, jika seperti itu maka ada beberapa hal yang perlu diperhatikan."),(0,t.kt)("p",null,"Sebagai contoh, pelajari kode berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\n\nlet increase_by = |x: i32| {\n num += x\n};\n\nincrease_by(10);\nprintln!("{num}"); // 15\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(6894).Z,width:"765",height:"176"})),(0,t.kt)("p",null,"Solusi untuk menghilangkan error di atas adalah dengan menambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," pada variabel closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// before\nlet increase_by = |x: i32| {\n num += x\n};\n\n// after\nlet mut increase_by = |x: i32| {\n num += x\n};\n")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," wajib ditambahkan ke variabel penampung closure ketika di dalamnya terdapat operasi perubahan data terhadap variabel yang posisinya di-luar closure. Contohnya bisa dilihat di atas, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," nilainya di-mutate atau diubah dari dalam closure, karena inilah variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," harus didefinisikan mutable."),(0,t.kt)("h2",{id:"a464-borrowing-pada-closure"},"A.46.4. Borrowing pada closure"),(0,t.kt)("p",null,(0,t.kt)("strong",{parentName:"p"},"Semua variabel di luar block closure ketika digunakan di dalam closure maka terjadi operasi borrowing pada variabel tersebut"),". Variabel di luar block closure dipinjam agar bisa digunakan di dalam closure."),(0,t.kt)("p",null,"Sebagai contoh, kode sederhana berikut menghasilkan error, karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," adalah dipinjam oleh closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," untuk dipergunakan di dalam block-nya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nlet mut increase_by = |x: i32| num += x;\n\nnum += 5;\nincrease_by(10);\n\nprintln!("{num}"); // 20\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(3022).Z,width:"525",height:"222"})),(0,t.kt)("p",null,"Error muncul di statement setelahnya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"num += 5")," karena ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," statusnya masih dipinjam oleh closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by"),"."),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," dipinjam dengan mode peminjaman adalah ",(0,t.kt)("em",{parentName:"p"},"mutable borrow")," karena closure didefinisikan mutable. Salah satu aturan pada borrowing: bahwa dalam waktu yang sama, ketika sudah terjadi mutable borrow, maka tidak boleh ada borrowing lainnya. Itulah alasan kenapa statement ",(0,t.kt)("inlineCode",{parentName:"p"},"num += 5")," menghasilkan error."),(0,t.kt)("p",null,"Solusi dari masalah di atas ada beberapa, yang pertama adalah menggunakan block expression untuk meng-isolasi closure, agar peminjaman pada closure tersebut dan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"num += 5")," tidak terjadi dalam waktu yang sama."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nnum += 5;\n\n{\n let mut increase_by = |x: i32| num += x;\n increase_by(10);\n}\n\nprintln!("{num}"); // 20\n')),(0,t.kt)("p",null,"Solusi di atas efektif untuk menghilangkan error borrowing yang sebelumnya muncul, tapi setelah d-refactor kode menjadi tidak sesuai spesifikasi awal. Pada kode yang baru di atas, deklarasi closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," terjadi di dalam block expression, artinya closure ini hanya akan bisa digunakan pada block kode tersebut saja, tidak bisa di-reuse di luar block."),(0,t.kt)("p",null,"Solusi yang lebih baik pada kasus di atas adalah dengan tidak menggunakan default borrowing (yang terjadi di dalam block closure ketika mengakses variabel yang posisinya berada di luar closure), melainkan gunakan saja borrowing pada parameter closure. Kita ubah lagi kodenya menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nlet increase_by = |num: &mut i32, x: i32| *num += x;\n\nnum += 5;\nincrease_by(&mut num, 10);\n\nprintln!("{num}"); // 20\n')),(0,t.kt)("p",null,"Pada contoh di atas, closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," ditambahi parameter baru. Sekarang ada 2 parameter, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," yang tipe-nya adalah pointer ",(0,t.kt)("inlineCode",{parentName:"p"},"&mut i32")," dan parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),". Di dalam block closure, ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," di-dereference (menggunakan operator ",(0,t.kt)("inlineCode",{parentName:"p"},"*"),") kemudian diubah nilainya. Setelah eksekusi statement selesai, data pinjaman tersebut langsung dikembalikan ke pemilik. Inilah kenapa kode di atas tidak menghasilkan error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pengaksesan variabel yang berada di luar scope closure tanpa via parameter berarti adalah borrowing, maka dalam penerapannya wajib untuk memperhatikan aturan yang berlaku pada ownership dan borrowing.")),(0,t.kt)("h2",{id:"a465-keyword-move"},"A.46.5. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"move")),(0,t.kt)("p",null,"Telah dijelaskan di atas bahwa variabel di luar closure, jika diakses dari dalam closure maka terjadi borrowing. Ada cara agar variabel tersebut ownership-nya berpindah ke dalam closure (",(0,t.kt)("em",{parentName:"p"},"move semantics"),"), yaitu menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"move"),"."),(0,t.kt)("p",null,"Contohnya bisa dilihat berikut ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nlet mut increase_by = move |x: i32| {\n num += x;\n println!("{num} (from closure)"); // 15\n};\n\nincrease_by(10);\nprintln!("{num}"); // 5\n')),(0,t.kt)("p",null,"Closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," di atas memiliki keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"move")," dalam pendefinisiannya. Dengan ini maka semua variabel di luar scope closure jika diakses dari dalam closure, maka variabel tersebut berpindah owner-nya (",(0,t.kt)("em",{parentName:"p"},"move semantics"),")."),(0,t.kt)("p",null,"Lalu bagaimana dengan nasib variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," yang berada di luar closure setelah owner-nya berpindah? Pada kondisi normal jawaban pertanyaan ini adalah tergantung tipe data-nya, jika ",(0,t.kt)("em",{parentName:"p"},"by default")," variabel adalah mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics")," maka variabel tersebut menjadi invalid. Namun pada contoh di atas ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," bertipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"i32")," yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),", maka variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," tersebut masih bisa digunakan di luar closure."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(2682).Z,width:"324",height:"105"})),(0,t.kt)("p",null,"Bisa dilihat dari gambar di atas, statement ",(0,t.kt)("inlineCode",{parentName:"p"},"print")," dari dalam block closure hasilnya adalah benar, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"5 + 10 = 15"),". Dan variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," di luar block closure tidak berubah nilainya."),(0,t.kt)("h2",{id:"a466-closure-sebagai-return-type"},"A.46.6. Closure sebagai return type"),(0,t.kt)("h3",{id:"-praktik-ke-1"},"\u25c9 Praktik ke-1"),(0,t.kt)("p",null,"Fungsi bisa memiliki nilai balik bertipe closure. Caranya dengan menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"impl Fn()")," sebagai tipe data nilai balik. Contoh penerapannya:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_something() -> impl Fn() {\n println!("hello (from do_something)");\n\n return || {\n println!("hello (from closure)");\n };\n}\n')),(0,t.kt)("p",null,"Tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"impl Fn()")," adalah ekuvalen dengan closure ",(0,t.kt)("inlineCode",{parentName:"p"},"|| { }"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let my_closure = do_something();\n println!("hello (from main)");\n my_closure();\n}\n\nfn main() {\n let my_closure = do_something_v2();\n let message = my_closure(123, "hello rust".to_owned());\n println!("{message} (from main)");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(4600).Z,width:"321",height:"124"})),(0,t.kt)("p",null,"Bisa dilihat, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," di atas mengembalikan closure yang menampilkan string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello (from closure)"),". String tersebut hanya muncul ketika closure dipanggil."),(0,t.kt)("p",null,"Sedangkan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," sendiri juga menampilkan pesan string lainnya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"hello (from do_something)"),", yang pesan ini adalah muncul langsung saat pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),". Berbeda dengan pesan ",(0,t.kt)("inlineCode",{parentName:"p"},"hello (from closure)")," yang hanya muncul ketika closure dieksekusi."),(0,t.kt)("h3",{id:"-praktik-ke-2"},"\u25c9 Praktik ke-2"),(0,t.kt)("p",null,"Pada contoh di atas, closure yang dikembalikan fungsi memiliki skema sangat sederhana, tanpa parameter dan argument. Mari coba praktik dengan contoh yang lebih kompleks."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_something_v2() -> impl Fn(i32, String) -> String {\n println!("hello (from do_something_v2)");\n\n return |a: i32, b: String| -> String {\n let message = format!("{b} {a}");\n message\n };\n}\n')),(0,t.kt)("p",null,"Pada kode di atas fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something_v2")," mengembalikan closure dengan skema ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn(i32, String) -> String"),", yang artinya:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Parameter pertamanya bertipe ",(0,t.kt)("inlineCode",{parentName:"li"},"i32")),(0,t.kt)("li",{parentName:"ul"},"Parameter keduanya bertipe ",(0,t.kt)("inlineCode",{parentName:"li"},"String")),(0,t.kt)("li",{parentName:"ul"},"Mengembalikan nilai bertipe ",(0,t.kt)("inlineCode",{parentName:"li"},"String"))),(0,t.kt)("p",null,"Di dalam closure tersebut, data parameter digabung menjadi sebuah pesan string yang kemudian dijadikan nilai balik."),(0,t.kt)("p",null,"Sekarang jalankan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something_v2")," di atas, kemudian lihat hasilnya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let my_closure = do_something_v2();\nlet message = my_closure(123, "hello rust".to_owned());\nprintln!("{message} (from main)");\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(3546).Z,width:"323",height:"106"})),(0,t.kt)("h2",{id:"a467-closure-sebagai-parameter-fungsi"},"A.46.7. Closure sebagai parameter fungsi"),(0,t.kt)("h3",{id:"-praktik-ke-1-1"},"\u25c9 Praktik ke-1"),(0,t.kt)("p",null,"Pengaplikasian closure sebagai parameter fungsi banyak dilakukan di Rust, hal ini bisa dilakukan dengan memanfaatkan generic parameter. Silakan perhatikan kode berikut untuk contoh penerapannya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn run_x_times(x: i32, my_closure: F)\nwhere\n F: Fn(i32),\n{\n for i in 0..x {\n my_closure(i)\n }\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_x_times")," dibuat dengan tugas mengeksekusi closure ",(0,t.kt)("inlineCode",{parentName:"p"},"my_closure")," sebanyak ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," kali. Parameter closure harus selalu memiliki tipe data generic, contohnya ",(0,t.kt)("inlineCode",{parentName:"p"},"my_closure")," di atas yang tipe data-nya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"F"),"."),(0,t.kt)("p",null,"Fungsi yang memiliki parameter closure wajib menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"where")," yang keyword ini digunakan untuk mendaftarkan skema closure yang nantiya bisa diterima saat pemanggilan fungsi. Tipe generic ",(0,t.kt)("inlineCode",{parentName:"p"},"F")," di daftarkan dengan notasi ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn(i32)"),", artinya dalam pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_x_times"),", parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"my_closure")," harus diisi dengan closure yang skema-nya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn(i32)")," yang jika di ilustrasikan dalam bentuk closure adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"|param1: i32| { }"),"."),(0,t.kt)("p",null,"Sekarang mari kita test fungsi di atas. Panggil fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_x_times")," kemudian pada bagian parameter closure isi dengan block closure yang memiliki skema sesuai requirement, contohnya ",(0,t.kt)("inlineCode",{parentName:"p"},'|i: i32| { println!("hello rust {i}") }'),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'run_x_times(4, |i: i32| {\n println!("hello rust {i}");\n});\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(2376).Z,width:"314",height:"147"})),(0,t.kt)("p",null,"O iya, closure di atas juga bisa dituliskan dalam bentuk seperti ini. Bebas, pilih sesuai preferensi dan/atau kesepakatan team perihal code convention."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'run_x_times(4, |i: i32| println!("hello rust {i}"));\n')),(0,t.kt)("h3",{id:"-praktik-ke-2-1"},"\u25c9 Praktik ke-2"),(0,t.kt)("p",null,"Ok, sekarang mari kita coba praktikkan contoh yang lebih kompleks."),(0,t.kt)("p",null,"Pada praktik ini kita akan buat sebuah fungsi yang tugasnya melakukan pencarian indeks slice dengan kondisi pencarian didapat dari eksekusi closure."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_index(data: &[T], cond_fn: F) -> i32\nwhere\n F: Fn(&T) -> bool,\n{\n for i in 0..data.len() {\n if cond_fn(&data[i]) {\n return i as i32\n }\n }\n\n return -1\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_index")," memiliki 2 parameter generic, yaitu:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("inlineCode",{parentName:"li"},"T")," yang digunakan sebagai tipe data element slice ",(0,t.kt)("inlineCode",{parentName:"li"},"data"),"."),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("inlineCode",{parentName:"li"},"F")," yang digunakan sebagai tipe data closure ",(0,t.kt)("inlineCode",{parentName:"li"},"cond_fn")," dengan skema ",(0,t.kt)("inlineCode",{parentName:"li"},"Fn(&T) -> bool"),", yang jika diilustrasikan dalam bentuk closure adalah ",(0,t.kt)("inlineCode",{parentName:"li"},"|param1: &T| -> bool { }"),".")),(0,t.kt)("p",null,"Di dalam fungsi tersebut, data slice di-loop, kemudian tiap elemen-nya digunakan sebagai parameter pemanggilan closure ",(0,t.kt)("inlineCode",{parentName:"p"},"cond_fn"),"."),(0,t.kt)("p",null,"Jika nilai balik pemanggilan closure adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"true")," maka ",(0,t.kt)("inlineCode",{parentName:"p"},"i")," dikembalikan dalam bentuk ",(0,t.kt)("inlineCode",{parentName:"p"},"i32")," (ada proses casting). Dan jika tidak diketemukan, maka indeks ",(0,t.kt)("inlineCode",{parentName:"p"},"-1")," dikembalikan."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"as")," digunakan untuk casting tipe data. Lebih jelasnya dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/type-alias-casting"},"Type Alias & Casting")," dan ",(0,t.kt)("a",{parentName:"p",href:"#/wip/trait-conversion-from-into"},"Trait \u279c Conversion (From & Into)"))),(0,t.kt)("p",null,"Jalankan program tersebut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let numbers = [24, 13, 2, 53, 3];\nlet number_to_find = 53;\nlet index = find_index(&numbers, |e: &i32| -> bool {\n if *e == number_to_find {\n true \n } else {\n false\n }\n});\n\nprintln!("number_to_find: {number_to_find}");\nprintln!("index: {index}");\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(3451).Z,width:"324",height:"108"})),(0,t.kt)("p",null,"Bisa dilihat program berjalan sesuai harapan."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn")," merupakan salah satu trait function yang ada di Rust. Lebih jelasnya perihal keyword tersebut dibahas pada chapter selanjutnya, yaitu ",(0,t.kt)("a",{parentName:"p",href:"/basic/trait-function"},"Trait \u279c Function"))),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/closures"},"github.com/novalagung/dasarpemrogramanrust-example/../closures")),(0,t.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/borrowing"},"Borrowing")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/trait-function"},"Trait \u279c Function (Fn, FnMut, FnOnce)"))),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch13-01-closures.html"},"https://doc.rust-lang.org/book/ch13-01-closures.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html"},"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html"))))}k.isMDXComponent=!0},6894:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/closures-1-2c7599bfed946d5bd1fb34a57acd9de7.png"},3022:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/closures-2-35b45e21715884c98b155c79b2d8f1c4.png"},2682:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAABpCAIAAADNzc3NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTdUMTk6MjU6MTkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjExOjU0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjExOjU0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmI3NGFiZDJlLWJhOGIt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"},4600:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUEAAAB8CAIAAAB4/5WhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMThUMDU6NDQ6MDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjAzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjAzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjkzNzY3OTZlLTA1MDkt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"},3546:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUMAAABqCAIAAACphaQaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMThUMDU6NTM6MTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjQzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjQzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRmMGFmYTZjLWQwMDAtMTY0Mi05NTE2LThmMWFkYTBiMjMzZCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkZjBhZmE2Yy1kMDAwLTE2NDItOTUxNi04ZjFhZGEwYjIzM2QiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkZjBhZmE2Yy1kMDAwLTE2NDItOTUxNi04ZjFhZGEwYjIzM2QiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmRmMGFmYTZjLWQwMDAtMTY0Mi05NTE2LThmMWFkYTBiMjMzZCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xOFQwNTo1MzoxNyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Put9LZQAAA2USURBVHja7V07ctw4EPVJJDvbeGOvU2WrTTZwIGeuTV2uUpUzHWSOoFMo96FWQ3JIAP36A/6H8165ShaFT6OBh26C7OaHO4Igrh8fqAKCIJMJgiCTCYIgkwmCIJMJgkwmCIJMJgiCTCYIYhYmP35//vH0+fy/z08/nr8/zi7SewcLtDpNoG7EY1ChpXEdTRNvBY29//bsihgexcRVd64uO3J736GSpzE508NCTFaUDXSbYJAju66Kl9d2ensXaMTkj1h5sKOuDVXK+RYZVt2I9kcwGY49n6W2jUWYrGr+oEwutLAUk2OKO8/ypfdmpZ9/iW0CqLZZC410CSYrhZtl9qittZkWmaq6yUweP3bUzjJM9po9FpPL0bSD7/fNXg+tBSmMXXIRliy06M9XysXutziRi9r5r82I3DWF51aOPaClQpKy2U4XudlIq/c1RO/nO5WnzqA/WoYdqi7rY5A0m5vkFyDScCnTZ2Jr0z7F2HUmS33CNuXFdJztXy8tKJr3lRxZ3kmX7//t/9AUbSfWXCGBrevDhI028/l6Lnx++p6638OMCmkS+sh15FIZMdl2Qw0mZ/0jJkdXmRy7piVteFDNTdHkL6n4/WXQ+2UoyU+LylB1ukCldBop8sGmuu6dKdyVxmShT9imffFc1Z7RqJKV2YQlO772a+DHk7ZCTHZMYrKUNr9ScCMvUcwYONkKMUXjYjYr/VZmVS+l9b2ncvxejUt5rCWkENxR8uulS9GkFKQrcvlb+dOQ2beUiMmmSNkfwR6as7xwlcpbd6BP2Ca+2LHi6fuzrjRldRvljdkE+11+0AR7guyYi8mSqcokFD5ZyrbSzXl+1s+dPKOczbLq52otWDY5RmV1bi1ftOAlFl5fUF2f2iKTvVcyGapufibr9jrAH6BP2Ca+aO/zadtxJWuziUr6IxruE0t2rGiTu73EPt2+FAgwNWyT68/A89rungpEAvLBsbtrU7p5+rppZxQ3iXofx2RxN7mgTRbTmNYNrft3haA28cXLyLQZ156xWkrGs4lLRkdUf6439T453cH6AWQnIMjjHm4gVWkr75M1yxKxyeV9MbxPjqwyOHaoJW/D6RsHnPiRdpTcY6HeRzI5U52QL7kwnBlBkVSjk96+qmP31z286bUv5res1sPFsJLxbOKS3oh6oYLGZfTZddY2PNnLTtyeEruEHvLiFsacXev3VfW+uc5k6BwXzzrNsYPzT9xXYVPFQklOOvszbdB7nMmW6sQhauKiPvYaASIJj0LqTh+7r+Nn8dTaeLkAnB7BQz40xbaSldlEJY0zPDkinR1zP09eEPt9fLeaZPt/gnnUsa/d+zzvZUx5x2vJkd3sIiZuDpsweY0da3fvXRPEEZlMEMT+QCYTBJlMEASZTBDEsZn85/2vfz/9/DJTyabMf38uJsOch4DDA9BtTu9jscR1JVdSXazNWY6XasYemtGh0GjZtmTy/c9/P/0a/n389kfGol8PUb45Ja+MyZs+riaT59/vJkanXwuTH5bvh0zesqMjMjmMut6OxeTEUD+kpPr47ct9d/3v+7+0kr2VTku2TP5yKd9Vz1oYGJtWt5nsvYY5vHBoBQx4qxAGRmmx6TCwviyp5A9AWQGURAUof0DZKnpnMfCWrqLncACXNx04UYEWfQbeFlXGDqcDTreSZeGoNjn/U8eu+3+AgS0aOf9a0g9XTyr2F1M77NhkGIaOosOzyYzEhcSYnKXlKGIDisB6GcVuGC4Rt6QmKlDHkrzaA8PlI2LUMjk8HWqiAit3gghnkKGVxXQY6VaULAtXz+ThX8M0nckde0uCASbnTeHqf335mNyZ3//XNPLPQ1LXZLIa8gYCmPP8OM6ajDO5vKgH1sNowyiT9QAMZd2lSkDh8oEI/momh6cDBwNjJZep3uwsKGpAuWGiSw3eiE2OMbmlKPKu8+oNafN/D3ff/p7EZC13QpqDoTpZbA2TlcB6mNdlISZn7KkIrvbcZdsTD08HTlRgOD6DTTZC9WqYbGRZIJNxIw0tB5/ZtMlplWlMhhMBU+otbJORtVncJhevzCvprVayyWqeUpkeQ/eulS1kHpuMwoTJZIHWOGtMhhWHKq2/bdwnwzB0NTr8kua2Mi1JsY6HsH7VG4SB9Wq2MzdbbBWTwTqECrFyEoy9T45PB0xUgJRs0mokk50sC4dicn503HEJUlEvWZ48axtBXrgt0Fry5tczmY2zaxSG7sTBB2bJStU6hPUHzlr1zLXAe4VH2kqiAiV/gJZUAAmAVTft7Do6HYpCUO4EN8+BlzbYO7u2dpmrYjKx/PPVdR+fHgkgVeDSD+DJZDKZTF5iJupzNpLJhPC95iE0mTzHXEx6IbquKzKZIG4aZDJBkMkEQZDJBEGQybWoiFKMIP9i5y7gnnsvGu4XP3VXPsV6u5hlLe2Mydlb03MSryZ7QRjKFyg3CzD2XrNYNnA38jLqnP2tRLCV9pzJj7l2yeT2das2yKE6Q8DeDeOSHTnsWDgEf8Ww+pVxDd9S2DGTi7Bh9LamSD8Qz0mAS8qXQPMAyZjTaLyxaH3b/g6/ICjC5fWO7Lc9lw3BV7cKJbReMBmWS4W3RFL06eY5CO4l7v6MP52Vfg5QfFNrZkO/d5vchCtZ713n+QPiOQn09AOtSw+DpUbNefDb9p+V0Hbt2/Z6Iq7s8roh+Oh79goHZBCCDMFHdtuMW9L0mbQ/xheo+AJwEYxRyqHN5kGZDO0kZHLoos5kbOf/SIz2DEyGyxB92x6GtuPsBXfBsMQdhOBb4cdapAEIEQ4wGehTSfwQpXLwbE6do0aQpzwczdr3DmmTRdDSGkxuyiQeQdy1dg6iwt+2L0PbtewFxjIo4/ZWDcF3Q4HUgsp+0PvcGTsU79q520lUV/lGrGk/9Y7KfcMqeWDveoj7X5fJRZzjVCbHv22PQtt1X9DY0Ic/rR6CD2xSkMmBRHYi4tplsv8J7oonZ6GRSFU8DrvAkqd8O2Yyss9JAoAFmNz0OMIOm7t3+Nv2OsG07AUBKq8dgg+o7H9U/s4LwfdEcn2cqUfSIDBKNbyyUn6TvhCX93x23XKvuVvu024NCQAqDXUoe8Flp5hklo2jZvvb9tqJcOCb9wYtVwrBN29l/WD9OzdNAmgxF0nLgGL17vEcFwS5TkRHeWqJJNV9VYbg62Xytijujc/u/ZAce5WHlvOFti/3XDsi507y4t8SyOQEWUa+1j6vyOQNQtsPLSeZfMvIvesVaQy86/3S41rkHDOaqx0WmUwQtMkEQZDJBEGQyQRBkMkEQSYTBEEmEwRBJhMEQSYTBJlMEMTVM/nr6e3360u4aIukArw4Bi+vv99OX4srHYo/LALZ/25gzFGjo23kfu964pQTGzHZqFDdCqgPeLzmStkPk4UkWzN52K0zMcCkEbfNZLQkpu4NN8LkdTyCizjnfSMTbceOzI0yuXdk+wWj7MNRJg+esT/VcDkIk9yW6sW6/E10dHb6Tk2pt9NL9/NrxNwMBePCp9V7aeMilUrOpBmu4zlC9zUt6+RsJiIZoyp0DrwicWnbTYZMFmuxndrBNiYzVhrMAJPTKk375lwXRFZW82Ux9iv+7YQ7asrlP1U6pgvzUq5CeKSKCpE0JUObLOdI07w1m86AMqKi0Ulyk8q79K4vv+SHGfnK8plcTLcz18qfkU0exGgqwY56acufXs+SXq7wgBdhkQwl2951IZFkMprN/qJzb5vUT5xqOAV0sK+AydIs1jLZNeLuyZbiXXvWfA4mVwg/uK1dpbBIhpLnZnKy4biHVH0DgsiaOadR3jmTTUNUZZOdQ+gKm4xsRNnRzDY5eoJ+MVdhkQwlz83k7C7Zs5/DEhC3PLgqbfKevWvrdipwn5x6Yf6jCrwUIkyGHcWZXN4/9uUrhBe3x1GRDCWLXqcxudJoNhx+Ob0VN9+aGmiSd81keKgr3MGe8+J0KjMD7jxDuxdiMuqogslJ7deX4mFLQPh87PlGFhMJnpzLM219t8Wn3JZNDpjly8EcPvf+XXX3QazG5D2Arxgsrd3CiM+mbLrWZDK5vBZy78Z/KshJI5MPur0L93KW98w3G8DrTCPie9dkMkEQZDJBkMkEQZDJBEHslcm7yTRw1dg6TUJMxIgsPMe6ASYbFTZ8QaDmzFusZhS7mR7shsa0gzQJ8zGZz5bI5J0zuSHXKVumVgx9eFHvIk3CdpsjsS8mb5ZpAOUPiLxACt9XNOzgy6sIPgZEf6lf0lulSYhkL8jipIM5CY6wE90ukzfMNKDlD5BM1lZXlQGpY3I9kddLk6CU/Hp6TWO4a3MSkMoH8a7XzzQA8gcYTFbCH6czOXeu46d426VJCJQcEf9IB/tYTF4x0wBaMeoiK8P6Z2Ky7ja4N8rbpUnQShZzN5bJNMqHYfJKmQaqmAwt3EQmm8G37oLeLk2CmlGosP20yTftXa+XaUBj8pBMB/i4WZtVT02KwjaNIw+TNkuToDM5Ox8cyWSa5IMw+W61TAN4qfattueysiOx7Ly+hJznMycQQ1+U9FfzVmkSlJKpLk71OQlI5OtlMjERB3yTgq41mUwuczQEmUwrtouR0K8mkwmCIJMJgiCTCYJMJgiCTCYIgkwmCIJMJggymSAIMpkgCDKZIIgY/gc17m08rSYldAAAAABJRU5ErkJggg=="},2376:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,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"},3451:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAABsCAIAAACdAFx+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMThUMDU6MjY6NTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjE2OjIxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjE2OjIxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE1YmRiOGU1LWRlNzIt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"}}]); \ No newline at end of file diff --git a/assets/js/bc4edc5c.f0b380ec.js b/assets/js/bc4edc5c.f0b380ec.js deleted file mode 100644 index 468f7a9e..00000000 --- a/assets/js/bc4edc5c.f0b380ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4452],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>o});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var m=i.createContext({}),s=function(a){var e=i.useContext(m),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},d=function(a){var e=s(a.components);return i.createElement(m.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},p=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,m=a.parentName,d=u(a,["components","mdxType","originalType","parentName"]),p=s(n),o=t,c=p["".concat(m,".").concat(o)]||p[o]||k[o]||l;return n?i.createElement(c,r(r({ref:e},d),{},{components:n})):i.createElement(c,r({ref:e},d))}));function o(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=p;var u={};for(var m in e)hasOwnProperty.call(e,m)&&(u[m]=e[m]);u.originalType=a,u.mdxType="string"==typeof a?a:t,r[1]=u;for(var s=2;s{n.r(e),n.d(e,{assets:()=>m,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>u,toc:()=>s});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:46,title:"A.46. Closures",sidebar_label:"A.46. Closures"},r=void 0,u={unversionedId:"basic/closures",id:"basic/closures",title:"A.46. Closures",description:"Chapter ini membahas tentang closures. Closures sendiri merupakan block fungsi anonimus (anonymous function) yang memiliki kelebihan bisa mengakses item-tem yang posisinya berada di luar block closure tersebut tetapi masih dalam current block scope.",source:"@site/docs/basic/closures.md",sourceDirName:"basic",slug:"/basic/closures",permalink:"/basic/closures",draft:!1,tags:[],version:"current",sidebarPosition:46,frontMatter:{sidebar_position:46,title:"A.46. Closures",sidebar_label:"A.46. Closures"},sidebar:"tutorialSidebar",previous:{title:"A.45. Tipe Data \u279c String Custom Type",permalink:"/basic/tipe-data-custom-type-string-slice"},next:{title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",permalink:"/basic/trait-function"}},m={},s=[{value:"A.46.1. Konsep Closures",id:"a461-konsep-closures",level:2},{value:"\u25c9 formatted print {:.n}",id:"-formatted-print-n",level:3},{value:"A.46.2. Notasi penulisan closure",id:"a462-notasi-penulisan-closure",level:2},{value:"A.46.3. Mutable closure",id:"a463-mutable-closure",level:2},{value:"A.46.4. Borrowing pada closure",id:"a464-borrowing-pada-closure",level:2},{value:"A.46.5. Keyword move",id:"a465-keyword-move",level:2},{value:"A.46.6. Closure sebagai return type",id:"a466-closure-sebagai-return-type",level:2},{value:"\u25c9 Praktik ke-1",id:"-praktik-ke-1",level:3},{value:"\u25c9 Praktik ke-2",id:"-praktik-ke-2",level:3},{value:"A.46.7. Closure sebagai parameter fungsi",id:"a467-closure-sebagai-parameter-fungsi",level:2},{value:"\u25c9 Praktik ke-1",id:"-praktik-ke-1-1",level:3},{value:"\u25c9 Praktik ke-2",id:"-praktik-ke-2-1",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:s};function k(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},d,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Chapter ini membahas tentang closures. Closures sendiri merupakan block fungsi anonimus (anonymous function) yang memiliki kelebihan bisa mengakses item-tem yang posisinya berada di luar block closure tersebut tetapi masih dalam current block scope."),(0,t.kt)("p",null,"Topik closures sangat erat hubungannya dengan ",(0,t.kt)("a",{parentName:"p",href:"/basic/trait-function"},"Trait \u279c Function"),", namun pada chapter ini pembahasan hanya difokuskan pada bagian penerapan closures saja. Penulis anjurkan untuk lanjut ke chapter berikutnya setelah selesai dengan chapter ini."),(0,t.kt)("h2",{id:"a461-konsep-closures"},"A.46.1. Konsep Closures"),(0,t.kt)("p",null,"Cara penerapan closure sangat mirip seperti fungsi, perbedaannya ada pada notasi penulisan-nya. Agar lebih jelas silakan perhatikan program sederhana di bawah ini."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let r = 10.0;\n let volume = calculate_circle_volume_v1(r);\n println!("{volume:.2}");\n}\n\nfn calculate_circle_volume_v1(e: f64) -> f64 {\n const PI: f64 = 3.14;\n let volume = 4.0 / 3.0 * PI * e.powi(3);\n volume\n}\n')),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"calculate_circle_volume_v1")," akan kita refactor ke bentuk closure, hasilnya adalah berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let calculate_circle_volume_v2 = |e: f64| -> f64 {\n const PI: f64 = 3.14;\n let volume = 4.0 / 3.0 * PI * e.powi(3);\n volume\n };\n \n let r = 10.0;\n let volume = calculate_circle_volume_v2(r);\n println!("{:.2}", volume);\n}\n')),(0,t.kt)("p",null,"Silakan pelajari perbedaan dan juga kemiripannya."),(0,t.kt)("p",null,"Fungsi dideklarasikan menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"fn")," dan memiliki nama. Closure tidak memiliki nama, namun bisa disimpan dalam variabel (yang disimpan adalah block closure-nya, bukan return value-nya). Contohnya variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"calculate_circle_volume_v2")," di atas."),(0,t.kt)("p",null,"Perbedaan minor lainnya ada pada notasi penulisan parameter. Pada fungsi tanda ",(0,t.kt)("inlineCode",{parentName:"p"},"()")," digunakan sebagai penanda parameter, sedangkan pada closure tanda ",(0,t.kt)("inlineCode",{parentName:"p"},"||")," digunakan."),(0,t.kt)("h3",{id:"-formatted-print-n"},"\u25c9 formatted print ",(0,t.kt)("inlineCode",{parentName:"h3"},"{:.n}")),(0,t.kt)("p",null,"Notasi penulisan formatted print ",(0,t.kt)("inlineCode",{parentName:"p"},"{:.n}")," digunakan untuk mem-format bilangan desimal dimana ",(0,t.kt)("inlineCode",{parentName:"p"},"n")," adalah jumlah digit setelah tanda ",(0,t.kt)("inlineCode",{parentName:"p"},"."),"."),(0,t.kt)("p",null,"Sebagai contoh, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"pi")," berikut memiliki 0 digit angka dibelakang koma. Untuk menampilkan hanya 4 angka terdepan, bisa gunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"{:.4}"),". Perlu diketahui bahwa angka dibelakang koma yang muncul otomatis dibulatkan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let pi = 3.1415926535;\n\nprintln!("{:.4}", pi); // 3.1416\nprintln!("{pi:.4}"); // 3.1416\n')),(0,t.kt)("h2",{id:"a462-notasi-penulisan-closure"},"A.46.2. Notasi penulisan closure"),(0,t.kt)("p",null,"Closure ",(0,t.kt)("inlineCode",{parentName:"p"},"calculate_circle_volume_v2")," pada contoh di atas adalah salah satu contoh penulisan closure. Sebuah closure bisa memiliki parameter, bisa juga tidak, dan aturan tersebut juga berlaku pada return value."),(0,t.kt)("p",null,"Bebebrapa contoh lain penulisan closure bisa dilihat di bawah ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// closure dengan 2 parameter tanpa return value\nlet do_something_v1 = | a: i32, b: String | {\n // ...\n};\n\n// closure dengan 2 parameter dan return value bertipe tuple\nlet do_something_v2 = | a: i32, b: String | -> (i32, bool) {\n // ...\n};\n\n// closure tanpa parameter dan return value bertipe Vec\nlet do_something_v3 = || -> Vec {\n // ...\n};\n\n// closure tanpa parameter dan tanpa return value\nlet do_something_v4 = || {\n // ...\n};\n")),(0,t.kt)("p",null,"Jika tipe return value tidak dideklarasikan secara eksplist, maka Rust menganggap tipe return value adalah sesuai dengan tipe data pada statement terakhir."),(0,t.kt)("p",null,"Untuk closure yang isinya hanya 1 baris statement, boleh tidak dituliskan block kurung kurawal-nya (",(0,t.kt)("inlineCode",{parentName:"p"},"{}"),")."),(0,t.kt)("p",null,"Tambahan contoh, satu fungsi dan tiga buah closures berikut adalah ekuivalen."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn pow_v1(x: i32) -> i32 {\n x.pow(2)\n}\n\nlet pow_v2 = |x: i32| -> i32 {\n x.pow(2)\n};\n\nlet pow_v3 = |x: i32| {\n x.pow(2)\n};\n\nlet pow_v4 = |x: i32| x.pow(2);\n")),(0,t.kt)("p",null,"Ok, sekarang bagaimana dengan closure yang tidak memiliki parameter dengan isi hanya return value saja? Penulisannya seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let get_pi = || 3.14;\n\nprintln!("{:?}", get_pi());\n')),(0,t.kt)("h2",{id:"a463-mutable-closure"},"A.46.3. Mutable closure"),(0,t.kt)("p",null,"Tidak ada yang spesial mengenai cara mengakses item yang berada di luar block closure. Caranya cukup dengan panggil saja item seperti biasanya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let num = 5;\nlet display = || println!("{num}");\n\nprintln!("{num}"); // 5\ndisplay(); // 5\n')),(0,t.kt)("p",null,"Beda lagi jika data di luar block closure adalah diubah (di-mutate) nilainya dari dalam closure, jika seperti itu maka ada beberapa hal yang perlu diperhatikan."),(0,t.kt)("p",null,"Sebagai contoh, pelajari kode berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\n\nlet increase_by = |x: i32| {\n num += x\n};\n\nincrease_by(10);\nprintln!("{num}"); // 15\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(6894).Z,width:"765",height:"176"})),(0,t.kt)("p",null,"Solusi untuk menghilangkan error di atas adalah dengan menambahkan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," pada variabel closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// before\nlet increase_by = |x: i32| {\n num += x\n};\n\n// after\nlet mut increase_by = |x: i32| {\n num += x\n};\n")),(0,t.kt)("p",null,"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"mut")," wajib ditambahkan ke variabel penampung closure ketika di dalamnya terdapat operasi perubahan data terhadap variabel yang posisinya di-luar closure. Contohnya bisa dilihat di atas, variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," nilainya di-mutate atau diubah dari dalam closure, karena inilah variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," harus didefinisikan mutable."),(0,t.kt)("h2",{id:"a464-borrowing-pada-closure"},"A.46.4. Borrowing pada closure"),(0,t.kt)("p",null,(0,t.kt)("strong",{parentName:"p"},"Semua variabel di luar block closure ketika digunakan di dalam closure maka terjadi operasi borrowing pada variabel tersebut"),". Variabel di luar block closure dipinjam agar bisa digunakan di dalam closure."),(0,t.kt)("p",null,"Sebagai contoh, kode sederhana berikut menghasilkan error, karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," adalah dipinjam oleh closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," untuk dipergunakan di dalam block-nya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nlet mut increase_by = |x: i32| num += x;\n\nnum += 5;\nincrease_by(10);\n\nprintln!("{num}"); // 20\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(3022).Z,width:"525",height:"222"})),(0,t.kt)("p",null,"Error muncul di statement setelahnya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"num += 5")," karena ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," statusnya masih dipinjam oleh closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by"),"."),(0,t.kt)("p",null,"Variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," dipinjam dengan mode peminjaman adalah ",(0,t.kt)("em",{parentName:"p"},"mutable borrow")," karena closure didefinisikan mutable. Salah satu aturan pada borrowing: bahwa dalam waktu yang sama, ketika sudah terjadi mutable borrow, maka tidak boleh ada borrowing lainnya. Itulah alasan kenapa statement ",(0,t.kt)("inlineCode",{parentName:"p"},"num += 5")," menghasilkan error."),(0,t.kt)("p",null,"Solusi dari masalah di atas ada beberapa, yang pertama adalah menggunakan block expression untuk meng-isolasi closure, agar peminjaman pada closure tersebut dan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"num += 5")," tidak terjadi dalam waktu yang sama."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nnum += 5;\n\n{\n let mut increase_by = |x: i32| num += x;\n increase_by(10);\n}\n\nprintln!("{num}"); // 20\n')),(0,t.kt)("p",null,"Solusi di atas efektif untuk menghilangkan error borrowing yang sebelumnya muncul, tapi setelah d-refactor kode menjadi tidak sesuai spesifikasi awal. Pada kode yang baru di atas, deklarasi closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," terjadi di dalam block expression, artinya closure ini hanya akan bisa digunakan pada block kode tersebut saja, tidak bisa di-reuse di luar block."),(0,t.kt)("p",null,"Solusi yang lebih baik pada kasus di atas adalah dengan tidak menggunakan default borrowing (yang terjadi di dalam block closure ketika mengakses variabel yang posisinya berada di luar closure), melainkan gunakan saja borrowing pada parameter closure. Kita ubah lagi kodenya menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nlet increase_by = |num: &mut i32, x: i32| *num += x;\n\nnum += 5;\nincrease_by(&mut num, 10);\n\nprintln!("{num}"); // 20\n')),(0,t.kt)("p",null,"Pada contoh di atas, closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," ditambahi parameter baru. Sekarang ada 2 parameter, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," yang tipe-nya adalah pointer ",(0,t.kt)("inlineCode",{parentName:"p"},"&mut i32")," dan parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),". Di dalam block closure, ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," di-dereference (menggunakan operator ",(0,t.kt)("inlineCode",{parentName:"p"},"*"),") kemudian diubah nilainya. Setelah eksekusi statement selesai, data pinjaman tersebut langsung dikembalikan ke pemilik. Inilah kenapa kode di atas tidak menghasilkan error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pengaksesan variabel yang berada di luar scope closure tanpa via parameter berarti adalah borrowing, maka dalam penerapannya wajib untuk memperhatikan aturan yang berlaku pada ownership dan borrowing.")),(0,t.kt)("h2",{id:"a465-keyword-move"},"A.46.5. Keyword ",(0,t.kt)("inlineCode",{parentName:"h2"},"move")),(0,t.kt)("p",null,"Telah dijelaskan di atas bahwa variabel di luar closure, jika diakses dari dalam closure maka terjadi borrowing. Ada cara agar variabel tersebut ownership-nya berpindah ke dalam closure (",(0,t.kt)("em",{parentName:"p"},"move semantics"),"), yaitu menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"move"),"."),(0,t.kt)("p",null,"Contohnya bisa dilihat berikut ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let mut num = 5;\nlet mut increase_by = move |x: i32| {\n num += x;\n println!("{num} (from closure)"); // 15\n};\n\nincrease_by(10);\nprintln!("{num}"); // 5\n')),(0,t.kt)("p",null,"Closure ",(0,t.kt)("inlineCode",{parentName:"p"},"increase_by")," di atas memiliki keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"move")," dalam pendefinisiannya. Dengan ini maka semua variabel di luar scope closure jika diakses dari dalam closure, maka variabel tersebut berpindah owner-nya (",(0,t.kt)("em",{parentName:"p"},"move semantics"),")."),(0,t.kt)("p",null,"Lalu bagaimana dengan nasib variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," yang berada di luar closure setelah owner-nya berpindah? Pada kondisi normal jawaban pertanyaan ini adalah tergantung tipe data-nya, jika ",(0,t.kt)("em",{parentName:"p"},"by default")," variabel adalah mengadopsi ",(0,t.kt)("em",{parentName:"p"},"move semantics")," maka variabel tersebut menjadi invalid. Namun pada contoh di atas ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," bertipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"i32")," yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),", maka variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," tersebut masih bisa digunakan di luar closure."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(2682).Z,width:"324",height:"105"})),(0,t.kt)("p",null,"Bisa dilihat dari gambar di atas, statement ",(0,t.kt)("inlineCode",{parentName:"p"},"print")," dari dalam block closure hasilnya adalah benar, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"5 + 10 = 15"),". Dan variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"num")," di luar block closure tidak berubah nilainya."),(0,t.kt)("h2",{id:"a466-closure-sebagai-return-type"},"A.46.6. Closure sebagai return type"),(0,t.kt)("h3",{id:"-praktik-ke-1"},"\u25c9 Praktik ke-1"),(0,t.kt)("p",null,"Fungsi bisa memiliki nilai balik bertipe closure. Caranya dengan menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"impl Fn()")," sebagai tipe data nilai balik. Contoh penerapannya:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_something() -> impl Fn() {\n println!("hello (from do_something)");\n\n return || {\n println!("hello (from closure)");\n };\n}\n')),(0,t.kt)("p",null,"Tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"impl Fn()")," adalah ekuvalen dengan closure ",(0,t.kt)("inlineCode",{parentName:"p"},"|| { }"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let my_closure = do_something();\n println!("hello (from main)");\n my_closure();\n}\n\nfn main() {\n let my_closure = do_something_v2();\n let message = my_closure(123, "hello rust".to_owned());\n println!("{message} (from main)");\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(4600).Z,width:"321",height:"124"})),(0,t.kt)("p",null,"Bisa dilihat, fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," di atas mengembalikan closure yang menampilkan string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello (from closure)"),". String tersebut hanya muncul ketika closure dipanggil."),(0,t.kt)("p",null,"Sedangkan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something")," sendiri juga menampilkan pesan string lainnya, yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"hello (from do_something)"),", yang pesan ini adalah muncul langsung saat pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something"),". Berbeda dengan pesan ",(0,t.kt)("inlineCode",{parentName:"p"},"hello (from closure)")," yang hanya muncul ketika closure dieksekusi."),(0,t.kt)("h3",{id:"-praktik-ke-2"},"\u25c9 Praktik ke-2"),(0,t.kt)("p",null,"Pada contoh di atas, closure yang dikembalikan fungsi memiliki skema sangat sederhana, tanpa parameter dan argument. Mari coba praktik dengan contoh yang lebih kompleks."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_something_v2() -> impl Fn(i32, String) -> String {\n println!("hello (from do_something_v2)");\n\n return |a: i32, b: String| -> String {\n let message = format!("{b} {a}");\n message\n };\n}\n')),(0,t.kt)("p",null,"Pada kode di atas fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something_v2")," mengembalikan closure dengan skema ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn(i32, String) -> String"),", yang artinya:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Parameter pertamanya bertipe ",(0,t.kt)("inlineCode",{parentName:"li"},"i32")),(0,t.kt)("li",{parentName:"ul"},"Parameter keduanya bertipe ",(0,t.kt)("inlineCode",{parentName:"li"},"String")),(0,t.kt)("li",{parentName:"ul"},"Mengembalikan nilai bertipe ",(0,t.kt)("inlineCode",{parentName:"li"},"String"))),(0,t.kt)("p",null,"Di dalam closure tersebut, data parameter digabung menjadi sebuah pesan string yang kemudian dijadikan nilai balik."),(0,t.kt)("p",null,"Sekarang jalankan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something_v2")," di atas, kemudian lihat hasilnya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let my_closure = do_something_v2();\nlet message = my_closure(123, "hello rust".to_owned());\nprintln!("{message} (from main)");\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(3546).Z,width:"323",height:"106"})),(0,t.kt)("h2",{id:"a467-closure-sebagai-parameter-fungsi"},"A.46.7. Closure sebagai parameter fungsi"),(0,t.kt)("h3",{id:"-praktik-ke-1-1"},"\u25c9 Praktik ke-1"),(0,t.kt)("p",null,"Pengaplikasian closure sebagai parameter fungsi banyak dilakukan di Rust, hal ini bisa dilakukan dengan memanfaatkan generic parameter. Silakan perhatikan kode berikut untuk contoh penerapannya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn run_x_times(x: i32, my_closure: F)\nwhere\n F: Fn(i32),\n{\n for i in 0..x {\n my_closure(i)\n }\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_x_times")," dibuat dengan tugas mengeksekusi closure ",(0,t.kt)("inlineCode",{parentName:"p"},"my_closure")," sebanyak ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," kali. Parameter closure harus selalu memiliki tipe data generic, contohnya ",(0,t.kt)("inlineCode",{parentName:"p"},"my_closure")," di atas yang tipe data-nya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"F"),"."),(0,t.kt)("p",null,"Fungsi yang memiliki parameter closure wajib menggunakan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"where")," yang keyword ini digunakan untuk mendaftarkan skema closure yang nantiya bisa diterima saat pemanggilan fungsi. Tipe generic ",(0,t.kt)("inlineCode",{parentName:"p"},"F")," di daftarkan dengan notasi ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn(i32)"),", artinya dalam pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_x_times"),", parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"my_closure")," harus diisi dengan closure yang skema-nya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn(i32)")," yang jika di ilustrasikan dalam bentuk closure adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"|param1: i32| { }"),"."),(0,t.kt)("p",null,"Sekarang mari kita test fungsi di atas. Panggil fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_x_times")," kemudian pada bagian parameter closure isi dengan block closure yang memiliki skema sesuai requirement, contohnya ",(0,t.kt)("inlineCode",{parentName:"p"},'|i: i32| { println!("hello rust {i}") }'),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'run_x_times(4, |i: i32| {\n println!("hello rust {i}");\n});\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(2376).Z,width:"314",height:"147"})),(0,t.kt)("p",null,"O iya, closure di atas juga bisa dituliskan dalam bentuk seperti ini. Bebas, pilih sesuai preferensi dan/atau kesepakatan team perihal code convention."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'run_x_times(4, |i: i32| println!("hello rust {i}"));\n')),(0,t.kt)("h3",{id:"-praktik-ke-2-1"},"\u25c9 Praktik ke-2"),(0,t.kt)("p",null,"Ok, sekarang mari kita coba praktikkan contoh yang lebih kompleks."),(0,t.kt)("p",null,"Pada praktik ini kita akan buat sebuah fungsi yang tugasnya melakukan pencarian indeks slice dengan kondisi pencarian didapat dari eksekusi closure."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_index(data: &[T], cond_fn: F) -> i32\nwhere\n F: Fn(&T) -> bool,\n{\n for i in 0..data.len() {\n if cond_fn(&data[i]) {\n return i as i32\n }\n }\n\n return -1\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_index")," memiliki 2 parameter generic, yaitu:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("inlineCode",{parentName:"li"},"T")," yang digunakan sebagai tipe data element slice ",(0,t.kt)("inlineCode",{parentName:"li"},"data"),"."),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("inlineCode",{parentName:"li"},"F")," yang digunakan sebagai tipe data closure ",(0,t.kt)("inlineCode",{parentName:"li"},"cond_fn")," dengan skema ",(0,t.kt)("inlineCode",{parentName:"li"},"Fn(&T) -> bool"),", yang jika diilustrasikan dalam bentuk closure adalah ",(0,t.kt)("inlineCode",{parentName:"li"},"|param1: &T| -> bool { }"),".")),(0,t.kt)("p",null,"Di dalam fungsi tersebut, data slice di-loop, kemudian tiap elemen-nya digunakan sebagai parameter pemanggilan closure ",(0,t.kt)("inlineCode",{parentName:"p"},"cond_fn"),"."),(0,t.kt)("p",null,"Jika nilai balik pemanggilan closure adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"true")," maka ",(0,t.kt)("inlineCode",{parentName:"p"},"i")," dikembalikan dalam bentuk ",(0,t.kt)("inlineCode",{parentName:"p"},"i32")," (ada proses casting). Dan jika tidak diketemukan, maka indeks ",(0,t.kt)("inlineCode",{parentName:"p"},"-1")," dikembalikan."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"as")," digunakan untuk casting tipe data. Lebih jelasnya dibahas pada chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/type-alias-casting"},"Type Alias & Casting")," dan ",(0,t.kt)("a",{parentName:"p",href:"#/wip/trait-conversion-from-into"},"Trait \u279c Conversion (From & Into)"))),(0,t.kt)("p",null,"Jalankan program tersebut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'let numbers = [24, 13, 2, 53, 3];\nlet number_to_find = 53;\nlet index = find_index(&numbers, |e: &i32| -> bool {\n if *e == number_to_find {\n true \n } else {\n false\n }\n});\n\nprintln!("number_to_find: {number_to_find}");\nprintln!("index: {index}");\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Closure",src:n(3451).Z,width:"324",height:"108"})),(0,t.kt)("p",null,"Bisa dilihat program berjalan sesuai harapan."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"Fn")," merupakan salah satu trait function yang ada di Rust. Lebih jelasnya perihal keyword tersebut dibahas pada chapter selanjutnya, yaitu ",(0,t.kt)("a",{parentName:"p",href:"/basic/trait-function"},"Trait \u279c Function"))),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/closures"},"github.com/novalagung/dasarpemrogramanrust-example/../closures")),(0,t.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/borrowing"},"Borrowing")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/trait-function"},"Trait \u279c Function (Fn, FnMut, FnOnce)"))),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch13-01-closures.html"},"https://doc.rust-lang.org/book/ch13-01-closures.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html"},"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html"))))}k.isMDXComponent=!0},6894:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/closures-1-2c7599bfed946d5bd1fb34a57acd9de7.png"},3022:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/closures-2-35b45e21715884c98b155c79b2d8f1c4.png"},2682:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAABpCAIAAADNzc3NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTdUMTk6MjU6MTkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjExOjU0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjExOjU0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmI3NGFiZDJlLWJhOGIt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"},4600:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUEAAAB8CAIAAAB4/5WhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMThUMDU6NDQ6MDYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjAzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjAzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjkzNzY3OTZlLTA1MDkt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"},3546:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUMAAABqCAIAAACphaQaAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMThUMDU6NTM6MTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjQzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjE3OjQzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRmMGFmYTZjLWQwMDAt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"},2376:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,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"},3451:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUQAAABsCAIAAACdAFx+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMThUMDU6MjY6NTcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjE2OjIxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjE2OjIxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE1YmRiOGU1LWRlNzIt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"}}]); \ No newline at end of file diff --git a/assets/js/bd9b9d52.8d109af6.js b/assets/js/bd9b9d52.8d109af6.js deleted file mode 100644 index 47976681..00000000 --- a/assets/js/bd9b9d52.8d109af6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[909],{3905:(a,e,t)=>{t.d(e,{Zo:()=>k,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var u=n.createContext({}),d=function(a){var e=n.useContext(u),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},k=function(a){var e=d(a.components);return n.createElement(u.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,u=a.parentName,k=p(a,["components","mdxType","originalType","parentName"]),s=d(t),o=i,g=s["".concat(u,".").concat(o)]||s[o]||m[o]||r;return t?n.createElement(g,l(l({ref:e},k),{},{components:t})):n.createElement(g,l({ref:e},k))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=s;var p={};for(var u in e)hasOwnProperty.call(e,u)&&(p[u]=e[u]);p.originalType=a,p.mdxType="string"==typeof a?a:i,l[1]=p;for(var d=2;d{t.r(e),t.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>d});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:5,title:"A.5. Tipe Data \u279c Primitive Scalar",sidebar_label:"A.5. Tipe Data \u279c Primitive Scalar"},l=void 0,p={unversionedId:"basic/tipe-data-primitive-scalar",id:"basic/tipe-data-primitive-scalar",title:"A.5. Tipe Data \u279c Primitive Scalar",description:"Tipe data di Rust dikategorikan menjadi beberapa group, salah satunya adalah group tipe data primitif scalar atau biasa disebut scalar types. Pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/tipe-data-primitive-scalar.md",sourceDirName:"basic",slug:"/basic/tipe-data-primitive-scalar",permalink:"/basic/tipe-data-primitive-scalar",draft:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5,title:"A.5. Tipe Data \u279c Primitive Scalar",sidebar_label:"A.5. Tipe Data \u279c Primitive Scalar"},sidebar:"tutorialSidebar",previous:{title:"A.4. Variabel",permalink:"/basic/variabel"},next:{title:"A.6. Tipe Data \u279c String Literal (&str)",permalink:"/basic/tipe-data-string-literal"}},u={},d=[{value:"A.5.1. Signed integers",id:"a51-signed-integers",level:2},{value:"A.5.2. Unsigned integers",id:"a52-unsigned-integers",level:2},{value:"A.5.3. Floating point",id:"a53-floating-point",level:2},{value:"A.5.4. Bool",id:"a54-bool",level:2},{value:"A.5.5. Char",id:"a55-char",level:2},{value:"A.5.6. Pointer scalar",id:"a56-pointer-scalar",level:2},{value:"A.5.7. Tipe data primitive compound",id:"a57-tipe-data-primitive-compound",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],k={toc:d};function m(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},k,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Tipe data di Rust dikategorikan menjadi beberapa group, salah satunya adalah group tipe data primitif scalar atau biasa disebut ",(0,i.kt)("strong",{parentName:"p"},"scalar types"),". Pada chapter ini kita akan mempelajarinya."),(0,i.kt)("p",null,"Tipe data scalar sendiri merupakan tipe data primitif yang isinya hanya 1 nilai. Rust memiliki 4 tipe scalar, yaitu integers, floating-point, boolean, dan character."),(0,i.kt)("h2",{id:"a51-signed-integers"},"A.5.1. Signed integers"),(0,i.kt)("p",null,"Signed integer merupakan tipe data numerik/integer yang bisa menampung nilai positif dan juga negatif. Ada beberapa tipe data singed integer tersedia di Rust yang dibedakan sesuai size-nya."),(0,i.kt)("p",null,"Tipe data ini keyword-nya ditandai dengan huruf awalan ",(0,i.kt)("inlineCode",{parentName:"p"},"i"),", contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"i8"),", yang dimana tipe ini adalah tipe data numerik integer dengan range value yang bisa ditampung adalah mulai dari angka ",(0,i.kt)("strong",{parentName:"p"},"\u2212128")," (didapat dari \u2212(2",(0,i.kt)("sup",null,"7"),") hingga ",(0,i.kt)("strong",{parentName:"p"},"127")," (didapat dari 2",(0,i.kt)("sup",null,"7"),"-1)."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numerik1 = 24;\nlet numerik2: i8 = 2;\nlet numerik3: i64 = 12;\n\nprintln!("{} | {} | {}", numerik1, numerik2, numerik3);\n// output ==> 24 | 2 | 12\n')),(0,i.kt)("p",null,"Dengan menggunakan teknik deklarasi ",(0,i.kt)("em",{parentName:"p"},"type inference"),", maka default angka numerik tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("p",null,"Range value pada tipe data itu cukup penting untuk diperhatikan, jika ada sebuah variabel yang tipe datanya pasti dan diisi dengan nilai di luar kapasitas yang bisa ditampung, maka akan muncul error. Contoh, tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i8"),", jika diisi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"128")," maka error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"data type error",src:t(4362).Z,width:"642",height:"488"})),(0,i.kt)("p",null,"Umumnya, tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," cukup untuk kebutuhan menampung nilai, tapi ada banyak case dimana kita perlu tipe dengan size yang lebih besar seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"i64"),"."),(0,i.kt)("p",null,"Berikut merupakan list tipe data signed integers yang ada di Rust. Tidak perlu dihafal."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Tipe data"),(0,i.kt)("th",{parentName:"tr",align:null},"Deskripsi"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i8")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"7"),") hingga (2",(0,i.kt)("sup",null,"7"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i16")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"15"),") hingga (2",(0,i.kt)("sup",null,"15"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i32")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"31"),") hingga (2",(0,i.kt)("sup",null,"31"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i64")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"63"),") hingga (2",(0,i.kt)("sup",null,"63"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i128")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"127"),") hingga (2",(0,i.kt)("sup",null,"127"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"isize")),(0,i.kt)("td",{parentName:"tr",align:null},"tipe pointer")))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang tipe data ",(0,i.kt)("strong",{parentName:"p"},"pointer")," dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Bisa gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MAX")," untuk mengetahui nilai minimal dan juga maksimal tipe data signed integers."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let min_i8 = i8::MIN;\nlet max_i8 = i8::MAX;\n\nprintln!("{} | {}", min_i8, max_i8);\n// output ==> -128 | 127\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"i8::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"i8::MAX")," memiliki tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"::")," yang di Rust merupakan path separator. Untuk sekarang penulis anjurkan tidak terlalu pusing memahami apa itu path separator, karena nantinya akan ada pembahasan yang cukup detail khusus untuk mengupas topik tersebut.")),(0,i.kt)("h2",{id:"a52-unsigned-integers"},"A.5.2. Unsigned integers"),(0,i.kt)("p",null,"Perbedaan antara signed dan unsigned adalah pada range value yang ditampung, size-nya sama, hanya angka minimal dan maksimalnya berbeda."),(0,i.kt)("p",null,"Unsigned di sini maksudnya adalah hanya bisa menampung angka mulai dari 0. Tipe data unsigned tidak bisa menampung angka negatif (jika dipaksa akan memunculkan error)."),(0,i.kt)("p",null,"Berikut list tipe data unsigned integer pada Rust:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Tipe data"),(0,i.kt)("th",{parentName:"tr",align:null},"Deskripsi"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u8")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"8"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u16")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"16"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u32")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"32"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u64")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"64"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u128")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"128"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"usize")),(0,i.kt)("td",{parentName:"tr",align:null},"tipe pointer")))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang tipe data ",(0,i.kt)("strong",{parentName:"p"},"pointer")," dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Contoh penerapan unsigned integer:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numerik4: u32 = 28;\nlet numerik5: u8 = 16;\nlet numerik6: u64 = 42;\n\nprintln!("{} | {} | {}", numerik4, numerik5, numerik6);\n// output ==> 28 | 16 | 42\n')),(0,i.kt)("p",null,"Bisa gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MAX")," untuk mengetahui nilai minimal dan juga maksimal tipe data unsigned integers."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let min_u8 = u8::MIN;\nlet max_u8 = u8::MAX;\n\nprintln!("{} | {}", min_u8, max_u8);\n// output ==> 0 | 255\n')),(0,i.kt)("p",null,"Catatan saja, variabel yang dideklarasikan dengan predefined value adalah numerik, by default tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," (signed)."),(0,i.kt)("h2",{id:"a53-floating-point"},"A.5.3. Floating point"),(0,i.kt)("p",null,"Floating point adalah tipe data yang mendukung nilai dibelakang koma, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"3.14"),". Di Rust ada dua tipe data floating point, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"f34")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),". Contoh penggunaan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let fp1: f32 = 3.14;\nlet fp2: f64 = 3.1415926535;\n\nprintln!("{} | {:.5}", fp1, fp2);\n// output ==> 3.14 | 3.14159\n')),(0,i.kt)("p",null,"O iya, jumlah digit di belakang koma bisa diatur saat diprint menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Caranya dengan menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"{:.n}"),". Sebagai contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"{:.5}")," maka akan menampilkan hanya 5 digit dibelakang koma."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Dalam penerapan definisi variabel sekaligus nilai, jika nilai dituliskan dalam desimal seperti contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"24"),", maka tipe data variabel penampung adalah numerik."),(0,i.kt)("p",{parentName:"blockquote"},"Jika dituliskan dalam notasi floating point, contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"3.14"),", maka tipe data variabel penampung adalah float.")),(0,i.kt)("p",null,"Bisa gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MAX")," untuk mengetahui nilai minimal dan juga maksimal tipe data floating point."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let min_f32 = f32::MIN;\nlet max_f32 = f32::MAX;\n\nprintln!("min_f32={} | max_f32={}", min_f32, max_f32);\n// output ==> min_f32=-340282350000000000000000000000000000000 | max_f32=340282350000000000000000000000000000000\n')),(0,i.kt)("p",null,"Catatan saja, variabel yang dideklarasikan dengan predefined value numerik yang ada titiknya (",(0,i.kt)("inlineCode",{parentName:"p"},"3.10"),") adalah floating point, by default tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),"."),(0,i.kt)("h2",{id:"a54-bool"},"A.5.4. Bool"),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"bool")," menerima dua pilihan nilai saja, ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let b1 = true;\nlet b2 = false;\n\nprintln!("{} | {}", b1, b2);\n// output ==> true | false\n')),(0,i.kt)("h2",{id:"a55-char"},"A.5.5. Char"),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"char")," menampung sebuah data (unicode), contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"'n'"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"'-'"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"'2'"),". Penulisan literal untuk tipe ini menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"''"),", diapit tanda petik satu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let c1 = 'n';\nlet c2 = '-';\nlet c3 = '2';\n\nprintln!(\"{} | {} | {}\", c1, c2, c3);\n// output ==> n | - | 2\n")),(0,i.kt)("h2",{id:"a56-pointer-scalar"},"A.5.6. Pointer scalar"),(0,i.kt)("p",null,"Deklarasi tipe data pointer cukup mudah, yaitu dengan menuliskan deklarasinya seperti biasa tapi ditambahkan karakter ",(0,i.kt)("inlineCode",{parentName:"p"},"&"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let ptr1: &i32 = &24;\nprintln!("{}", ptr1);\n// output ==> 24\n')),(0,i.kt)("p",null,"Perihal apa itu tipe data pointer dan apa kegunaan prefix ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," akan dibahas pada chapter terpisah, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),"."),(0,i.kt)("h2",{id:"a57-tipe-data-primitive-compound"},"A.5.7. Tipe data primitive compound"),(0,i.kt)("p",null,"Selain beberapa tipe data yang sudah dibahas di atas, ada juga jenis tipe data primitif jenis lainnya, yaitu primitive compound yang di antaranya adalah ",(0,i.kt)("a",{parentName:"p",href:"/basic/array"},"Array")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/tuple"},"Tuple"),". Lebih detailnya mengenai tipe tersebut dibahas pada chapter terpisah."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tipe_data_primitive_scalar"},"github.com/novalagung/dasarpemrogramanrust-example/../tipe_data_primitive_scalar")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-string-literal"},"Tipe Data \u279c String Literal (&str)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/array"},"Array")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice"},"Slice (Basic)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tuple"},"Tuple")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/primitives.html"},"https://doc.rust-lang.org/rust-by-example/primitives.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/index.html#syntax"},"https://doc.rust-lang.org/std/fmt/index.html#syntax")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Integer_(computer_science)"},"https://en.wikipedia.org/wiki/Integer_(computer_science)"))))}m.isMDXComponent=!0},4362:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/tipe-data-primitive-scalar-1-7710e1ad76b0cc40fbae8a8d42ead294.png"}}]); \ No newline at end of file diff --git a/assets/js/bd9b9d52.c2ec587a.js b/assets/js/bd9b9d52.c2ec587a.js new file mode 100644 index 00000000..74682a5d --- /dev/null +++ b/assets/js/bd9b9d52.c2ec587a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[909],{3905:(a,e,t)=>{t.d(e,{Zo:()=>k,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var u=n.createContext({}),d=function(a){var e=n.useContext(u),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},k=function(a){var e=d(a.components);return n.createElement(u.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},s=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,u=a.parentName,k=p(a,["components","mdxType","originalType","parentName"]),s=d(t),o=i,g=s["".concat(u,".").concat(o)]||s[o]||m[o]||r;return t?n.createElement(g,l(l({ref:e},k),{},{components:t})):n.createElement(g,l({ref:e},k))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=s;var p={};for(var u in e)hasOwnProperty.call(e,u)&&(p[u]=e[u]);p.originalType=a,p.mdxType="string"==typeof a?a:i,l[1]=p;for(var d=2;d{t.r(e),t.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>d});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:5,title:"A.5. Tipe Data \u279c Primitive Scalar",sidebar_label:"A.5. Tipe Data \u279c Primitive Scalar"},l=void 0,p={unversionedId:"basic/tipe-data-primitive-scalar",id:"basic/tipe-data-primitive-scalar",title:"A.5. Tipe Data \u279c Primitive Scalar",description:"Tipe data di Rust dikategorikan menjadi beberapa group, salah satunya adalah group tipe data primitif scalar atau biasa disebut scalar types. Pada chapter ini kita akan mempelajarinya.",source:"@site/docs/basic/tipe-data-primitive-scalar.md",sourceDirName:"basic",slug:"/basic/tipe-data-primitive-scalar",permalink:"/basic/tipe-data-primitive-scalar",draft:!1,tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5,title:"A.5. Tipe Data \u279c Primitive Scalar",sidebar_label:"A.5. Tipe Data \u279c Primitive Scalar"},sidebar:"tutorialSidebar",previous:{title:"A.4. Variabel",permalink:"/basic/variabel"},next:{title:"A.6. Tipe Data \u279c String Literal (&str)",permalink:"/basic/tipe-data-string-literal"}},u={},d=[{value:"A.5.1. Signed integers",id:"a51-signed-integers",level:2},{value:"A.5.2. Unsigned integers",id:"a52-unsigned-integers",level:2},{value:"A.5.3. Floating point",id:"a53-floating-point",level:2},{value:"A.5.4. Bool",id:"a54-bool",level:2},{value:"A.5.5. Char",id:"a55-char",level:2},{value:"A.5.6. Pointer scalar",id:"a56-pointer-scalar",level:2},{value:"A.5.7. Tipe data primitive compound",id:"a57-tipe-data-primitive-compound",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],k={toc:d};function m(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},k,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Tipe data di Rust dikategorikan menjadi beberapa group, salah satunya adalah group tipe data primitif scalar atau biasa disebut ",(0,i.kt)("strong",{parentName:"p"},"scalar types"),". Pada chapter ini kita akan mempelajarinya."),(0,i.kt)("p",null,"Tipe data scalar sendiri merupakan tipe data primitif yang isinya hanya 1 nilai. Rust memiliki 4 tipe scalar, yaitu integers, floating-point, boolean, dan character."),(0,i.kt)("h2",{id:"a51-signed-integers"},"A.5.1. Signed integers"),(0,i.kt)("p",null,"Signed integer merupakan tipe data numerik/integer yang bisa menampung nilai positif dan juga negatif. Ada beberapa tipe data singed integer tersedia di Rust yang dibedakan sesuai size-nya."),(0,i.kt)("p",null,"Tipe data ini keyword-nya ditandai dengan huruf awalan ",(0,i.kt)("inlineCode",{parentName:"p"},"i"),", contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"i8"),", yang mana tipe ini adalah tipe data numerik integer dengan range value yang bisa ditampung adalah mulai dari angka ",(0,i.kt)("strong",{parentName:"p"},"\u2212128")," (didapat dari \u2212(2",(0,i.kt)("sup",null,"7"),") hingga ",(0,i.kt)("strong",{parentName:"p"},"127")," (didapat dari 2",(0,i.kt)("sup",null,"7"),"-1)."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numerik1 = 24;\nlet numerik2: i8 = 2;\nlet numerik3: i64 = 12;\n\nprintln!("{} | {} | {}", numerik1, numerik2, numerik3);\n// output ==> 24 | 2 | 12\n')),(0,i.kt)("p",null,"Dengan menggunakan teknik deklarasi ",(0,i.kt)("em",{parentName:"p"},"type inference"),", maka default angka numerik tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("p",null,"Range value pada tipe data itu cukup penting untuk diperhatikan, jika ada sebuah variabel yang tipe datanya pasti dan diisi dengan nilai di luar kapasitas yang bisa ditampung, maka akan muncul error. Contoh, tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i8"),", jika diisi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"128")," maka error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"data type error",src:t(4362).Z,width:"642",height:"488"})),(0,i.kt)("p",null,"Umumnya, tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," cukup digunakan untuk kebutuhan menampung nilai, namun sebenarnya ada banyak case lainnya di mana kita perlu tipe dengan size yang lebih besar seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"i64"),"."),(0,i.kt)("p",null,"Berikut merupakan list tipe data signed integers yang ada di Rust. Tidak perlu dihafal."),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Tipe data"),(0,i.kt)("th",{parentName:"tr",align:null},"Deskripsi"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i8")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"7"),") hingga (2",(0,i.kt)("sup",null,"7"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i16")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"15"),") hingga (2",(0,i.kt)("sup",null,"15"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i32")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"31"),") hingga (2",(0,i.kt)("sup",null,"31"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i64")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"63"),") hingga (2",(0,i.kt)("sup",null,"63"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"i128")),(0,i.kt)("td",{parentName:"tr",align:null},"\u2212(2",(0,i.kt)("sup",null,"127"),") hingga (2",(0,i.kt)("sup",null,"127"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"isize")),(0,i.kt)("td",{parentName:"tr",align:null},"tipe pointer")))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang tipe data ",(0,i.kt)("strong",{parentName:"p"},"pointer")," dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Bisa gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MAX")," untuk mengetahui nilai minimal dan juga maksimal tipe data signed integers."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let min_i8 = i8::MIN;\nlet max_i8 = i8::MAX;\n\nprintln!("{} | {}", min_i8, max_i8);\n// output ==> -128 | 127\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"i8::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"i8::MAX")," memiliki tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"::")," yang di Rust merupakan path separator. Untuk sekarang penulis anjurkan tidak terlalu pusing memahami apa itu path separator, karena nantinya akan ada pembahasan yang cukup detail khusus untuk mengupas topik tersebut.")),(0,i.kt)("h2",{id:"a52-unsigned-integers"},"A.5.2. Unsigned integers"),(0,i.kt)("p",null,"Perbedaan antara signed dan unsigned adalah pada range value yang ditampung, size-nya sama, hanya angka minimal dan maksimalnya berbeda."),(0,i.kt)("p",null,"Unsigned di sini maksudnya adalah hanya bisa menampung angka mulai dari 0. Tipe data unsigned tidak bisa menampung angka negatif (jika dipaksa akan memunculkan error)."),(0,i.kt)("p",null,"Berikut list tipe data unsigned integer pada Rust:"),(0,i.kt)("table",null,(0,i.kt)("thead",{parentName:"table"},(0,i.kt)("tr",{parentName:"thead"},(0,i.kt)("th",{parentName:"tr",align:null},"Tipe data"),(0,i.kt)("th",{parentName:"tr",align:null},"Deskripsi"))),(0,i.kt)("tbody",{parentName:"table"},(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u8")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"8"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u16")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"16"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u32")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"32"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u64")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"64"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"u128")),(0,i.kt)("td",{parentName:"tr",align:null},"0 hingga (2",(0,i.kt)("sup",null,"128"),")-1")),(0,i.kt)("tr",{parentName:"tbody"},(0,i.kt)("td",{parentName:"tr",align:null},(0,i.kt)("inlineCode",{parentName:"td"},"usize")),(0,i.kt)("td",{parentName:"tr",align:null},"tipe pointer")))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya tentang tipe data ",(0,i.kt)("strong",{parentName:"p"},"pointer")," dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Contoh penerapan unsigned integer:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let numerik4: u32 = 28;\nlet numerik5: u8 = 16;\nlet numerik6: u64 = 42;\n\nprintln!("{} | {} | {}", numerik4, numerik5, numerik6);\n// output ==> 28 | 16 | 42\n')),(0,i.kt)("p",null,"Bisa gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MAX")," untuk mengetahui nilai minimal dan juga maksimal tipe data unsigned integers."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let min_u8 = u8::MIN;\nlet max_u8 = u8::MAX;\n\nprintln!("{} | {}", min_u8, max_u8);\n// output ==> 0 | 255\n')),(0,i.kt)("p",null,"Catatan saja, variabel yang dideklarasikan dengan predefined value adalah numerik, by default tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," (signed)."),(0,i.kt)("h2",{id:"a53-floating-point"},"A.5.3. Floating point"),(0,i.kt)("p",null,"Floating point adalah tipe data yang mendukung nilai dibelakang koma, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"3.14"),". Di Rust ada dua tipe data floating point, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"f32")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),". Contoh penggunaan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let fp1: f32 = 3.14;\nlet fp2: f64 = 3.1415926535;\n\nprintln!("{} | {:.5}", fp1, fp2);\n// output ==> 3.14 | 3.14159\n')),(0,i.kt)("p",null,"O iya, jumlah digit di belakang koma bisa diatur saat diprint menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Caranya dengan menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"{:.n}"),". Sebagai contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"{:.5}")," maka akan menampilkan hanya 5 digit dibelakang koma."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Dalam penerapan definisi variabel sekaligus nilai, jika nilai dituliskan dalam desimal seperti contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"24"),", maka tipe data variabel penampung adalah numerik."),(0,i.kt)("p",{parentName:"blockquote"},"Jika dituliskan dalam notasi floating point, contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"3.14"),", maka tipe data variabel penampung adalah float.")),(0,i.kt)("p",null,"Bisa gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MIN")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"tipedata::MAX")," untuk mengetahui nilai minimal dan juga maksimal tipe data floating point."),(0,i.kt)("p",null,"Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let min_f32 = f32::MIN;\nlet max_f32 = f32::MAX;\n\nprintln!("min_f32={} | max_f32={}", min_f32, max_f32);\n// output ==> min_f32=-340282350000000000000000000000000000000 | max_f32=340282350000000000000000000000000000000\n')),(0,i.kt)("p",null,"Catatan saja, variabel yang dideklarasikan dengan predefined value numerik yang ada titiknya (",(0,i.kt)("inlineCode",{parentName:"p"},"3.10"),") adalah floating point, by default tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"f64"),"."),(0,i.kt)("h2",{id:"a54-bool"},"A.5.4. Bool"),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"bool")," menerima dua pilihan nilai saja, ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"false"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let b1 = true;\nlet b2 = false;\n\nprintln!("{} | {}", b1, b2);\n// output ==> true | false\n')),(0,i.kt)("h2",{id:"a55-char"},"A.5.5. Char"),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"char")," menampung sebuah data (unicode), contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"'n'"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"'-'"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"'2'"),". Penulisan literal untuk tipe ini menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"''"),", diapit tanda petik satu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let c1 = 'n';\nlet c2 = '-';\nlet c3 = '2';\n\nprintln!(\"{} | {} | {}\", c1, c2, c3);\n// output ==> n | - | 2\n")),(0,i.kt)("h2",{id:"a56-pointer-scalar"},"A.5.6. Pointer scalar"),(0,i.kt)("p",null,"Deklarasi tipe data pointer cukup mudah, yaitu dengan menuliskan deklarasinya seperti biasa tapi ditambahkan karakter ",(0,i.kt)("inlineCode",{parentName:"p"},"&"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let ptr1: &i32 = &24;\nprintln!("{}", ptr1);\n// output ==> 24\n')),(0,i.kt)("p",null,"Perihal apa itu tipe data pointer dan apa kegunaan prefix ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," akan dibahas pada chapter terpisah, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),"."),(0,i.kt)("h2",{id:"a57-tipe-data-primitive-compound"},"A.5.7. Tipe data primitive compound"),(0,i.kt)("p",null,"Selain beberapa tipe data yang sudah dibahas di atas, ada juga jenis tipe data primitif jenis lainnya, yaitu primitive compound yang di antaranya adalah ",(0,i.kt)("a",{parentName:"p",href:"/basic/array"},"Array")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/tuple"},"Tuple"),". Lebih detailnya mengenai tipe tersebut dibahas pada chapter terpisah."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tipe_data_primitive_scalar"},"github.com/novalagung/dasarpemrogramanrust-example/../tipe_data_primitive_scalar")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-string-literal"},"Tipe Data \u279c String Literal (&str)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/array"},"Array")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice"},"Slice (Basic)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tuple"},"Tuple")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/primitives.html"},"https://doc.rust-lang.org/rust-by-example/primitives.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/index.html#syntax"},"https://doc.rust-lang.org/std/fmt/index.html#syntax")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Integer_(computer_science)"},"https://en.wikipedia.org/wiki/Integer_(computer_science)"))))}m.isMDXComponent=!0},4362:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/tipe-data-primitive-scalar-1-7710e1ad76b0cc40fbae8a8d42ead294.png"}}]); \ No newline at end of file diff --git a/assets/js/bdfc7662.5ed547e8.js b/assets/js/bdfc7662.5ed547e8.js new file mode 100644 index 00000000..889c2c09 --- /dev/null +++ b/assets/js/bdfc7662.5ed547e8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7720],{3905:(e,a,n)=>{n.d(a,{Zo:()=>d,kt:()=>c});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function r(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var u=t.createContext({}),m=function(e){var a=t.useContext(u),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},d=function(e){var a=m(e.components);return t.createElement(u.Provider,{value:a},e.children)},s={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},p=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,r=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=m(n),c=i,g=p["".concat(u,".").concat(c)]||p[c]||s[c]||r;return n?t.createElement(g,l(l({ref:a},d),{},{components:n})):t.createElement(g,l({ref:a},d))}));function c(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=p;var o={};for(var u in a)hasOwnProperty.call(a,u)&&(o[u]=a[u]);o.originalType=e,o.mdxType="string"==typeof e?e:i,l[1]=o;for(var m=2;m{n.r(a),n.d(a,{assets:()=>u,contentTitle:()=>l,default:()=>s,frontMatter:()=>r,metadata:()=>o,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:24,title:"A.24. Associated Function",sidebar_label:"A.24. Associated Function"},l=void 0,o={unversionedId:"basic/associated-function",id:"basic/associated-function",title:"A.24. Associated Function",description:"Chapter ini membahas tentang associated function. Kita akan belajar apa itu associated function dan apa perbedannya dengan fungsi biasa.",source:"@site/docs/basic/associated-function.md",sourceDirName:"basic",slug:"/basic/associated-function",permalink:"/basic/associated-function",draft:!1,tags:[],version:"current",sidebarPosition:24,frontMatter:{sidebar_position:24,title:"A.24. Associated Function",sidebar_label:"A.24. Associated Function"},sidebar:"tutorialSidebar",previous:{title:"A.23. Struct",permalink:"/basic/struct"},next:{title:"A.25. Method",permalink:"/basic/method"}},u={},m=[{value:"A.24.1. Associated item & associated function",id:"a241-associated-item--associated-function",level:2},{value:"A.24.2. Keyword impl",id:"a242-keyword-impl",level:2},{value:"\u25c9 Fungsi LegoSet::new",id:"-fungsi-legosetnew",level:3},{value:"\u25c9 Naming convention associated function",id:"-naming-convention-associated-function",level:3},{value:"A.24.3. Tipe data Self",id:"a243-tipe-data-self",level:2},{value:"A.24.4. Associated function dalam module",id:"a244-associated-function-dalam-module",level:2},{value:"A.24.5. Tuple struct associated function",id:"a245-tuple-struct-associated-function",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function s(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,t.Z)({},d,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang ",(0,i.kt)("em",{parentName:"p"},"associated function"),". Kita akan belajar apa itu associated function dan apa perbedannya dengan fungsi biasa."),(0,i.kt)("h2",{id:"a241-associated-item--associated-function"},"A.24.1. ",(0,i.kt)("em",{parentName:"h2"},"Associated item")," & ",(0,i.kt)("em",{parentName:"h2"},"associated function")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Associated item")," adalah item yang memiliki asosiasi/hubungan dengan struct atau trait. Item di sini bisa dalam banyak hal, bisa berupa fungsi atau lainnya."),(0,i.kt)("p",null,"Fungsi yang terhubung dengan suatu struct atau trait disebut dengan ",(0,i.kt)("em",{parentName:"p"},"associated function"),". Fungsi jenis ini ekuivalen seperti fungsi biasa, perbedaannya adalah pada deklarasinya yang harus berada di dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"),", dan pemanggilannya harus menggunakan notasi path ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaStruct::nama_fungsi"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai trait dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai macam-macam item dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/path-item#a183-rust-items"},"Path & Item")))),(0,i.kt)("p",null,"Ok, mari kita lanjut ke bagian praktik. Silakan tulis kode berikut terlebih dahulu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct LegoSet {\n code: i32,\n name: String,\n category: String,\n age_minimum: i32,\n}\n\nfn main() {\n let rough_terrain_crane = LegoSet{\n code: 42082,\n name: String::from("Rough Terrain Crane"),\n category: String::from("Technic"),\n age_minimum: 11,\n };\n\n println!("{:#?}", rough_terrain_crane);\n}\n')),(0,i.kt)("p",null,"Sebuah struct bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," didefinisikan memiliki 4 buah property. Di blok kode fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", dibuat sebuah variabel bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"rough_terrain_crane")," yang merupakan object/instance dari struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),", kemudian object tersebut di-print."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Object struct bisa di-print menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," karena pada definisi struct ditambahkan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai attribute dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/attributes"},"Attributes"),".")),(0,i.kt)("p",null,"Selanjutnya kita siapkan dua buah fungsi yang berasosiasi dengan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("h2",{id:"a242-keyword-impl"},"A.24.2. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"impl")),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," digunakan untuk membuat ",(0,i.kt)("em",{parentName:"p"},"associated item"),"."),(0,i.kt)("p",null,"Pada konteks ini keyword tersebut digunakan untuk membuat ",(0,i.kt)("em",{parentName:"p"},"associated function")," untuk struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),", sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," dengan tugas adalah untuk membantu pembuatan object ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("p",null,"Silakan tambahkan blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," berikut setelah definisi struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(Debug)]\nstruct LegoSet {\n code: i32,\n name: String,\n category: String,\n age_minimum: i32,\n}\n\nimpl LegoSet {\n\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("p",null,"Notasi penulisan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," bisa dilihat pada contoh di atas, cukup tulis saja keyword tersebut diikuti nama struct yang diinginkan, kemudian diikuti dengan blok kode berisi definisi fungsi."),(0,i.kt)("p",null,"Fungsi dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," adalah yang disebut dengan ",(0,i.kt)("em",{parentName:"p"},"associated function"),". Pada contoh di atas, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," memiliki asosiasi dengan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("p",null,"Lanjut, panggil fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," tersebut untuk membuat object baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"xtreme_offroader")," lalu print isinya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let rough_terrain_crane = LegoSet{\n code: 42082,\n name: String::from("Rough Terrain Crane"),\n category: String::from("Technic"),\n age_minimum: 11,\n };\n println!("{:#?}", rough_terrain_crane);\n \n let xtreme_offroader = LegoSet::new(\n 42099, \n String::from("4X4 X-treme Off-Roader"), \n String::from("Technic"), \n 11,\n );\n println!("{:#?}", xtreme_offroader);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(8317).Z,width:"447",height:"276"})),(0,i.kt)("p",null,"Bisa dilihat pada blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", cara pemanggilan associated function adalah dengan menuliskan nama struct diikuti nama fungsi dengan notasi penulisan path."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"NamaStruct::nama_fungsi();\nNamaStruct::nama_fungsi(arg1, arg2, arg3, arg4);\nLegoSet::new(arg1, arg2, arg3, arg4);\n")),(0,i.kt)("p",null,"Jadi seperti itu, semoga cukup jelas. Silakan berkreasi dengan menambahkan ",(0,i.kt)("em",{parentName:"p"},"associated function")," lainnya agar makin terbiasa. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'impl LegoSet {\n\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n }\n\n fn what_is_lego() {\n println!("Lego is a line of plastic construction toys")\n }\n}\n\nfn main() {\n LegoSet::what_is_lego();\n\n let xtreme_offroader = LegoSet::new(\n 42099, \n String::from("4X4 X-treme Off-Roader"), \n String::from("Technic"), \n 11,\n );\n println!("{:#?}", xtreme_offroader);\n}\n')),(0,i.kt)("h3",{id:"-fungsi-legosetnew"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"LegoSet::new")),(0,i.kt)("p",null,"O iya, sedikit tambahan info saja, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," di-atas didefinisikan menggunakan metode ",(0,i.kt)("a",{parentName:"p",href:"/basic/struct#-field-init-shorthand"},"field init shorthand"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n}\n\n// ... adalah ekuivalen dengan ...\n\nfn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet {\n code: code,\n name: name,\n category: category,\n age_minimum: age_minimum\n }\n}\n")),(0,i.kt)("h3",{id:"-naming-convention-associated-function"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Naming convention")," associated function"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", snake case digunakan dalam penamaan associated function. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl NamaStruct {\n\n fn nama_associated_func() {\n // ...\n }\n}\n")),(0,i.kt)("h2",{id:"a243-tipe-data-self"},"A.24.3. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Self")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Self")," (perhatikan huruf ",(0,i.kt)("inlineCode",{parentName:"p"},"S"),"-nya adalah kapital) merupakan representasi untuk tipe data struct atau trait di mana blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," dideklarasikan."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Self")," hanya bisa digunakan dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"))),(0,i.kt)("p",null,"Sebagai contoh, pada kode yang sudah dipraktikkan, keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," diterapkan dalam pembuatan ",(0,i.kt)("em",{parentName:"p"},"associated items")," untuk struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),". Dalam blok kode tersebut, tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," bisa diganti dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"Self"),"."),(0,i.kt)("p",null,"Silakan lihat contoh di bawah ini, ada 4 buah cara deklarasi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," yang kesemuanya adalah ekuivalen."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n Self { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> Self {\n LegoSet { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> Self {\n Self { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("h2",{id:"a244-associated-function-dalam-module"},"A.24.4. Associated function dalam module"),(0,i.kt)("p",null,"Struct adalah salah satu dari beberapa item yang ada di Rust. Struct bisa saja berada dalam sebuah module, baik inline maupun ",(0,i.kt)("em",{parentName:"p"},"normal")," module."),(0,i.kt)("p",null,"Sekarang, kode yang sudah dipraktikkan di atas akan kita refactor. Struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," beserta associated items-nya dipindah ke module file bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"lego"),", dengan itu maka pemanggilan struct tersebut harus menggunakan path ",(0,i.kt)("inlineCode",{parentName:"p"},"lego::LegoSet"),"."),(0,i.kt)("p",null,"Kurang lebih struktur package mendi seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 lego.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(6314).Z,width:"918",height:"814"})),(0,i.kt)("p",null,"Ada yang aneh, padahal pemanggilan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," sudah diganti menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"lego::LegoSet"),", tapi kenapa ada error di kode? Silakan ",(0,i.kt)("em",{parentName:"p"},"hover")," baris kode yang ada highlight merah, atau jalankan saja program untuk melihat detail errornya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(8820).Z,width:"481",height:"216"})),(0,i.kt)("p",null,"Error muncul karena struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," adalah private. Solusinya cukup tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," dalam definisi struct beserta ",(0,i.kt)("em",{parentName:"p"},"associated function"),"-nya."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Untuk blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," tidak perlu ditambahi keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub"))),(0,i.kt)("p",null,"Ok, setelah update diaplikasikan, coba lihat lagi. Sekarang error-nya berubah, bagian baris pengisian property struct yang jadi error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(2039).Z,width:"741",height:"798"})),(0,i.kt)("p",null,"Error ini terjadi karena property dari struct terdeteksi sebagai ",(0,i.kt)("strong",{parentName:"p"},"private"),". Solusi yang bisa dipergunakan ada 2:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Tambahkan saja keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada definisi property struct."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/lego.rs"',title:'"src/lego.rs"'},"pub struct LegoSet {\n pub code: i32,\n pub name: String,\n pub category: String,\n pub age_minimum: i32,\n}\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Atau, tetap biarkan property struct sebagai ",(0,i.kt)("strong",{parentName:"p"},"private"),", namun pada semua statement pembuatan object menggunakan tipe tersebut harus selalu dilakukan via ",(0,i.kt)("inlineCode",{parentName:"p"},"lego::LegoSet::new()"),"."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'let object = lego::LegoSet::new(\n 42099, \n String::from("4X4 X-treme Off-Roader"), \n String::from("Technic"), \n 11,\n);\n')))),(0,i.kt)("p",null,"Opsi mana yang paling pas? Pertanyaan ini jawabannya adalah tergantung kebutuhan dan ",(0,i.kt)("em",{parentName:"p"},"case"),". Jika memang property struct di-desain agar private (tidak perlu diakses secara publik), maka gunakan saja associated function dalam pembuatan object-nya."),(0,i.kt)("p",null,"Namun jika memang ada kebutuhan salah satu property atau kesemuanya harus bisa diakses secara publik, maka tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," sesuai kebutuhan."),(0,i.kt)("h2",{id:"a245-tuple-struct-associated-function"},"A.24.5. Tuple struct associated function"),(0,i.kt)("p",null,"Sama seperti struct, tuple struct juga bisa memiliki ",(0,i.kt)("em",{parentName:"p"},"associated items"),". Cara deklarasi dan pemanggilan item-nya juga sama."),(0,i.kt)("p",null,"Pada contoh berikut, tuple struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Color")," memiliki 3 buah associated functions, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"red"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"green"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"blue"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 model.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/model.rs"',title:'"src/model.rs"'},"#[derive(Debug)]\npub struct Color(i32, i32, i32);\n\nimpl Color {\n\n pub fn red() -> Self {\n Self(255, 0, 0)\n }\n\n pub fn green() -> Self {\n Self(0, 255, 0)\n }\n\n pub fn blue() -> Self {\n Self(0, 0, 255)\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod model;\n\nfn main() {\n let red = model::Color::red();\n let green = model::Color::green();\n let blue = model::Color::blue();\n\n println!("{:#?} {:#?} {:#?}", red, green, blue);\n \n let random_color = model::Color(12, 25, 47);\n println!("{:#?} ", random_color);\n}\n')),(0,i.kt)("p",null,"Hmm, ada yang aneh, karena suatu alasan statement ",(0,i.kt)("inlineCode",{parentName:"p"},"model::Color")," dianggap error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(6605).Z,width:"662",height:"244"})),(0,i.kt)("p",null,"Error ini sebenarnya mirip dengan error praktik sebelumnya, ketika mencoba membuat object baru dari struct sedangkan property struct tersebut adalah private."),(0,i.kt)("p",null,"Pada kasus struct, solusinya cukup dengan tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," atau siapkan ",(0,i.kt)("em",{parentName:"p"},"associated function")," untuk pembuatan object. Pada tuple struct, solusinya juga mirip, ada dua opsi yang bisa dipilih."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Tambahkan saja keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada definisi parameter tuple struct."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/model.rs"',title:'"src/model.rs"'},"// before\npub struct Color(i32, i32, i32);\n\n// after\npub struct Color(pub i32, pub i32, pub i32);\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Atau, tetap biarkan parameter tuple struct sebagai ",(0,i.kt)("strong",{parentName:"p"},"private"),", namun siapkan ",(0,i.kt)("em",{parentName:"p"},"associated function")," baru untuk pembuatan object struct tuple, seperti ini:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/model.rs"',title:'"src/model.rs"'},"// ...\n\nimpl Color {\n pub fn new(r: i32, g: i32, b: i32) -> Self {\n Self(r, g, b)\n }\n\n // ...\n}\n")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'fn main() {\n // ...\n\n let random_color = model::Color::new(12, 25, 47);\n println!("{:#?} ", random_color);\n}\n')))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai visibility property dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/associated_function"},"github.com/novalagung/dasarpemrogramanrust-example/../associated_function")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/method"},"Method")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-03-method-syntax.html"},"https://doc.rust-lang.org/book/ch05-03-method-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.impl.html"},"https://doc.rust-lang.org/std/keyword.impl.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.SelfTy.html"},"https://doc.rust-lang.org/std/keyword.SelfTy.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/fn/methods.html"},"https://doc.rust-lang.org/rust-by-example/fn/methods.html"))))}s.isMDXComponent=!0},8317:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAEUCAIAAAA0qq8IAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjhUMTc6MDQ6MzkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDE0OjMxOjIzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDE0OjMxOjIzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMyOGRkOTA5LWFiOGItMzk0YS04ODM3LWE3NzJiOWZkMWY4NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyZGE5YTk3MC05NzlhLTcyNGUtYWE2OS0yMDk3YTQwMTQ4NzkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyZGE5YTk3MC05NzlhLTcyNGUtYWE2OS0yMDk3YTQwMTQ4NzkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjFiOGM0NzBjLTc0NDAtNzc0OS1iZjRhLTc2YzUwNjg2NzQwNzwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJkYTlhOTcwLTk3OWEtNzI0ZS1hYTY5LTIwOTdhNDAxNDg3OSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yOFQxNzowNDozOSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjMjhkZDkwOS1hYjhiLTM5NGEtODgzNy1hNzcyYjlmZDFmODciIHN0RXZ0OndoZW49IjIwMjItMTAtMjlUMTQ6MzE6MjMrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7vRm9uAAAaHUlEQVR42u2du47cyBWG9SSjdebYgGEsPN5U2cqJAwXaTHAqGBCwWT/IPMI8hfJ5KE9381J16j914aWbTX4fFtAOh81Lkf3NqSL588MT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"},6314:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/associated-function-2-a72ff54955e3f2afff46536bcf659087.png"},8820:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeEAAADYCAIAAABTKsyIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjhUMTg6MzM6MjMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDE0OjI4OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDE0OjI4OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdmYjVjZmY2LWE4NzAt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"},2039:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/associated-function-4-91b4741ed57bb3ce42997c90f9c0c58e.png"},6605:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/associated-function-5-cb72a7e4944bd7b12502c0dc6e7acd7a.png"}}]); \ No newline at end of file diff --git a/assets/js/bdfc7662.e5ac5751.js b/assets/js/bdfc7662.e5ac5751.js deleted file mode 100644 index 96112c15..00000000 --- a/assets/js/bdfc7662.e5ac5751.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7720],{3905:(e,a,n)=>{n.d(a,{Zo:()=>d,kt:()=>c});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function r(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function l(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var u=t.createContext({}),m=function(e){var a=t.useContext(u),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},d=function(e){var a=m(e.components);return t.createElement(u.Provider,{value:a},e.children)},s={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},p=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,r=e.originalType,u=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=m(n),c=i,g=p["".concat(u,".").concat(c)]||p[c]||s[c]||r;return n?t.createElement(g,l(l({ref:a},d),{},{components:n})):t.createElement(g,l({ref:a},d))}));function c(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=n.length,l=new Array(r);l[0]=p;var o={};for(var u in a)hasOwnProperty.call(a,u)&&(o[u]=a[u]);o.originalType=e,o.mdxType="string"==typeof e?e:i,l[1]=o;for(var m=2;m{n.r(a),n.d(a,{assets:()=>u,contentTitle:()=>l,default:()=>s,frontMatter:()=>r,metadata:()=>o,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:24,title:"A.24. Associated Function",sidebar_label:"A.24. Associated Function"},l=void 0,o={unversionedId:"basic/associated-function",id:"basic/associated-function",title:"A.24. Associated Function",description:"Chapter ini membahas tentang associated function. Kita akan belajar apa itu associated function dan apa perbedannya dengan fungsi biasa.",source:"@site/docs/basic/associated-function.md",sourceDirName:"basic",slug:"/basic/associated-function",permalink:"/basic/associated-function",draft:!1,tags:[],version:"current",sidebarPosition:24,frontMatter:{sidebar_position:24,title:"A.24. Associated Function",sidebar_label:"A.24. Associated Function"},sidebar:"tutorialSidebar",previous:{title:"A.23. Struct",permalink:"/basic/struct"},next:{title:"A.25. Method",permalink:"/basic/method"}},u={},m=[{value:"A.24.1. Associated item & associated function",id:"a241-associated-item--associated-function",level:2},{value:"A.24.2. Keyword impl",id:"a242-keyword-impl",level:2},{value:"\u25c9 Fungsi LegoSet::new",id:"-fungsi-legosetnew",level:3},{value:"\u25c9 Naming convention associated function",id:"-naming-convention-associated-function",level:3},{value:"A.24.3. Tipe data Self",id:"a243-tipe-data-self",level:2},{value:"A.24.4. Associated function dalam module",id:"a244-associated-function-dalam-module",level:2},{value:"A.24.5. Tuple struct associated function",id:"a245-tuple-struct-associated-function",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function s(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,t.Z)({},d,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang ",(0,i.kt)("em",{parentName:"p"},"associated function"),". Kita akan belajar apa itu associated function dan apa perbedannya dengan fungsi biasa."),(0,i.kt)("h2",{id:"a241-associated-item--associated-function"},"A.24.1. ",(0,i.kt)("em",{parentName:"h2"},"Associated item")," & ",(0,i.kt)("em",{parentName:"h2"},"associated function")),(0,i.kt)("p",null,(0,i.kt)("em",{parentName:"p"},"Associated item")," adalah item yang memiliki asosiasi/hubungan dengan struct atau trait. Item di sini bisa dalam banyak hal, bisa berupa fungsi atau lainnya."),(0,i.kt)("p",null,"Fungsi yang terhubung dengan suatu struct atau trait disebut dengan ",(0,i.kt)("em",{parentName:"p"},"associated function"),". Fungsi jenis ini ekuivalen seperti fungsi biasa, perbedaannya adalah pada deklarasinya yang harus berada di dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"),", dan pemanggilannya harus menggunakan notasi path ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaStruct::nama_fungsi"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai trait dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai macam-macam item dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/path-item#a183-rust-items"},"Path & Item")))),(0,i.kt)("p",null,"Ok, mari kita lanjut ke bagian praktik. Silakan tulis kode berikut terlebih dahulu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'#[derive(Debug)]\nstruct LegoSet {\n code: i32,\n name: String,\n category: String,\n age_minimum: i32,\n}\n\nfn main() {\n let rough_terrain_crane = LegoSet{\n code: 42082,\n name: String::from("Rough Terrain Crane"),\n category: String::from("Technic"),\n age_minimum: 11,\n };\n\n println!("{:#?}", rough_terrain_crane);\n}\n')),(0,i.kt)("p",null,"Sebuah struct bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," didefinisikan memiliki 4 buah property. Di blok kode fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", dibuat sebuah variabel bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"rough_terrain_crane")," yang merupakan object/instance dari struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),", kemudian object tersebut di-print."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Object struct bisa di-print menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," karena pada definisi struct ditambahkan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai attribute dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/attributes"},"Attributes"),".")),(0,i.kt)("p",null,"Selanjutnya kita siapkan dua buah fungsi yang berasosiasi dengan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("h2",{id:"a242-keyword-impl"},"A.24.2. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"impl")),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," digunakan untuk membuat ",(0,i.kt)("em",{parentName:"p"},"associated item"),"."),(0,i.kt)("p",null,"Pada konteks ini keyword tersebut digunakan untuk membuat ",(0,i.kt)("em",{parentName:"p"},"associated function")," untuk struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),", sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," dengan tugas adalah untuk membantu pembuatan object ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("p",null,"Silakan tambahkan blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," berikut setelah definisi struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"#[derive(Debug)]\nstruct LegoSet {\n code: i32,\n name: String,\n category: String,\n age_minimum: i32,\n}\n\nimpl LegoSet {\n\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("p",null,"Notasi penulisan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," bisa dilihat pada contoh di atas, cukup tulis saja keyword tersebut diikuti nama struct yang diinginkan, kemudian diikuti dengan blok kode berisi definisi fungsi."),(0,i.kt)("p",null,"Fungsi dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," adalah yang disebut dengan ",(0,i.kt)("em",{parentName:"p"},"associated function"),". Pada contoh di atas, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," memiliki asosiasi dengan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),"."),(0,i.kt)("p",null,"Lanjut, panggil fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," tersebut untuk membuat object baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"xtreme_offroader")," lalu print isinya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let rough_terrain_crane = LegoSet{\n code: 42082,\n name: String::from("Rough Terrain Crane"),\n category: String::from("Technic"),\n age_minimum: 11,\n };\n println!("{:#?}", rough_terrain_crane);\n \n let xtreme_offroader = LegoSet::new(\n 42099, \n String::from("4X4 X-treme Off-Roader"), \n String::from("Technic"), \n 11,\n );\n println!("{:#?}", xtreme_offroader);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(8317).Z,width:"447",height:"276"})),(0,i.kt)("p",null,"Bisa dilihat pada blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", cara pemanggilan associated function adalah dengan menuliskan nama struct diikuti nama fungsi dengan notasi penulisan path."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"NamaStruct::nama_fungsi();\nNamaStruct::nama_fungsi(arg1, arg2, arg3, arg4);\nLegoSet::new(arg1, arg2, arg3, arg4);\n")),(0,i.kt)("p",null,"Jadi seperti itu, semoga cukup jelas. Silakan berkreasi dengan menambahkan ",(0,i.kt)("em",{parentName:"p"},"associated function")," lainnya agar makin terbiasa. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'impl LegoSet {\n\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n }\n\n fn what_is_lego() {\n println!("Lego is a line of plastic construction toys")\n }\n}\n\nfn main() {\n LegoSet::what_is_lego();\n\n let xtreme_offroader = LegoSet::new(\n 42099, \n String::from("4X4 X-treme Off-Roader"), \n String::from("Technic"), \n 11,\n );\n println!("{:#?}", xtreme_offroader);\n}\n')),(0,i.kt)("h3",{id:"-fungsi-legosetnew"},"\u25c9 Fungsi ",(0,i.kt)("inlineCode",{parentName:"h3"},"LegoSet::new")),(0,i.kt)("p",null,"O iya, sedikit tambahan info saja, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," di-atas didefinisikan menggunakan metode ",(0,i.kt)("a",{parentName:"p",href:"/basic/struct#-field-init-shorthand"},"field init shorthand"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n}\n\n// ... adalah ekuivalen dengan ...\n\nfn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet {\n code: code,\n name: name,\n category: category,\n age_minimum: age_minimum\n }\n}\n")),(0,i.kt)("h3",{id:"-naming-convention-associated-function"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Naming convention")," associated function"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", snake case digunakan dalam penamaan associated function. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl NamaStruct {\n\n fn nama_associated_func() {\n // ...\n }\n}\n")),(0,i.kt)("h2",{id:"a243-tipe-data-self"},"A.24.3. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Self")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Self")," (perhatikan huruf ",(0,i.kt)("inlineCode",{parentName:"p"},"S"),"-nya adalah kapital) merupakan representasi untuk tipe data struct atau trait dimana blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," dideklarasikan."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Self")," hanya bisa digunakan dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"))),(0,i.kt)("p",null,"Sebagai contoh, pada kode yang sudah dipraktikkan, keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," diterapkan dalam pembuatan ",(0,i.kt)("em",{parentName:"p"},"associated items")," untuk struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet"),". Dalam blok kode tersebut, tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," bisa diganti dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"Self"),"."),(0,i.kt)("p",null,"Silakan lihat contoh dibawah ini, ada 4 buah cara deklarasi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"new")," yang kesemuanya adalah ekuivalen."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n LegoSet { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> LegoSet {\n Self { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> Self {\n LegoSet { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl LegoSet {\n fn new(code: i32, name: String, category: String, age_minimum: i32) -> Self {\n Self { code, name, category, age_minimum }\n }\n}\n")),(0,i.kt)("h2",{id:"a244-associated-function-dalam-module"},"A.24.4. Associated function dalam module"),(0,i.kt)("p",null,"Struct adalah salah satu dari beberapa item yang ada di Rust. Struct bisa saja berada dalam sebuah module, baik inline maupun ",(0,i.kt)("em",{parentName:"p"},"normal")," module."),(0,i.kt)("p",null,"Sekarang, kode yang sudah dipraktikkan di atas akan kita refactor. Struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," beserta associated items-nya dipindah ke module file bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"lego"),", dengan itu maka pemanggilan struct tersebut harus menggunakan path ",(0,i.kt)("inlineCode",{parentName:"p"},"lego::LegoSet"),"."),(0,i.kt)("p",null,"Kurang lebih struktur package mendi seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 lego.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(6314).Z,width:"918",height:"814"})),(0,i.kt)("p",null,"Ada yang aneh, padahal pemanggilan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," sudah diganti menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"lego::LegoSet"),", tapi kenapa ada error di kode? Silakan ",(0,i.kt)("em",{parentName:"p"},"hover")," baris kode yang ada highlight merah, atau jalankan saja program untuk melihat detail errornya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(8820).Z,width:"481",height:"216"})),(0,i.kt)("p",null,"Error muncul karena struct ",(0,i.kt)("inlineCode",{parentName:"p"},"LegoSet")," adalah private. Solusinya cukup tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," dalam definisi struct beserta ",(0,i.kt)("em",{parentName:"p"},"associated function"),"-nya."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Untuk blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," tidak perlu ditambahi keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub"))),(0,i.kt)("p",null,"Ok, setelah update diaplikasikan, coba lihat lagi. Sekarang error-nya berubah, bagian baris pengisian property struct yang jadi error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(2039).Z,width:"741",height:"798"})),(0,i.kt)("p",null,"Error ini terjadi karena property dari struct terdeteksi sebagai ",(0,i.kt)("strong",{parentName:"p"},"private"),". Solusi yang bisa dipergunakan ada 2:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Tambahkan saja keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada definisi property struct."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/lego.rs"',title:'"src/lego.rs"'},"pub struct LegoSet {\n pub code: i32,\n pub name: String,\n pub category: String,\n pub age_minimum: i32,\n}\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Atau, tetap biarkan property struct sebagai ",(0,i.kt)("strong",{parentName:"p"},"private"),", namun pada semua statement pembuatan object menggunakan tipe tersebut harus selalu dilakukan via ",(0,i.kt)("inlineCode",{parentName:"p"},"lego::LegoSet::new()"),"."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'let object = lego::LegoSet::new(\n 42099, \n String::from("4X4 X-treme Off-Roader"), \n String::from("Technic"), \n 11,\n);\n')))),(0,i.kt)("p",null,"Opsi mana yang paling pas? Pertanyaan ini jawabannya adalah tergantung kebutuhan dan ",(0,i.kt)("em",{parentName:"p"},"case"),". Jika memang property struct di-desain agar private (tidak perlu diakses secara publik), maka gunakan saja associated function dalam pembuatan object-nya."),(0,i.kt)("p",null,"Namun jika memang ada kebutuhan salah satu property atau kesemuanya harus bisa diakses secara publik, maka tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," sesuai kebutuhan."),(0,i.kt)("h2",{id:"a245-tuple-struct-associated-function"},"A.24.5. Tuple struct associated function"),(0,i.kt)("p",null,"Sama seperti struct, tuple struct juga bisa memiliki ",(0,i.kt)("em",{parentName:"p"},"associated items"),". Cara deklarasi dan pemanggilan item-nya juga sama."),(0,i.kt)("p",null,"Pada contoh berikut, tuple struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Color")," memiliki 3 buah associated functions, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"red"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"green"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"blue"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 model.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/model.rs"',title:'"src/model.rs"'},"#[derive(Debug)]\npub struct Color(i32, i32, i32);\n\nimpl Color {\n\n pub fn red() -> Self {\n Self(255, 0, 0)\n }\n\n pub fn green() -> Self {\n Self(0, 255, 0)\n }\n\n pub fn blue() -> Self {\n Self(0, 0, 255)\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod model;\n\nfn main() {\n let red = model::Color::red();\n let green = model::Color::green();\n let blue = model::Color::blue();\n\n println!("{:#?} {:#?} {:#?}", red, green, blue);\n \n let random_color = model::Color(12, 25, 47);\n println!("{:#?} ", random_color);\n}\n')),(0,i.kt)("p",null,"Hmm, ada yang aneh, karena suatu alasan statement ",(0,i.kt)("inlineCode",{parentName:"p"},"model::Color")," dianggap error."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Associated function",src:n(6605).Z,width:"662",height:"244"})),(0,i.kt)("p",null,"Error ini sebenarnya mirip dengan error praktik sebelumnya, ketika mencoba membuat object baru dari struct sedangkan property struct tersebut adalah private."),(0,i.kt)("p",null,"Pada kasus struct, solusinya cukup dengan tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," atau siapkan ",(0,i.kt)("em",{parentName:"p"},"associated function")," untuk pembuatan object. Pada tuple struct, solusinya juga mirip, ada dua opsi yang bisa dipilih."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Tambahkan saja keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub")," pada definisi parameter tuple struct."),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/model.rs"',title:'"src/model.rs"'},"// before\npub struct Color(i32, i32, i32);\n\n// after\npub struct Color(pub i32, pub i32, pub i32);\n"))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Atau, tetap biarkan parameter tuple struct sebagai ",(0,i.kt)("strong",{parentName:"p"},"private"),", namun siapkan ",(0,i.kt)("em",{parentName:"p"},"associated function")," baru untuk pembuatan object struct tuple, seperti ini:"),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/model.rs"',title:'"src/model.rs"'},"// ...\n\nimpl Color {\n pub fn new(r: i32, g: i32, b: i32) -> Self {\n Self(r, g, b)\n }\n\n // ...\n}\n")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'fn main() {\n // ...\n\n let random_color = model::Color::new(12, 25, 47);\n println!("{:#?} ", random_color);\n}\n')))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai visibility property dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/associated_function"},"github.com/novalagung/dasarpemrogramanrust-example/../associated_function")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/method"},"Method")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/visibility-privacy"},"Module System \u279c Visibility & Privacy"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch05-03-method-syntax.html"},"https://doc.rust-lang.org/book/ch05-03-method-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.impl.html"},"https://doc.rust-lang.org/std/keyword.impl.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.SelfTy.html"},"https://doc.rust-lang.org/std/keyword.SelfTy.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/fn/methods.html"},"https://doc.rust-lang.org/rust-by-example/fn/methods.html"))))}s.isMDXComponent=!0},8317:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAEUCAIAAAA0qq8IAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjhUMTc6MDQ6MzkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDE0OjMxOjIzKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDE0OjMxOjIzKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMyOGRkOTA5LWFiOGItMzk0YS04ODM3LWE3NzJiOWZkMWY4NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyZGE5YTk3MC05NzlhLTcyNGUtYWE2OS0yMDk3YTQwMTQ4NzkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyZGE5YTk3MC05NzlhLTcyNGUtYWE2OS0yMDk3YTQwMTQ4NzkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjFiOGM0NzBjLTc0NDAtNzc0OS1iZjRhLTc2YzUwNjg2NzQwNzwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJkYTlhOTcwLTk3OWEtNzI0ZS1hYTY5LTIwOTdhNDAxNDg3OSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yOFQxNzowNDozOSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpjMjhkZDkwOS1hYjhiLTM5NGEtODgzNy1hNzcyYjlmZDFmODciIHN0RXZ0OndoZW49IjIwMjItMTAtMjlUMTQ6MzE6MjMrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7vRm9uAAAaHUlEQVR42u2du47cyBWG9SSjdebYgGEsPN5U2cqJAwXaTHAqGBCwWT/IPMI8hfJ5KE9381J16j914aWbTX4fFtAOh81Lkf3NqSL588MT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"},6314:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/associated-function-2-a72ff54955e3f2afff46536bcf659087.png"},8820:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeEAAADYCAIAAABTKsyIAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjhUMTg6MzM6MjMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTI5VDE0OjI4OjI1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTI5VDE0OjI4OjI1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjdmYjVjZmY2LWE4NzAt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"},2039:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/associated-function-4-91b4741ed57bb3ce42997c90f9c0c58e.png"},6605:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/associated-function-5-cb72a7e4944bd7b12502c0dc6e7acd7a.png"}}]); \ No newline at end of file diff --git a/assets/js/be3f5c40.3675591d.js b/assets/js/be3f5c40.3675591d.js new file mode 100644 index 00000000..bfb38427 --- /dev/null +++ b/assets/js/be3f5c40.3675591d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[5572],{3905:(e,a,n)=>{n.d(a,{Zo:()=>o,kt:()=>c});var t=n(7294);function l(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function i(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function d(e){for(var a=1;a=0||(l[n]=e[n]);return l}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var r=t.createContext({}),u=function(e){var a=t.useContext(r),n=a;return e&&(n="function"==typeof e?e(a):d(d({},a),e)),n},o=function(e){var a=u(e.components);return t.createElement(r.Provider,{value:a},e.children)},p={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},s=t.forwardRef((function(e,a){var n=e.components,l=e.mdxType,i=e.originalType,r=e.parentName,o=m(e,["components","mdxType","originalType","parentName"]),s=u(n),c=l,k=s["".concat(r,".").concat(c)]||s[c]||p[c]||i;return n?t.createElement(k,d(d({ref:a},o),{},{components:n})):t.createElement(k,d({ref:a},o))}));function c(e,a){var n=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var i=n.length,d=new Array(i);d[0]=s;var m={};for(var r in a)hasOwnProperty.call(a,r)&&(m[r]=a[r]);m.originalType=e,m.mdxType="string"==typeof e?e:l,d[1]=m;for(var u=2;u{n.r(a),n.d(a,{assets:()=>r,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>m,toc:()=>u});var t=n(7462),l=(n(7294),n(3905));const i={sidebar_position:22,title:"A.22. Module System \u279c Scope & Akses Item",sidebar_label:"A.22. Module System \u279c Scope & Akses Item"},d=void 0,m={unversionedId:"basic/module-scope-item-access",id:"basic/module-scope-item-access",title:"A.22. Module System \u279c Scope & Akses Item",description:"Pembahasan chapter ini masih dalam lingkup module system, yaitu tentang scope dan pengakesan module item.",source:"@site/docs/basic/module-scope-item-access.md",sourceDirName:"basic",slug:"/basic/module-scope-item-access",permalink:"/basic/module-scope-item-access",draft:!1,tags:[],version:"current",sidebarPosition:22,frontMatter:{sidebar_position:22,title:"A.22. Module System \u279c Scope & Akses Item",sidebar_label:"A.22. Module System \u279c Scope & Akses Item"},sidebar:"tutorialSidebar",previous:{title:"A.21. Module System \u279c Inline Module",permalink:"/basic/module-inline"},next:{title:"A.23. Struct",permalink:"/basic/struct"}},r={},u=[{value:"A.22.1. Scope",id:"a221-scope",level:2},{value:"A.22.2. Module Scope",id:"a222-module-scope",level:2},{value:"A.22.3. Keyword self dan crate root",id:"a223-keyword-self-dan-crate-root",level:2},{value:"A.22.4. Keyword self pada module scope",id:"a224-keyword-self-pada-module-scope",level:2},{value:"A.22.5. Keyword crate pada module scope",id:"a225-keyword-crate-pada-module-scope",level:2},{value:"A.22.6. Keyword super",id:"a226-keyword-super",level:2},{value:"A.22.7. Praktik lanjutan",id:"a227-praktik-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:u};function p(e){let{components:a,...i}=e;return(0,l.kt)("wrapper",(0,t.Z)({},o,i,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Pembahasan chapter ini masih dalam lingkup module system, yaitu tentang scope dan pengakesan module item."),(0,l.kt)("h2",{id:"a221-scope"},"A.22.1. Scope"),(0,l.kt)("p",null,"Scope bisa diartikan dengan: representasi di mana kode berada. Apapun yang ditulis dalam blok kode (ditandai dengan diapit tanda kurung kurawal ",(0,l.kt)("inlineCode",{parentName:"p"},"{ }"),") berarti dalam satu scope yang sama."),(0,l.kt)("p",null,"Agar lebih jelas, lihat kode berikut kemudian pelajari penjelasan di bawahnya:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'const PI: f64 = 3.14;\n\nfn main() {\n my_func();\n}\n\nfn my_func() {\n let nama = "Sylvanas Windrunner";\n let occupation = "ex-Warchief of the Horde";\n\n // ...\n}\n')),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"PI"),", fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"main"),", dan juga fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," di definisikan satu level dan berada di scope terluar (yang pada ebook ini disebut sebagai ",(0,l.kt)("em",{parentName:"li"},"root"),")."),(0,l.kt)("li",{parentName:"ul"},"Statement pemanggilan fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func()")," berada dalam scope blok kode fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"main"),"."),(0,l.kt)("li",{parentName:"ul"},"Variabel ",(0,l.kt)("inlineCode",{parentName:"li"},"nama")," dan ",(0,l.kt)("inlineCode",{parentName:"li"},"occupation")," berada pada scope blok kode fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func"),".")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Sebenarnya pembahasan mengenai ",(0,l.kt)("inlineCode",{parentName:"p"},"scope")," harus diiringi dengan pembahasan tentang ",(0,l.kt)("a",{parentName:"p",href:"/basic/block-expression"},"Block expression"),", namun karena kita belum mempelajarinya, chapter ini pembahasan hanya akan fokus pada penerapan scope yang berhubungan dengan ",(0,l.kt)("strong",{parentName:"p"},"module scope"),".")),(0,l.kt)("h2",{id:"a222-module-scope"},"A.22.2. Module Scope"),(0,l.kt)("p",null,"Module scope adalah scope untuk module. Apa bedanya dengan scope secara umum? Silakan perhatikan kode berikut terlebih dahulu:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'mod my_module {\n\n const event_one: &str = "Siege of Ogrimmar";\n\n mod my_submodule {\n \n const event_two: &str = "Battle for Azeroth";\n\n fn func_two() {\n const event_three: &str = "Sepulcher of the First Ones";\n }\n }\n}\n')),(0,l.kt)("p",null,"Pada kode di atas:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"event_one")," berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_module"),"."),(0,l.kt)("li",{parentName:"ul"},"Module ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule")," adalah sebuah inline module yang berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_module"),". Module ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule")," berada dalam satu scope yang sama dengan variabel ",(0,l.kt)("inlineCode",{parentName:"li"},"event_one"),"."),(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"event_two")," berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule"),"."),(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"func_two")," berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule"),"."),(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"event_three")," ",(0,l.kt)("strong",{parentName:"li"},"scope"),"-nya adalah dalam blok fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"func_two"),". Sedangkan ",(0,l.kt)("strong",{parentName:"li"},"module scope"),"-nya adalah dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule"),". Jadi kelihatan ya bedanya.")),(0,l.kt)("p",null,"Pemahaman tentang module scope ini penting karena akan berhubungan dengan apa yang akan dipelajari di ",(0,l.kt)("em",{parentName:"p"},"section")," berikutnya."),(0,l.kt)("h2",{id:"a223-keyword-self-dan-crate-root"},"A.22.3. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"self")," dan ",(0,l.kt)("em",{parentName:"h2"},"crate root")),(0,l.kt)("p",null,"Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," merepresentasikan current module scope. Dengannya kita bisa mengakses item yang deklarasinya ada pada module scope yang sama."),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Sebenarnya selain penjelasan di atas, keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," juga digunakan untuk hal lain yaitu sebagai receiver method."),(0,l.kt)("p",{parentName:"blockquote"},"Pembahasan tentang penerapan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," sebagai receiver method dibahas pada chapter ",(0,l.kt)("a",{parentName:"p",href:"/basic/method"},"Method"))),(0,l.kt)("p",null,"Selanjutnya, apa itu ",(0,l.kt)("em",{parentName:"p"},"crate root"),"? ",(0,l.kt)("strong",{parentName:"p"},"Crate root")," adalah apapun yang didefinisikan di file entrypoint crate (yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"src/main.rs")," untuk binary crate, dan ",(0,l.kt)("inlineCode",{parentName:"p"},"src/lib.rs")," untuk library crate). ",(0,l.kt)("strong",{parentName:"p"},"Crate root")," adalah module scope yang berada di root (paling atas). Apapun yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root")," berarti berada dalam module scope yang sama."),(0,l.kt)("p",null,"Sebagai contoh, pada kode program berikut, module ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod")," dan fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main")," dideklarasikan di ",(0,l.kt)("em",{parentName:"p"},"crate root")," ",(0,l.kt)("inlineCode",{parentName:"p"},"src/main.rs"),". Artinya kedua item tersebut berada dalam satu module scope yang sama, yaitu di ",(0,l.kt)("em",{parentName:"p"},"crate root"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'mod my_mod {\n pub fn run_the_app(note: &str) {\n println!("calling `my_mod::run_the_app()`. note {}", note);\n }\n}\n\nfn main() {\n my_mod::run_the_app("1st call");\n self::my_mod::run_the_app("2nd call");\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access self",src:n(7116).Z,width:"490",height:"128"})),(0,l.kt)("p",null,"Pada fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main"),", ada dua statement pemanggilan module item ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::run_the_app"),". Kedua statement tersebut adalah mirip, pembedanya ada pada statement ke-2, yaitu keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," digunakan di segment path sebagai prefix."),(0,l.kt)("p",null,"Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," menginstruksi program bahwa item yang dipanggil adalah item yang module scope-nya sama."),(0,l.kt)("p",null,"Pada contoh di atas, module ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod")," berada dalam satu scope yang sama dengan fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main"),", yaitu di ",(0,l.kt)("em",{parentName:"p"},"crate root"),". Karena itu, ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod")," bisa diakses dengan menggunakan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self"),", atau lansung panggil saja nama module seperti biasanya, ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod()"),"."),(0,l.kt)("p",null,"Bisa dibilang keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," ini opsional dalam penggunaannya, boleh ikut dituliskan dan boleh juga tidak."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'my_mod::run_the_app("1st call");\nself::my_mod::run_the_app("2nd call");\n')),(0,l.kt)("h2",{id:"a224-keyword-self-pada-module-scope"},"A.22.4. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"self")," pada module scope"),(0,l.kt)("p",null,"Lanjut ke praktik berikutnya. Masih tentang keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self"),", kita akan gunakan keyword ini untuk mengakses item dalam module."),(0,l.kt)("p",null,"Silakan tulis kode berikut kemudian jalankan."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("calling `my_func()`");\n}\n\nmod my_mod {\n \n pub fn my_func() {\n println!("calling `my_mod::my_func()`");\n }\n \n pub fn run_the_app() {\n println!("calling `my_mod::run_the_app()`");\n my_func();\n self::my_func();\n }\n}\n\nfn main() {\n my_mod::run_the_app();\n}\n')),(0,l.kt)("p",null,"Pada contoh bisa dilihat ada dua buah fungsi dideklarasikan dengan nama yang sama persis, yang satu berada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),", satunya lagi merupakan item milik ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod"),"."),(0,l.kt)("p",null,"Di dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::run_the_app")," ada 2 kali pemanggilan fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func"),", satunya menggunakan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," dan satunya tidak. Fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," manakah yang dipanggil? Hasilnya bisa dilihat pada gambar di bawah ini."),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access self",src:n(576).Z,width:"681",height:"290"})),(0,l.kt)("p",null,"Kedua statement ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func()")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func()")," dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::run_the_app")," adalah mengarah ke fungsi yang sama, yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),"."),(0,l.kt)("p",null,"Jadi kesimpulan dari penerapan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," dalam module item adalah sama seperti penerapannya pada ",(0,l.kt)("em",{parentName:"p"},"crate root"),", yaitu boleh dipakai boleh tidak. Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," adalah opsional."),(0,l.kt)("p",null,"Lalu bagaimana cara memanggil ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),", dengan pemanggilan adalah dari dalam module item? Caranya adalah menggunakan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"crate"),"."),(0,l.kt)("h2",{id:"a225-keyword-crate-pada-module-scope"},"A.22.5. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"crate")," pada module scope"),(0,l.kt)("p",null,"Keyword ini digunakan untuk mengakses apapun yang ada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),"."),(0,l.kt)("p",null,"Pada contoh di atas, fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root")," bisa dipanggil dari fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main")," dengan statement ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func()")," atau ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func()"),". Untuk bagian ini penulis rasa sudah cukup jelas."),(0,l.kt)("p",null,"Beda cerita kalau fungsi tersebut dipanggil dari dalam module item ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app"),". Kedua statement ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func()")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func()")," mengarah ke ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),", bukan ke fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," di ",(0,l.kt)("em",{parentName:"p"},"crate root"),". Hal ini karena ",(0,l.kt)("strong",{parentName:"p"},"current module scope")," dalam statement ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app")," adalah module ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod"),", maka pemanggilan ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," tanpa ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," atau dengannya mengarah ke fungsi yang sama yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),"."),(0,l.kt)("p",null,"Pada ",(0,l.kt)("em",{parentName:"p"},"section")," ini kita akan belajar tentang keyword baru, yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"crate"),". Keyword tersebut digunakan untuk mengakses apapun yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),". Kita bisa memanfaatkannya untuk mengakses ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root")," dengan pengaksesan dari dalam module item."),(0,l.kt)("p",null,"Silakan ubah kode di atas menjadi seperti berikut. Perubahannya ada pada statement dalam fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("calling `my_func()`");\n}\n\nmod my_mod {\n \n pub fn my_func() {\n println!("calling `my_mod::my_func()`");\n }\n \n pub fn run_the_app() {\n println!("calling `my_mod::run_the_app()`");\n crate::my_func();\n self::my_func();\n }\n}\n\nfn main() {\n my_mod::run_the_app();\n}\n')),(0,l.kt)("p",null,"Jalankan program, hasilnya berbeda dengan eksekusi program sebelumnya. Statement ",(0,l.kt)("inlineCode",{parentName:"p"},"crate::my_func()")," dalam fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app")," mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," di root, sedangkan ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func")," mengarah ke ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),"."),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access crate",src:n(7721).Z,width:"487",height:"136"})),(0,l.kt)("h2",{id:"a226-keyword-super"},"A.22.6. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"super")),(0,l.kt)("p",null,"Selain ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"crate")," ada juga keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"super"),", yang gunanya adalah untuk mengakses ",(0,l.kt)("em",{parentName:"p"},"parent")," module scope atau 1 scope di atas ",(0,l.kt)("em",{parentName:"p"},"current")," module scope. Agar lebih jelas silakan pelajari kode berikut:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("calling `my_func()`");\n}\n\nmod my_mod {\n \n pub fn my_func() {\n println!("calling `my_mod::my_func()`");\n }\n \n pub mod my_submod {\n\n pub fn my_func() {\n println!("calling `my_mod::my_submod::my_func()`");\n }\n \n pub fn run_the_app() {\n println!("calling `my_mod::my_submod::run_the_app()`");\n crate::my_func();\n super::my_func();\n self::my_func();\n }\n }\n}\n\nfn main() {\n my_mod::my_submod::run_the_app();\n}\n')),(0,l.kt)("p",null,"Ada 3 buah fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," dideklarasikan:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"li"},"crate root"),"."),(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang merupakan module item milik ",(0,l.kt)("inlineCode",{parentName:"li"},"my_mod"),"."),(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang merupakan module item milik submodule ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submod"),".")),(0,l.kt)("p",null,"Dalam fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app"),", ketiga fungsi dengan nama tersebut dipanggil."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Statement ",(0,l.kt)("inlineCode",{parentName:"li"},"crate::my_func()")," akan mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang ada di ",(0,l.kt)("em",{parentName:"li"},"crate root"),"."),(0,l.kt)("li",{parentName:"ul"},"Statement ",(0,l.kt)("inlineCode",{parentName:"li"},"super::my_func()")," akan mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang ada di parent module scope, yaitu ",(0,l.kt)("inlineCode",{parentName:"li"},"my_mod::my_func"),"."),(0,l.kt)("li",{parentName:"ul"},"Statement ",(0,l.kt)("inlineCode",{parentName:"li"},"self::my_func()")," akan mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang ada di current module scope, yaitu ",(0,l.kt)("inlineCode",{parentName:"li"},"my_mod::my_submod::my_func"),".")),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access super",src:n(2781).Z,width:"487",height:"152"})),(0,l.kt)("p",null,"Semoga cukup jelas ya. Silakan ulangi terus praktik di atas jika perlu, agar makin paham."),(0,l.kt)("p",null,"O iya, keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"super")," ini bisa digunakan banyak kali sesuai kebutuhan. Setiap kali keyword ditulis sebagai segment path, maka artinya 1 level parent module scope."),(0,l.kt)("p",null,"Jika mengacu ke contoh program di atas, maka kedua statement berikut adalah ekuivalen."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"crate::my_func();\nsuper::super::my_func();\n")),(0,l.kt)("h2",{id:"a227-praktik-lanjutan"},"A.22.7. Praktik lanjutan"),(0,l.kt)("p",null,"Agar pemahaman makin mantab, silakan pelajari program berikut."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("call `my_func()`");\n}\n\nmod module_a {\n\n // path item \u279c `module_a::my_func`.\n pub fn my_func() {\n println!("call `module_a::my_func()`");\n }\n}\n\nmod module_b {\n\n // path item \u279c `module_b::submodule_b_one`.\n mod submodule_b_one {\n\n // path item \u279c `module_b::submodule_b_one::my_func`.\n pub fn my_func() {\n println!("call `module_b::submodule_b_one::my_func()`");\n }\n }\n\n // path item \u279c `module_b::submodule_b_two`.\n mod submodule_b_two {\n\n // path item \u279c `module_b::submodule_b_two::my_func`.\n pub fn my_func() {\n println!("call `module_b::submodule_b_two::my_func()`");\n\n // current module scope adalah module `submodule_b_two`.\n // keyword `super` di sini mengarah ke parent scope, yaitu `module`.\n //\n // statement `super::my_func()` berikut adalah\n // ekuivalen dengan `module_b::my_func()`\n // jika diakses dari crate root.\n super::my_func();\n //\n // statement `super::submodule_b_one::my_func()` berikut adalah\n // ekuivalen dengan `module_b::submodule_b_one::my_func()`\n // jika diakses dari crate root.\n super::submodule_b_one::my_func();\n }\n }\n \n // path item \u279c `module_b::my_func`.\n // fungsi ini tidak publik, jadi hanya bisa diakses dalam scope module `module_b` saja.\n fn my_func() {\n println!("call `module_b::my_func()`");\n }\n \n // path item \u279c `module_b::run_all_funcs`.\n pub fn run_all_funcs() {\n\n // semua fungsi yang didefinisikan akan di call dalam blok kode ini.\n print!("call `my::run_all_funcs()`");\n \n // keyword `self` merepresentasikan current module scope.\n // menjadikan dua statement berikut adalah ekuivalen:\n // `my_func()` adalah ekuivalen dengan `self::my_func()`.\n my_func();\n self::my_func();\n\n // current module scope adalah `module_b`.\n // keyword `super` di sini mengarah ke parent scope, yaitu root atau scope paling luar.\n //\n // statement `super::my_func()` berikut adalah\n // memanggil fungsi `my_func` yang ada di crate root,\n // yang deklarasinya satu level dengan fungsi `main`.\n super::my_func();\n //\n // statement `super::module_a::my_func()` berikut adalah\n // memanggil fungsi `my_func` milik module `module_a` yang ada di crate root.\n super::module_a::my_func();\n //\n // module `submodule_b_two` bisa diakses menggunakan self ataupun tidak\n // karena module tersebut merupakan item yang deklarasinya 1 scope dengan fungsi ini,\n // 1 level dengan `run_all_funcs`.\n submodule_b_two::my_func();\n self::submodule_b_two::my_func();\n }\n}\n\nfn main() {\n module_b::run_all_funcs();\n}\n')),(0,l.kt)("hr",null),(0,l.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,l.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,l.kt)("pre",null,(0,l.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/module_scope_item_access"},"github.com/novalagung/dasarpemrogramanrust-example/../module_scope_item_access")),(0,l.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html"},"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.self.html"},"https://doc.rust-lang.org/std/keyword.self.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.super.html"},"https://doc.rust-lang.org/std/keyword.super.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.crate.html"},"https://doc.rust-lang.org/std/keyword.crate.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/mod.html"},"https://doc.rust-lang.org/rust-by-example/mod.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/meta/doc.html"},"https://doc.rust-lang.org/rust-by-example/meta/doc.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html"))))}p.isMDXComponent=!0},7116:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeoAAACACAIAAABLF73lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjNUMTg6NTk6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI5OjEwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI5OjEwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg4MjM0MjIzLTMyYWYtZmI0MC1hZDNkLWFkMDljOTdhMjY1NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyY2RmZDNjMy1iMWU1LTc1NDctYjQ2Yy05MTg2YzNmYWU3ZWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyY2RmZDNjMy1iMWU1LTc1NDctYjQ2Yy05MTg2YzNmYWU3ZWEiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjJjZGZkM2MzLWIxZTUtNzU0Ny1iNDZjLTkxODZjM2ZhZTdlYTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJjZGZkM2MzLWIxZTUtNzU0Ny1iNDZjLTkxODZjM2ZhZTdlYSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yM1QxODo1OTozNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4ODIzNDIyMy0zMmFmLWZiNDAtYWQzZC1hZDA5Yzk3YTI2NTYiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6Mjk6MTArMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz47iXUnAAAUYklEQVR42u2dvY7cxhJG/SQrGRe4kAAn17GsVJG0ThwoWAEKBIcSDAiwog2U+RX0CHoK5X6oOyRnyP75qlnNITnkzPkgYLVckv1/WF1s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"},576:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/module-scope-item-access-2-d5e5b26c8180ce6a413ba9a494361526.png"},7721:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAecAAACICAIAAABSurQ4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjNUMTk6NDc6NDArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjMxOjAyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjMxOjAyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcwNjU3ODY2LTkwOTYtNWU0YS1iN2JjLTA0MDk5OTZiYzlhZiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNzJiZGZjNC1jMDQ2LTVjNGQtYTQ4MC1mMTY0NGIzZTU3MzYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzJiZGZjNC1jMDQ2LTVjNGQtYTQ4MC1mMTY0NGIzZTU3MzYiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjA3MmJkZmM0LWMwNDYtNWM0ZC1hNDgwLWYxNjQ0YjNlNTczNjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjA3MmJkZmM0LWMwNDYtNWM0ZC1hNDgwLWYxNjQ0YjNlNTczNiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yM1QxOTo0Nzo0MCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3MDY1Nzg2Ni05MDk2LTVlNGEtYjdiYy0wNDA5OTk2YmM5YWYiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MzE6MDIrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5DUCvEAAAUxUlEQVR42u2dPa7cxhJG30qubDzAkAAnz7GsVJEsJw4USIACwaEEAwKsSIEyb0FL0CqUe1Fvhpwh++er7moOOUMOzwcBV5eXZP+weVhd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"},2781:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAecAAACYCAIAAABRbLajAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjNUMTk6NTg6NTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjMwOjM3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjMwOjM3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI1OTU2NDE0LTQ4OWEtNWM0MC1iMWViLWU2MjRjZmMxNzNjMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiZDM2MWU2NS00MmMxLWQ3NDUtYjFkNi03M2IzZGI3YzMwYWYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiZDM2MWU2NS00MmMxLWQ3NDUtYjFkNi03M2IzZGI3YzMwYWYiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOmJkMzYxZTY1LTQyYzEtZDc0NS1iMWQ2LTczYjNkYjdjMzBhZjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJkMzYxZTY1LTQyYzEtZDc0NS1iMWQ2LTczYjNkYjdjMzBhZiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yM1QxOTo1ODo1MSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyNTk1NjQxNC00ODlhLTVjNDAtYjFlYi1lNjI0Y2ZjMTczYzIiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MzA6MzcrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5OQFjAAAAWSUlEQVR42u2du67cxtJG/SRbNn7gQAKc/I5lpYpkOXGgQAIcCA4lHEDAUaTAmV9Bj6CnUH4e6uwhZ8i+fNVdPUNyeFkfBGxtbpJ9YXOx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"}}]); \ No newline at end of file diff --git a/assets/js/be3f5c40.4baec74d.js b/assets/js/be3f5c40.4baec74d.js deleted file mode 100644 index b86beac3..00000000 --- a/assets/js/be3f5c40.4baec74d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[5572],{3905:(e,a,n)=>{n.d(a,{Zo:()=>o,kt:()=>c});var t=n(7294);function l(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function i(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function d(e){for(var a=1;a=0||(l[n]=e[n]);return l}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(l[n]=e[n])}return l}var r=t.createContext({}),u=function(e){var a=t.useContext(r),n=a;return e&&(n="function"==typeof e?e(a):d(d({},a),e)),n},o=function(e){var a=u(e.components);return t.createElement(r.Provider,{value:a},e.children)},p={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},s=t.forwardRef((function(e,a){var n=e.components,l=e.mdxType,i=e.originalType,r=e.parentName,o=m(e,["components","mdxType","originalType","parentName"]),s=u(n),c=l,k=s["".concat(r,".").concat(c)]||s[c]||p[c]||i;return n?t.createElement(k,d(d({ref:a},o),{},{components:n})):t.createElement(k,d({ref:a},o))}));function c(e,a){var n=arguments,l=a&&a.mdxType;if("string"==typeof e||l){var i=n.length,d=new Array(i);d[0]=s;var m={};for(var r in a)hasOwnProperty.call(a,r)&&(m[r]=a[r]);m.originalType=e,m.mdxType="string"==typeof e?e:l,d[1]=m;for(var u=2;u{n.r(a),n.d(a,{assets:()=>r,contentTitle:()=>d,default:()=>p,frontMatter:()=>i,metadata:()=>m,toc:()=>u});var t=n(7462),l=(n(7294),n(3905));const i={sidebar_position:22,title:"A.22. Module System \u279c Scope & Akses Item",sidebar_label:"A.22. Module System \u279c Scope & Akses Item"},d=void 0,m={unversionedId:"basic/module-scope-item-access",id:"basic/module-scope-item-access",title:"A.22. Module System \u279c Scope & Akses Item",description:"Pembahasan chapter ini masih dalam lingkup module system, yaitu tentang scope dan pengakesan module item.",source:"@site/docs/basic/module-scope-item-access.md",sourceDirName:"basic",slug:"/basic/module-scope-item-access",permalink:"/basic/module-scope-item-access",draft:!1,tags:[],version:"current",sidebarPosition:22,frontMatter:{sidebar_position:22,title:"A.22. Module System \u279c Scope & Akses Item",sidebar_label:"A.22. Module System \u279c Scope & Akses Item"},sidebar:"tutorialSidebar",previous:{title:"A.21. Module System \u279c Inline Module",permalink:"/basic/module-inline"},next:{title:"A.23. Struct",permalink:"/basic/struct"}},r={},u=[{value:"A.22.1. Scope",id:"a221-scope",level:2},{value:"A.22.2. Module Scope",id:"a222-module-scope",level:2},{value:"A.22.3. Keyword self dan crate root",id:"a223-keyword-self-dan-crate-root",level:2},{value:"A.22.4. Keyword self pada module scope",id:"a224-keyword-self-pada-module-scope",level:2},{value:"A.22.5. Keyword crate pada module scope",id:"a225-keyword-crate-pada-module-scope",level:2},{value:"A.22.6. Keyword super",id:"a226-keyword-super",level:2},{value:"A.22.7. Praktik lanjutan",id:"a227-praktik-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:u};function p(e){let{components:a,...i}=e;return(0,l.kt)("wrapper",(0,t.Z)({},o,i,{components:a,mdxType:"MDXLayout"}),(0,l.kt)("p",null,"Pembahasan chapter ini masih dalam lingkup module system, yaitu tentang scope dan pengakesan module item."),(0,l.kt)("h2",{id:"a221-scope"},"A.22.1. Scope"),(0,l.kt)("p",null,"Scope bisa diartikan dengan: representasi dimana kode berada. Apapun yang ditulis dalam blok kode (ditandai dengan diapit tanda kurung kurawal ",(0,l.kt)("inlineCode",{parentName:"p"},"{ }"),") berarti dalam satu scope yang sama."),(0,l.kt)("p",null,"Agar lebih jelas, lihat kode berikut kemudian pelajari penjelasan dibawahnya:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'const PI: f64 = 3.14;\n\nfn main() {\n my_func();\n}\n\nfn my_func() {\n let nama = "Sylvanas Windrunner";\n let occupation = "ex-Warchief of the Horde";\n\n // ...\n}\n')),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"PI"),", fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"main"),", dan juga fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," di definisikan satu level dan berada di scope terluar (yang pada ebook ini disebut sebagai ",(0,l.kt)("em",{parentName:"li"},"root"),")."),(0,l.kt)("li",{parentName:"ul"},"Statement pemanggilan fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func()")," berada dalam scope blok kode fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"main"),"."),(0,l.kt)("li",{parentName:"ul"},"Variabel ",(0,l.kt)("inlineCode",{parentName:"li"},"nama")," dan ",(0,l.kt)("inlineCode",{parentName:"li"},"occupation")," berada pada scope blok kode fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func"),".")),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Sebenarnya pembahasan mengenai ",(0,l.kt)("inlineCode",{parentName:"p"},"scope")," harus diiringi dengan pembahasan tentang ",(0,l.kt)("a",{parentName:"p",href:"/basic/block-expression"},"Block expression"),", namun karena kita belum mempelajarinya, chapter ini pembahasan hanya akan fokus pada penerapan scope yang berhubungan dengan ",(0,l.kt)("strong",{parentName:"p"},"module scope"),".")),(0,l.kt)("h2",{id:"a222-module-scope"},"A.22.2. Module Scope"),(0,l.kt)("p",null,"Module scope adalah scope untuk module. Apa bedanya dengan scope secara umum? Silakan perhatikan kode berikut terlebih dahulu:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'mod my_module {\n\n const event_one: &str = "Siege of Ogrimmar";\n\n mod my_submodule {\n \n const event_two: &str = "Battle for Azeroth";\n\n fn func_two() {\n const event_three: &str = "Sepulcher of the First Ones";\n }\n }\n}\n')),(0,l.kt)("p",null,"Pada kode di atas:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"event_one")," berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_module"),"."),(0,l.kt)("li",{parentName:"ul"},"Module ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule")," adalah sebuah inline module yang berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_module"),". Module ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule")," berada dalam satu scope yang sama dengan variabel ",(0,l.kt)("inlineCode",{parentName:"li"},"event_one"),"."),(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"event_two")," berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule"),"."),(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"func_two")," berada dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule"),"."),(0,l.kt)("li",{parentName:"ul"},"Konstanta ",(0,l.kt)("inlineCode",{parentName:"li"},"event_three")," ",(0,l.kt)("strong",{parentName:"li"},"scope"),"-nya adalah dalam blok fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"func_two"),". Sedangkan ",(0,l.kt)("strong",{parentName:"li"},"module scope"),"-nya adalah dalam module scope ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submodule"),". Jadi kelihatan ya bedanya.")),(0,l.kt)("p",null,"Pemahaman tentang module scope ini penting karena akan berhubungan dengan apa yang akan dipelajari di ",(0,l.kt)("em",{parentName:"p"},"section")," berikutnya."),(0,l.kt)("h2",{id:"a223-keyword-self-dan-crate-root"},"A.22.3. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"self")," dan ",(0,l.kt)("em",{parentName:"h2"},"crate root")),(0,l.kt)("p",null,"Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," merepresentasikan current module scope. Dengannya kita bisa mengakses item yang deklarasinya ada pada module scope yang sama."),(0,l.kt)("blockquote",null,(0,l.kt)("p",{parentName:"blockquote"},"Sebenarnya selain penjelasan di atas, keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," juga digunakan untuk hal lain yaitu sebagai receiver method."),(0,l.kt)("p",{parentName:"blockquote"},"Pembahasan tentang penerapan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," sebagai receiver method dibahas pada chapter ",(0,l.kt)("a",{parentName:"p",href:"/basic/method"},"Method"))),(0,l.kt)("p",null,"Selanjutnya, apa itu ",(0,l.kt)("em",{parentName:"p"},"crate root"),"? ",(0,l.kt)("strong",{parentName:"p"},"Crate root")," adalah apapun yang didefinisikan di file entrypoint crate (yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"src/main.rs")," untuk binary crate, dan ",(0,l.kt)("inlineCode",{parentName:"p"},"src/lib.rs")," untuk library crate). ",(0,l.kt)("strong",{parentName:"p"},"Crate root")," adalah module scope yang berada di root (paling atas). Apapun yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root")," berarti berada dalam module scope yang sama."),(0,l.kt)("p",null,"Sebagai contoh, pada kode program berikut, module ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod")," dan fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main")," dideklarasikan di ",(0,l.kt)("em",{parentName:"p"},"crate root")," ",(0,l.kt)("inlineCode",{parentName:"p"},"src/main.rs"),". Artinya kedua item tersebut berada dalam satu module scope yang sama, yaitu di ",(0,l.kt)("em",{parentName:"p"},"crate root"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'mod my_mod {\n pub fn run_the_app(note: &str) {\n println!("calling `my_mod::run_the_app()`. note {}", note);\n }\n}\n\nfn main() {\n my_mod::run_the_app("1st call");\n self::my_mod::run_the_app("2nd call");\n}\n')),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access self",src:n(7116).Z,width:"490",height:"128"})),(0,l.kt)("p",null,"Pada fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main"),", ada dua statement pemanggilan module item ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::run_the_app"),". Kedua statement tersebut adalah mirip, pembedanya ada pada statement ke-2, yaitu keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," digunakan di segment path sebagai prefix."),(0,l.kt)("p",null,"Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," menginstruksi program bahwa item yang dipanggil adalah item yang module scope-nya sama."),(0,l.kt)("p",null,"Pada contoh di atas, module ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod")," berada dalam satu scope yang sama dengan fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main"),", yaitu di ",(0,l.kt)("em",{parentName:"p"},"crate root"),". Karena itu, ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod")," bisa diakses dengan menggunakan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self"),", atau lansung panggil saja nama module seperti biasanya, ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod()"),"."),(0,l.kt)("p",null,"Bisa dibilang keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," ini opsional dalam penggunaannya, boleh ikut dituliskan dan boleh juga tidak."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'my_mod::run_the_app("1st call");\nself::my_mod::run_the_app("2nd call");\n')),(0,l.kt)("h2",{id:"a224-keyword-self-pada-module-scope"},"A.22.4. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"self")," pada module scope"),(0,l.kt)("p",null,"Lanjut ke praktik berikutnya. Masih tentang keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self"),", kita akan gunakan keyword ini untuk mengakses item dalam module."),(0,l.kt)("p",null,"Silakan tulis kode berikut kemudian jalankan."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("calling `my_func()`");\n}\n\nmod my_mod {\n \n pub fn my_func() {\n println!("calling `my_mod::my_func()`");\n }\n \n pub fn run_the_app() {\n println!("calling `my_mod::run_the_app()`");\n my_func();\n self::my_func();\n }\n}\n\nfn main() {\n my_mod::run_the_app();\n}\n')),(0,l.kt)("p",null,"Pada contoh bisa dilihat ada dua buah fungsi dideklarasikan dengan nama yang sama persis, yang satu berada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),", satunya lagi merupakan item milik ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod"),"."),(0,l.kt)("p",null,"Di dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::run_the_app")," ada 2 kali pemanggilan fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func"),", satunya menggunakan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," dan satunya tidak. Fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," manakah yang dipanggil? Hasilnya bisa dilihat pada gambar dibawah ini."),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access self",src:n(576).Z,width:"681",height:"290"})),(0,l.kt)("p",null,"Kedua statement ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func()")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func()")," dalam ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::run_the_app")," adalah mengarah ke fungsi yang sama, yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),"."),(0,l.kt)("p",null,"Jadi kesimpulan dari penerapan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," dalam module item adalah sama seperti penerapannya pada ",(0,l.kt)("em",{parentName:"p"},"crate root"),", yaitu boleh dipakai boleh tidak. Keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," adalah opsional."),(0,l.kt)("p",null,"Lalu bagaimana cara memanggil ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),", dengan pemanggilan adalah dari dalam module item? Caranya adalah menggunakan keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"crate"),"."),(0,l.kt)("h2",{id:"a225-keyword-crate-pada-module-scope"},"A.22.5. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"crate")," pada module scope"),(0,l.kt)("p",null,"Keyword ini digunakan untuk mengakses apapun yang ada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),"."),(0,l.kt)("p",null,"Pada contoh di atas, fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root")," bisa dipanggil dari fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"main")," dengan statement ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func()")," atau ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func()"),". Untuk bagian ini penulis rasa sudah cukup jelas."),(0,l.kt)("p",null,"Beda cerita kalau fungsi tersebut dipanggil dari dalam module item ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app"),". Kedua statement ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func()")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func()")," mengarah ke ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),", bukan ke fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," di ",(0,l.kt)("em",{parentName:"p"},"crate root"),". Hal ini karena ",(0,l.kt)("strong",{parentName:"p"},"current module scope")," dalam statement ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app")," adalah module ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod"),", maka pemanggilan ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," tanpa ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," atau dengannya mengarah ke fungsi yang sama yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),"."),(0,l.kt)("p",null,"Pada ",(0,l.kt)("em",{parentName:"p"},"section")," ini kita akan belajar tentang keyword baru, yaitu ",(0,l.kt)("inlineCode",{parentName:"p"},"crate"),". Keyword tersebut digunakan untuk mengakses apapun yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root"),". Kita bisa memanfaatkannya untuk mengakses ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"p"},"crate root")," dengan pengaksesan dari dalam module item."),(0,l.kt)("p",null,"Silakan ubah kode di atas menjadi seperti berikut. Perubahannya ada pada statement dalam fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app"),"."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("calling `my_func()`");\n}\n\nmod my_mod {\n \n pub fn my_func() {\n println!("calling `my_mod::my_func()`");\n }\n \n pub fn run_the_app() {\n println!("calling `my_mod::run_the_app()`");\n crate::my_func();\n self::my_func();\n }\n}\n\nfn main() {\n my_mod::run_the_app();\n}\n')),(0,l.kt)("p",null,"Jalankan program, hasilnya berbeda dengan eksekusi program sebelumnya. Statement ",(0,l.kt)("inlineCode",{parentName:"p"},"crate::my_func()")," dalam fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app")," mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," di root, sedangkan ",(0,l.kt)("inlineCode",{parentName:"p"},"self::my_func")," mengarah ke ",(0,l.kt)("inlineCode",{parentName:"p"},"my_mod::my_func"),"."),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access crate",src:n(7721).Z,width:"487",height:"136"})),(0,l.kt)("h2",{id:"a226-keyword-super"},"A.22.6. Keyword ",(0,l.kt)("inlineCode",{parentName:"h2"},"super")),(0,l.kt)("p",null,"Selain ",(0,l.kt)("inlineCode",{parentName:"p"},"self")," dan ",(0,l.kt)("inlineCode",{parentName:"p"},"crate")," ada juga keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"super"),", yang gunanya adalah untuk mengakses ",(0,l.kt)("em",{parentName:"p"},"parent")," module scope atau 1 scope di atas ",(0,l.kt)("em",{parentName:"p"},"current")," module scope. Agar lebih jelas silakan pelajari kode berikut:"),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("calling `my_func()`");\n}\n\nmod my_mod {\n \n pub fn my_func() {\n println!("calling `my_mod::my_func()`");\n }\n \n pub mod my_submod {\n\n pub fn my_func() {\n println!("calling `my_mod::my_submod::my_func()`");\n }\n \n pub fn run_the_app() {\n println!("calling `my_mod::my_submod::run_the_app()`");\n crate::my_func();\n super::my_func();\n self::my_func();\n }\n }\n}\n\nfn main() {\n my_mod::my_submod::run_the_app();\n}\n')),(0,l.kt)("p",null,"Ada 3 buah fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"my_func")," dideklarasikan:"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang berada di ",(0,l.kt)("em",{parentName:"li"},"crate root"),"."),(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang merupakan module item milik ",(0,l.kt)("inlineCode",{parentName:"li"},"my_mod"),"."),(0,l.kt)("li",{parentName:"ul"},"Fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang merupakan module item milik submodule ",(0,l.kt)("inlineCode",{parentName:"li"},"my_submod"),".")),(0,l.kt)("p",null,"Dalam fungsi ",(0,l.kt)("inlineCode",{parentName:"p"},"run_the_app"),", ketiga fungsi dengan nama tersebut dipanggil."),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},"Statement ",(0,l.kt)("inlineCode",{parentName:"li"},"crate::my_func()")," akan mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang ada di ",(0,l.kt)("em",{parentName:"li"},"crate root"),"."),(0,l.kt)("li",{parentName:"ul"},"Statement ",(0,l.kt)("inlineCode",{parentName:"li"},"super::my_func()")," akan mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang ada di parent module scope, yaitu ",(0,l.kt)("inlineCode",{parentName:"li"},"my_mod::my_func"),"."),(0,l.kt)("li",{parentName:"ul"},"Statement ",(0,l.kt)("inlineCode",{parentName:"li"},"self::my_func()")," akan mengarah ke fungsi ",(0,l.kt)("inlineCode",{parentName:"li"},"my_func")," yang ada di current module scope, yaitu ",(0,l.kt)("inlineCode",{parentName:"li"},"my_mod::my_submod::my_func"),".")),(0,l.kt)("p",null,(0,l.kt)("img",{alt:"Module item access super",src:n(2781).Z,width:"487",height:"152"})),(0,l.kt)("p",null,"Semoga cukup jelas ya. Silakan ulangi terus praktik di atas jika perlu, agar makin paham."),(0,l.kt)("p",null,"O iya, keyword ",(0,l.kt)("inlineCode",{parentName:"p"},"super")," ini bisa digunakan banyak kali sesuai kebutuhan. Setiap kali keyword ditulis sebagai segment path, maka artinya 1 level parent module scope."),(0,l.kt)("p",null,"Jika mengacu ke contoh program di atas, maka kedua statement berikut adalah ekuivalen."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},"crate::my_func();\nsuper::super::my_func();\n")),(0,l.kt)("h2",{id:"a227-praktik-lanjutan"},"A.22.7. Praktik lanjutan"),(0,l.kt)("p",null,"Agar pemahaman makin mantab, silakan pelajari program berikut."),(0,l.kt)("pre",null,(0,l.kt)("code",{parentName:"pre",className:"language-rust"},'fn my_func() {\n println!("call `my_func()`");\n}\n\nmod module_a {\n\n // path item \u279c `module_a::my_func`.\n pub fn my_func() {\n println!("call `module_a::my_func()`");\n }\n}\n\nmod module_b {\n\n // path item \u279c `module_b::submodule_b_one`.\n mod submodule_b_one {\n\n // path item \u279c `module_b::submodule_b_one::my_func`.\n pub fn my_func() {\n println!("call `module_b::submodule_b_one::my_func()`");\n }\n }\n\n // path item \u279c `module_b::submodule_b_two`.\n mod submodule_b_two {\n\n // path item \u279c `module_b::submodule_b_two::my_func`.\n pub fn my_func() {\n println!("call `module_b::submodule_b_two::my_func()`");\n\n // current module scope adalah module `submodule_b_two`.\n // keyword `super` di sini mengarah ke parent scope, yaitu `module`.\n //\n // statement `super::my_func()` berikut adalah\n // ekuivalen dengan `module_b::my_func()`\n // jika diakses dari crate root.\n super::my_func();\n //\n // statement `super::submodule_b_one::my_func()` berikut adalah\n // ekuivalen dengan `module_b::submodule_b_one::my_func()`\n // jika diakses dari crate root.\n super::submodule_b_one::my_func();\n }\n }\n \n // path item \u279c `module_b::my_func`.\n // fungsi ini tidak publik, jadi hanya bisa diakses dalam scope module `module_b` saja.\n fn my_func() {\n println!("call `module_b::my_func()`");\n }\n \n // path item \u279c `module_b::run_all_funcs`.\n pub fn run_all_funcs() {\n\n // semua fungsi yang didefinisikan akan di call dalam blok kode ini.\n print!("call `my::run_all_funcs()`");\n \n // keyword `self` merepresentasikan current module scope.\n // menjadikan dua statement berikut adalah ekuivalen:\n // `my_func()` adalah ekuivalen dengan `self::my_func()`.\n my_func();\n self::my_func();\n\n // current module scope adalah `module_b`.\n // keyword `super` di sini mengarah ke parent scope, yaitu root atau scope paling luar.\n //\n // statement `super::my_func()` berikut adalah\n // memanggil fungsi `my_func` yang ada di crate root,\n // yang deklarasinya satu level dengan fungsi `main`.\n super::my_func();\n //\n // statement `super::module_a::my_func()` berikut adalah\n // memanggil fungsi `my_func` milik module `module_a` yang ada di crate root.\n super::module_a::my_func();\n //\n // module `submodule_b_two` bisa diakses menggunakan self ataupun tidak\n // karena module tersebut merupakan item yang deklarasinya 1 scope dengan fungsi ini,\n // 1 level dengan `run_all_funcs`.\n submodule_b_two::my_func();\n self::submodule_b_two::my_func();\n }\n}\n\nfn main() {\n module_b::run_all_funcs();\n}\n')),(0,l.kt)("hr",null),(0,l.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,l.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,l.kt)("pre",null,(0,l.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/module_scope_item_access"},"github.com/novalagung/dasarpemrogramanrust-example/../module_scope_item_access")),(0,l.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,l.kt)("ul",null,(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html"},"https://doc.rust-lang.org/book/ch07-02-defining-modules-to-control-scope-and-privacy.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.self.html"},"https://doc.rust-lang.org/std/keyword.self.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.super.html"},"https://doc.rust-lang.org/std/keyword.super.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.crate.html"},"https://doc.rust-lang.org/std/keyword.crate.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/mod.html"},"https://doc.rust-lang.org/rust-by-example/mod.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/meta/doc.html"},"https://doc.rust-lang.org/rust-by-example/meta/doc.html")),(0,l.kt)("li",{parentName:"ul"},(0,l.kt)("a",{parentName:"li",href:"https://aloso.github.io/2021/03/28/module-system.html"},"https://aloso.github.io/2021/03/28/module-system.html"))))}p.isMDXComponent=!0},7116:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeoAAACACAIAAABLF73lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjNUMTg6NTk6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI5OjEwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI5OjEwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjg4MjM0MjIzLTMyYWYtZmI0MC1hZDNkLWFkMDljOTdhMjY1NiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyY2RmZDNjMy1iMWU1LTc1NDctYjQ2Yy05MTg2YzNmYWU3ZWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyY2RmZDNjMy1iMWU1LTc1NDctYjQ2Yy05MTg2YzNmYWU3ZWEiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjJjZGZkM2MzLWIxZTUtNzU0Ny1iNDZjLTkxODZjM2ZhZTdlYTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjJjZGZkM2MzLWIxZTUtNzU0Ny1iNDZjLTkxODZjM2ZhZTdlYSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yM1QxODo1OTozNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo4ODIzNDIyMy0zMmFmLWZiNDAtYWQzZC1hZDA5Yzk3YTI2NTYiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6Mjk6MTArMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz47iXUnAAAUYklEQVR42u2dvY7cxhJG/SQrGRe4kAAn17GsVJG0ThwoWAEKBIcSDAiwog2U+RX0CHoK5X6oOyRnyP75qlnNITnkzPkgYLVckv1/WF1s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"},576:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/module-scope-item-access-2-d5e5b26c8180ce6a413ba9a494361526.png"},7721:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAecAAACICAIAAABSurQ4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjNUMTk6NDc6NDArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjMxOjAyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjMxOjAyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcwNjU3ODY2LTkwOTYtNWU0YS1iN2JjLTA0MDk5OTZiYzlhZiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDowNzJiZGZjNC1jMDQ2LTVjNGQtYTQ4MC1mMTY0NGIzZTU3MzYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDowNzJiZGZjNC1jMDQ2LTVjNGQtYTQ4MC1mMTY0NGIzZTU3MzYiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjA3MmJkZmM0LWMwNDYtNWM0ZC1hNDgwLWYxNjQ0YjNlNTczNjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjA3MmJkZmM0LWMwNDYtNWM0ZC1hNDgwLWYxNjQ0YjNlNTczNiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yM1QxOTo0Nzo0MCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo3MDY1Nzg2Ni05MDk2LTVlNGEtYjdiYy0wNDA5OTk2YmM5YWYiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MzE6MDIrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5DUCvEAAAUxUlEQVR42u2dPa7cxhJG30qubDzAkAAnz7GsVJEsJw4USIACwaEEAwKsSIEyb0FL0CqUe1Fvhpwh++er7moOOUMOzwcBV5eXZP+weVhd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"},2781:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAecAAACYCAIAAABRbLajAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMjNUMTk6NTg6NTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjMwOjM3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjMwOjM3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjI1OTU2NDE0LTQ4OWEtNWM0MC1iMWViLWU2MjRjZmMxNzNjMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpiZDM2MWU2NS00MmMxLWQ3NDUtYjFkNi03M2IzZGI3YzMwYWYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpiZDM2MWU2NS00MmMxLWQ3NDUtYjFkNi03M2IzZGI3YzMwYWYiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOmJkMzYxZTY1LTQyYzEtZDc0NS1iMWQ2LTczYjNkYjdjMzBhZjwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmJkMzYxZTY1LTQyYzEtZDc0NS1iMWQ2LTczYjNkYjdjMzBhZiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0yM1QxOTo1ODo1MSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyNTk1NjQxNC00ODlhLTVjNDAtYjFlYi1lNjI0Y2ZjMTczYzIiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MzA6MzcrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5OQFjAAAAWSUlEQVR42u2du67cxtJG/SRbNn7gQAKc/I5lpYpkOXGgQAIcCA4lHEDAUaTAmV9Bj6CnUH4e6uwhZ8i+fNVdPUNyeFkfBGxtbpJ9YXOx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"}}]); \ No newline at end of file diff --git a/assets/js/c526a898.18163a59.js b/assets/js/c526a898.18163a59.js new file mode 100644 index 00000000..2973574a --- /dev/null +++ b/assets/js/c526a898.18163a59.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9157],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>o});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var u=t.createContext({}),m=function(a){var e=t.useContext(u),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},d=function(a){var e=m(a.components);return t.createElement(u.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},s=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,u=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),s=m(n),o=i,g=s["".concat(u,".").concat(o)]||s[o]||k[o]||l;return n?t.createElement(g,r(r({ref:e},d),{},{components:n})):t.createElement(g,r({ref:e},d))}));function o(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=s;var p={};for(var u in e)hasOwnProperty.call(e,u)&&(p[u]=e[u]);p.originalType=a,p.mdxType="string"==typeof a?a:i,r[1]=p;for(var m=2;m{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:17,title:"A.17. Function",sidebar_label:"A.17. Function"},r=void 0,p={unversionedId:"basic/function",id:"basic/function",title:"A.17. Function",description:"Pada chapter ini kita akan belajar tentang function atau fungsi.",source:"@site/docs/basic/function.md",sourceDirName:"basic",slug:"/basic/function",permalink:"/basic/function",draft:!1,tags:[],version:"current",sidebarPosition:17,frontMatter:{sidebar_position:17,title:"A.17. Function",sidebar_label:"A.17. Function"},sidebar:"tutorialSidebar",previous:{title:"A.16. Vector",permalink:"/basic/vector"},next:{title:"A.18. Module System \u279c Path & Item",permalink:"/basic/path-item"}},u={},m=[{value:"A.17.1. Keyword fn",id:"a171-keyword-fn",level:2},{value:"A.17.2. Naming convention fungsi",id:"a172-naming-convention-fungsi",level:2},{value:"A.17.3. Parameter fungsi dan argumen fungsi",id:"a173-parameter-fungsi-dan-argumen-fungsi",level:2},{value:"A.17.4. Nilai balik fungsi (return value)",id:"a174-nilai-balik-fungsi-return-value",level:2},{value:"\u25c9 Keyword return untuk penentuan nilai balik",id:"-keyword-return-untuk-penentuan-nilai-balik",level:3},{value:"\u25c9 Return value tanpa keyword return",id:"-return-value-tanpa-keyword-return",level:3},{value:"\u25c9 Statemen sebagai return value tanpa keyword return",id:"-statemen-sebagai-return-value-tanpa-keyword-return",level:3},{value:"\u25c9 Macro format untuk membuat formatted string",id:"-macro-format-untuk-membuat-formatted-string",level:3},{value:"A.17.5. Conditional return value",id:"a175-conditional-return-value",level:2},{value:"A.17.6. Nilai balik fungsi bertipe string literal &str",id:"a176-nilai-balik-fungsi-bertipe-string-literal-str",level:2},{value:"A.17.7. Default return value",id:"a177-default-return-value",level:2},{value:"A.17.8. Pembahasan lanjutan",id:"a178-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function k(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},d,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang ",(0,i.kt)("em",{parentName:"p"},"function")," atau fungsi."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Definisi fungsi dalam programming secara terminologi adalah sebuah modul atau sub-program kecil yang digunakan untuk mengeksekusi sebuah perintah, dan bisa di-",(0,i.kt)("em",{parentName:"p"},"reuse")," dalam penggunaannya.")),(0,i.kt)("h2",{id:"a171-keyword-fn"},"A.17.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"fn")),(0,i.kt)("p",null,"Fungsi di Rust dibuat menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"fn"),". Salah satu contoh penerapan keyword ini dalam pembuatan fungsi sudah kita praktikkan berulang kali pada definisi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", yang merupakan fungsi utama atau entrypoint sebuah program."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n\n}\n")),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," ini spesial, ketika program dijalankan maka ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," otomatis dipanggil atau dieksekusi."),(0,i.kt)("p",null,"Pembuatan fungsi lainnya-pun juga didefinisikan dengan notasi penulisan yang sama. Pada contoh berikut kita akan buat fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"greet")," yang tugasnya adalah menampilkan message ke layar output."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn greet() {\n println!("hello world");\n}\n')),(0,i.kt)("p",null,"Panggil fungsi tersebut di ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", lalu run program."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n println!("hello rust");\n greet();\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(2114).Z,width:"447",height:"86"})),(0,i.kt)("p",null,"Bisa dilihat ada 2 message muncul, yang pertama adalah pesan ",(0,i.kt)("inlineCode",{parentName:"p"},"hello rust")," yang muncul hasil eksekusi statement ",(0,i.kt)("inlineCode",{parentName:"p"},'println!("hello rust")'),", lalu diikuti ",(0,i.kt)("inlineCode",{parentName:"p"},"hello world")," yang statement print untuk menampilkan message tersebut ada dalam fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet"),"."),(0,i.kt)("p",null,"O iya, definisi fungsi tidak mengenal urutan ya. Sebagai contoh fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," di atas, bebas mana yang ditulis lebih dulu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn greet() {\n // ..\n}\n\nfn main() {\n // ..\n}\n")),(0,i.kt)("p",null,"... atau ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n // ..\n}\n\nfn greet() {\n // ..\n}\n")),(0,i.kt)("h2",{id:"a172-naming-convention-fungsi"},"A.17.2. ",(0,i.kt)("em",{parentName:"h2"},"Naming convention")," fungsi"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", aturan penulisan nama fungsi di Rust adalah menggunakan ",(0,i.kt)("strong",{parentName:"p"},"snake case"),". Nama fungsi dituliskan dalam huruf kecil dengan separator tanda garis bawah atau underscore (",(0,i.kt)("inlineCode",{parentName:"p"},"_"),"). Contohnya seperti: ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_message"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"get_report_Status"),", dll."),(0,i.kt)("h2",{id:"a173-parameter-fungsi-dan-argumen-fungsi"},"A.17.3. Parameter fungsi dan argumen fungsi"),(0,i.kt)("p",null,"Fungsi bisa didefinisikan dengan disertai parameter, dengan itu bisa menyisipkan data saat pemanggilan fungsi."),(0,i.kt)("p",null,"Parameter dituliskan di statement pendefinisian fungsi dengan notasi seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn func_name(param_a: i32) {\n // ...\n}\n\nfn func_name(param_a: i32, param_b: bool) {\n // ...\n}\n\nfn func_name(param_a: i32, param_b: bool, param_c: &str) {\n // ...\n}\n\n// ...\n")),(0,i.kt)("p",null,"Kembali ke praktik, pada bagian ini kita akan buat sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_custom_message"),". Fungsi ini tugasnya masih sama seperti seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"greet")," hanya saja pesan yang ditampilkan adalah sesuai dengan value parameter fungsi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn greet_custom_message(name: &str, message: &str) {\n println!("hi {name}, {message}");\n}\n')),(0,i.kt)("p",null,"Ada dua parameter yang didefinisikan:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"name"),", tipe datanya string literal"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"message"),", tipe datanya juga string literal")),(0,i.kt)("p",null,"Kedua nilai parameter tersebut di-",(0,i.kt)("em",{parentName:"p"},"combine")," lalu di-print menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),"."),(0,i.kt)("p",null,"Ok, sekarang panggil fungsi tersebut dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", sisipkan argumen pertama ",(0,i.kt)("inlineCode",{parentName:"p"},"Damian")," yang ditampung parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"name"),", dan argumen ke-2 ",(0,i.kt)("inlineCode",{parentName:"p"},"welcome to the castle!")," untuk parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"message")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n greet_custom_message("Damian", "welcome to the castle!");\n}\n')),(0,i.kt)("p",null,"Jalankan program. Output bisa dilihat di gambar berikut."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(4002).Z,width:"450",height:"71"})),(0,i.kt)("p",null,"O iya, parameter bisa memiliki tipe data apa saja selama di-",(0,i.kt)("em",{parentName:"p"},"support")," oleh Rust, jadi tidak hanya string literal ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Secara terminologi, parameter adalah variabel yang didefinisikan di fungsi, sedangkan argumen adalah nilai yang disisipkan pada parameter saat pemanggilan fungsi."),(0,i.kt)("p",{parentName:"blockquote"},"Seiring berjalannya waktu, terjadi ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/book/ch03-03-how-functions-work.html#parameters"},"sedikit perubahan")," mengenai makna untuk istilah ",(0,i.kt)("inlineCode",{parentName:"p"},"parameter")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"argumen"),". Sekarang kedua istilah tersebut lebih sering dimaknai sama.")),(0,i.kt)("h2",{id:"a174-nilai-balik-fungsi-return-value"},"A.17.4. Nilai balik fungsi (",(0,i.kt)("em",{parentName:"h2"},"return value"),")"),(0,i.kt)("p",null,"Sebuah fungsi bisa di-desain memiliki nilai balik. Caranya dengan menambahkan tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"->")," diikuti tipe data dari nilai balik pada pendefinisian fungsi."),(0,i.kt)("p",null,"Pada contoh berikut, sebuah fungsi dibuat dengan nama ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1"),", memiliki 3 buah parameter bertipe numerik (",(0,i.kt)("inlineCode",{parentName:"p"},"width"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"height"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"length"),"), dan nilai balik bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),". Tugas dari fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1")," adalah melakukan operasi matematika perhitungan volume terhadap data yang didapat dari parameter, yang kemudian hasil kalkulasinya dijadikan nilai balik."),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," (diikuti dengan data) digunakan untuk menentukan nilai balik suatu fungsi. Pada contoh berikut, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"volume")," adalah nilai balik fungsi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn calculate_box_volume1(width: i32, height: i32, length: i32) -> i32 {\n let volume = width * height * length;\n return volume;\n}\n")),(0,i.kt)("p",null,"Selanjutnya siapkan beberapa variabel yang nantinya digunakan saat pemanggilan ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1"),". Lalu panggil fungsi tersebut kemudian tampilkan ",(0,i.kt)("em",{parentName:"p"},"return value"),"-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let width = 5;\nlet height = 8;\nlet length = 12;\n\nlet res1 = calculate_box_volume1(width, height, length);\nprintln!("result: {res1}");\n')),(0,i.kt)("p",null,"Jalankan program, hasilnya adalah sesuai harapan. Volume dari persegi panjang dengan data ",(0,i.kt)("inlineCode",{parentName:"p"},"5 x 8 x 12")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"480"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(9031).Z,width:"451",height:"64"})),(0,i.kt)("h3",{id:"-keyword-return-untuk-penentuan-nilai-balik"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"return")," untuk penentuan nilai balik"),(0,i.kt)("p",null,"Salah satu hal yang unik yang ada di Rust adalah beberapa variasi cara penulisan nilai balik fungsi. Cara pertama adalah menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," seperti yang sudah dipraktikkan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn calculate_box_volume1(width: i32, height: i32, length: i32) -> i32 {\n let volume = width * height * length;\n return volume;\n}\n")),(0,i.kt)("p",null,"Untuk cara ini penulis rasa cukup jelas."),(0,i.kt)("h3",{id:"-return-value-tanpa-keyword-return"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Return value")," tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"return")),(0,i.kt)("p",null,"Cara ke-2 kita langsung praktikkan menggunakan kode berikut, silakan tulis lalu jalankan program:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_box_volume2(width: i32, height: i32, length: i32) -> i32 {\n let volume = width * height * length;\n volume\n}\n\nfn main() {\n let name2 = "Damian";\n let res2 = calculate_box_volume2(width, height, length);\n println!("hi {name2}, the box volume is {res2}");\n}\n')),(0,i.kt)("p",null,"Hasilnya kurang lebih sama, hanya di-bagian outputnya beda karena pada contoh ini pesan yang ditampilkan diubah."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(3307).Z,width:"446",height:"67"})),(0,i.kt)("p",null,"Sekarang kita fokus ke kode yang sudah ditulis. Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume2")," kurang lebih struktur dan isinya sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1"),", bedanya hanya pada dua hal:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"calculate_box_volume2")," nilai baliknya dituliskan tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"li"},"return")),(0,i.kt)("li",{parentName:"ul"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"calculate_box_volume2")," pada statement terakhir tidak diakhir tanda akhir statement ",(0,i.kt)("inlineCode",{parentName:"li"},";"))),(0,i.kt)("p",null,"Kedua poin tersebut merupakan syarat untuk penerapan ",(0,i.kt)("em",{parentName:"p"},"return value")," tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return"),". Caranya kurang lebih adalah dengan menuliskan data nilai balik dengan tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," dan di akhir statement tidak ditambahi tanda semicolon ",(0,i.kt)("inlineCode",{parentName:"p"},";"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Statement terakhir sebuah blok kode fungsi yang ditulis tanpa semicolon ",(0,i.kt)("inlineCode",{parentName:"p"},";")," disebut sebagai ",(0,i.kt)("inlineCode",{parentName:"p"},"tail")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"body tail"),".")),(0,i.kt)("h3",{id:"-statemen-sebagai-return-value-tanpa-keyword-return"},"\u25c9 Statemen sebagai ",(0,i.kt)("em",{parentName:"h3"},"return value")," tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"return")),(0,i.kt)("p",null,"Cara selanjutnya yang akan kita bahas ini sebenarnya sama seperti sebelumnya, hanya saja bedanya di sini tidak menggunakan nama variabel sebagai nilai balik, melainkan langsung statement, yang hasil eksekusi statement tersebut dijadikan nilai balik fungsi."),(0,i.kt)("p",null,"Langsung saja kita praktikkan. Siapkan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume3")," berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_box_volume3(width: i32, height: i32, length: i32) -> i32 {\n width * height * length\n}\n\nfn greet_custom_message(name: &str, message: &str) {\n println!("hi {name}, {message}");\n}\n')),(0,i.kt)("p",null,"Panggil fungsi tersebut, tampung nilai baliknya ke variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"res3"),". Lalu siapkan ",(0,i.kt)("inlineCode",{parentName:"p"},"message3")," yang isinya adalah sebuah pesan string literal yang dibuat menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format"),". Terakhir tampilkan pesan tersebut menggunakan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_custom_message"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let res3 = calculate_box_volume3(width, height, length);\n let message3 = format!("the box volume is {}", res3);\n\n greet_custom_message("Damian", message3.as_str());\n}\n')),(0,i.kt)("p",null,"Bisa dilihat hasilnya sama seperti pada program sebelumnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(3307).Z,width:"446",height:"67"})),(0,i.kt)("h3",{id:"-macro-format-untuk-membuat-formatted-string"},"\u25c9 Macro ",(0,i.kt)("inlineCode",{parentName:"h3"},"format")," untuk membuat ",(0,i.kt)("em",{parentName:"h3"},"formatted")," string"),(0,i.kt)("p",null,"Bagian ini adalah penjelasan tambahan dari kode program yang baru saja dipraktikkan."),(0,i.kt)("p",null,"Macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format")," digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"formatting")," sebuah string. ",(0,i.kt)("em",{parentName:"p"},"Formatting")," di sini maksudnya adalah pembuatan string dengan menggunakan teknik penyusunan isi string dalam format tertentu, mirip seperti yang dilakukan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"print")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),", bedanya hanya pada macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format")," hasilnya bukan sebuah output ke console output, melainkan sebagai nilai balik."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// 2 bari statements berikut ...\nlet message3 = format!("the box volume is {}", res3);\nprintln!("{}", message3.as_str());\n\n// ... adalah sama dengan statement berikut ...\nprintln!("the box volume is {}", res3);\n')),(0,i.kt)("p",null,"Satu hal yang penting diketahui dari macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format"),". Nilai balik macro ini bukanlah string literal ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", tetapi tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". ",(0,i.kt)("strong",{parentName:"p"},"Dua tipe tersebut adalah berbeda"),"."),(0,i.kt)("p",null,"Pada contoh di atas, method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str")," milik tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," digunakan untuk mengambil data string literal-nya. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str")," ini menghasilkan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," dari sebuah ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("h2",{id:"a175-conditional-return-value"},"A.17.5. ",(0,i.kt)("em",{parentName:"h2"},"Conditional return value")),(0,i.kt)("p",null,"Kapan harus menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," dalam penentuan nilai balik dan kapan tidak? Jawabannya mungkin adalah preferensi, tapi di luar itu ada juga case di mana keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," harus digunakan, yaitu pada fungsi yang memiliki nilai balik terkondisi. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn get_score_message(score: f32) -> &\'static str {\n if score == 100.0 {\n return "you got a perfect score!"\n }\n \n if score > 76.0 {\n return "congrats, you passed the exam!"\n }\n\n "your score is below the passing grade"\n}\n\nfn main() {\n println!("{}", get_score_message(100.0));\n println!("{}", get_score_message(98.2));\n println!("{}", get_score_message(33.12));\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(6415).Z,width:"446",height:"100"})),(0,i.kt)("p",null,"Teknik penentuan nilai balik tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," hanya bisa dipergunakan di akhir blok kode, contohnya pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"get_score_message")," statement terakhir blok kode adalah string literal ",(0,i.kt)("inlineCode",{parentName:"p"},'"your score is below the passing grade"'),"."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Jika pada selain akhir blok ada kondisi di mana nilai balik harus ditentukan, maka wajib menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"strong"},"return")),". Bisa dilihat pada fungsi yang sudah ditulis, ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," statement dalam blok kode seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," dipergunakan."),(0,i.kt)("h2",{id:"a176-nilai-balik-fungsi-bertipe-string-literal-str"},"A.17.6. Nilai balik fungsi bertipe string literal ",(0,i.kt)("inlineCode",{parentName:"h2"},"&str")),(0,i.kt)("p",null,"Khusus untuk beberapa jenis tipe data, seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", jika digunakan sebagai tipe data ",(0,i.kt)("em",{parentName:"p"},"return value")," fungsi harus ditambahi keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"static")," dengan penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"&'static str"),". Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn get_score_message(score: f32) -> &\'static str {\n return "you got a perfect score!"\n}\n')),(0,i.kt)("p",null,"Agar tidak makin bingung, pembahasannya dipisah pada chapter lain, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/static"},"Static")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/lifetime"},"Lifetime"),"."),(0,i.kt)("h2",{id:"a177-default-return-value"},"A.17.7. ",(0,i.kt)("em",{parentName:"h2"},"Default return value")),(0,i.kt)("p",null,"Tambahan info saja, bahwa di Rust, semua fungsi itu memiliki nilai balik, yep semuanya. Untuk fungsi yang tidak didefinisikan nilai baliknya maka nilai baliknya adalah tuple kosong ",(0,i.kt)("inlineCode",{parentName:"p"},"()"),". Sebagai contoh fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_custom_message")," yang sudah ditulis, coba saja tampung nilai baliknya dan print. Outputnya adalah ",(0,i.kt)("em",{parentName:"p"},"empty tuple")," atau tuple kosong ",(0,i.kt)("inlineCode",{parentName:"p"},"()"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let a = greet_custom_message("Damian", "welcome to the castle!");\nprintln!("result: {:?}", a);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(3438).Z,width:"628",height:"237"})),(0,i.kt)("h2",{id:"a178-pembahasan-lanjutan"},"A.17.8. Pembahasan lanjutan"),(0,i.kt)("p",null,"Ada beberapa topik lainnya yang relevan dengan function, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Associated function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/associated-function"},"Associated Function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Method"),", pembahasannya juga di chapter terpisah, yaitu ",(0,i.kt)("a",{parentName:"li",href:"/basic/method"},"Method"))),(0,i.kt)("p",null,"Selain itu nantinya juga ada pembahasan mengenai topik yang cukup advance yang berhubungan dengan fungsi, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Unsafe function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/safe-unsafe"},"Safe & Unsafe")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Async function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/async"},"Async")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Constant function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/constant-evaluation"},"Constant Evaluation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Trait \u279c Function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-function"},"Trait \u279c Function"))),(0,i.kt)("p",null,"Untuk sekarang silakan lanjut ke pembahasan chapter berikutnya terlebih dahulu, jangan langsung loncat ke chapter di atas."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/function"},"github.com/novalagung/dasarpemrogramanrust-example/../function")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang diverging function (",(0,i.kt)("inlineCode",{parentName:"li"},"() -> !"),")")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-03-how-functions-work.html"},"https://doc.rust-lang.org/book/ch03-03-how-functions-work.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.fn.html"},"https://doc.rust-lang.org/std/keyword.fn.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.return.html"},"https://doc.rust-lang.org/std/keyword.return.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.static.html"},"https://doc.rust-lang.org/std/keyword.static.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/fn.html"},"https://doc.rust-lang.org/rust-by-example/fn.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html"))))}k.isMDXComponent=!0},2114:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABWCAIAAADQTQ/bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTI6MzA6MjQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjAwOjU5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjAwOjU5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRiMDQ1ZjEzLTU0MDQt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"},4002:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABHCAIAAAAbcNDNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTM6MTU6MjArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjAyOjE1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjAyOjE1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgzNTc1ZGM5LTI2MmMt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"},9031:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcMAAABACAIAAADpt4tLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTM6NDM6NTIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjAzOjIyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjAzOjIyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZlZTI4ZDM4LTk2ZmYt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"},3307:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAABDCAIAAABslPfNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTM6NTM6MjUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjA0OjM1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjA0OjM1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU1YmRkNDdiLTkwNDQt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"},6415:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAABkCAIAAAB2PcJDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTQ6NDU6MDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjA1OjE2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjA1OjE2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmVjMTM4MzNjLTYxOWYt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"},3438:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/function-6-2ed9468eff22575ec04867323e17a7b2.png"}}]); \ No newline at end of file diff --git a/assets/js/c526a898.e25aff7f.js b/assets/js/c526a898.e25aff7f.js deleted file mode 100644 index c6eabc40..00000000 --- a/assets/js/c526a898.e25aff7f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[9157],{3905:(a,e,n)=>{n.d(e,{Zo:()=>d,kt:()=>o});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function r(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var u=t.createContext({}),m=function(a){var e=t.useContext(u),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},d=function(a){var e=m(a.components);return t.createElement(u.Provider,{value:e},a.children)},k={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},s=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,l=a.originalType,u=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),s=m(n),o=i,g=s["".concat(u,".").concat(o)]||s[o]||k[o]||l;return n?t.createElement(g,r(r({ref:e},d),{},{components:n})):t.createElement(g,r({ref:e},d))}));function o(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var l=n.length,r=new Array(l);r[0]=s;var p={};for(var u in e)hasOwnProperty.call(e,u)&&(p[u]=e[u]);p.originalType=a,p.mdxType="string"==typeof a?a:i,r[1]=p;for(var m=2;m{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>r,default:()=>k,frontMatter:()=>l,metadata:()=>p,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:17,title:"A.17. Function",sidebar_label:"A.17. Function"},r=void 0,p={unversionedId:"basic/function",id:"basic/function",title:"A.17. Function",description:"Pada chapter ini kita akan belajar tentang function atau fungsi.",source:"@site/docs/basic/function.md",sourceDirName:"basic",slug:"/basic/function",permalink:"/basic/function",draft:!1,tags:[],version:"current",sidebarPosition:17,frontMatter:{sidebar_position:17,title:"A.17. Function",sidebar_label:"A.17. Function"},sidebar:"tutorialSidebar",previous:{title:"A.16. Vector",permalink:"/basic/vector"},next:{title:"A.18. Module System \u279c Path & Item",permalink:"/basic/path-item"}},u={},m=[{value:"A.17.1. Keyword fn",id:"a171-keyword-fn",level:2},{value:"A.17.2. Naming convention fungsi",id:"a172-naming-convention-fungsi",level:2},{value:"A.17.3. Parameter fungsi dan argumen fungsi",id:"a173-parameter-fungsi-dan-argumen-fungsi",level:2},{value:"A.17.4. Nilai balik fungsi (return value)",id:"a174-nilai-balik-fungsi-return-value",level:2},{value:"\u25c9 Keyword return untuk penentuan nilai balik",id:"-keyword-return-untuk-penentuan-nilai-balik",level:3},{value:"\u25c9 Return value tanpa keyword return",id:"-return-value-tanpa-keyword-return",level:3},{value:"\u25c9 Statemen sebagai return value tanpa keyword return",id:"-statemen-sebagai-return-value-tanpa-keyword-return",level:3},{value:"\u25c9 Macro format untuk membuat formatted string",id:"-macro-format-untuk-membuat-formatted-string",level:3},{value:"A.17.5. Conditional return value",id:"a175-conditional-return-value",level:2},{value:"A.17.6. Nilai balik fungsi bertipe string literal &str",id:"a176-nilai-balik-fungsi-bertipe-string-literal-str",level:2},{value:"A.17.7. Default return value",id:"a177-default-return-value",level:2},{value:"A.17.8. Pembahasan lanjutan",id:"a178-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:m};function k(a){let{components:e,...l}=a;return(0,i.kt)("wrapper",(0,t.Z)({},d,l,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang ",(0,i.kt)("em",{parentName:"p"},"function")," atau fungsi."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Definisi fungsi dalam programming secara terminologi adalah sebuah modul atau sub-program kecil yang digunakan untuk mengeksekusi sebuah perintah, dan bisa di-",(0,i.kt)("em",{parentName:"p"},"reuse")," dalam penggunaannya.")),(0,i.kt)("h2",{id:"a171-keyword-fn"},"A.17.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"fn")),(0,i.kt)("p",null,"Fungsi di Rust dibuat menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"fn"),". Salah satu contoh penerapan keyword ini dalam pembuatan fungsi sudah kita praktikkan berulang kali pada definisi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", yang merupakan fungsi utama atau entrypoint sebuah program."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n\n}\n")),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," ini spesial, ketika program dijalankan maka ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," otomatis dipanggil atau dieksekusi."),(0,i.kt)("p",null,"Pembuatan fungsi lainnya-pun juga didefinisikan dengan notasi penulisan yang sama. Pada contoh berikut kita akan buat fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"greet")," yang tugasnya adalah menampilkan message ke layar output."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn greet() {\n println!("hello world");\n}\n')),(0,i.kt)("p",null,"Panggil fungsi tersebut di ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", lalu run program."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n println!("hello rust");\n greet();\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(2114).Z,width:"447",height:"86"})),(0,i.kt)("p",null,"Bisa dilihat ada 2 message muncul, yang pertama adalah pesan ",(0,i.kt)("inlineCode",{parentName:"p"},"hello rust")," yang muncul hasil eksekusi statement ",(0,i.kt)("inlineCode",{parentName:"p"},'println!("hello rust")'),", lalu diikuti ",(0,i.kt)("inlineCode",{parentName:"p"},"hello world")," yang statement print untuk menampilkan message tersebut ada dalam fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet"),"."),(0,i.kt)("p",null,"O iya, definisi fungsi tidak mengenal urutan ya. Sebagai contoh fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," di atas, bebas mana yang ditulis lebih dulu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn greet() {\n // ..\n}\n\nfn main() {\n // ..\n}\n")),(0,i.kt)("p",null,"... atau ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n // ..\n}\n\nfn greet() {\n // ..\n}\n")),(0,i.kt)("h2",{id:"a172-naming-convention-fungsi"},"A.17.2. ",(0,i.kt)("em",{parentName:"h2"},"Naming convention")," fungsi"),(0,i.kt)("p",null,"Sesuai anjuran di ",(0,i.kt)("a",{parentName:"p",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"halaman dokumentasi Rust"),", aturan penulisan nama fungsi di Rust adalah menggunakan ",(0,i.kt)("strong",{parentName:"p"},"snake case"),". Nama fungsi dituliskan dalam huruf kecil dengan separator tanda garis bawah atau underscore (",(0,i.kt)("inlineCode",{parentName:"p"},"_"),"). Contohnya seperti: ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_message"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"get_report_Status"),", dll."),(0,i.kt)("h2",{id:"a173-parameter-fungsi-dan-argumen-fungsi"},"A.17.3. Parameter fungsi dan argumen fungsi"),(0,i.kt)("p",null,"Fungsi bisa didefinisikan dengan disertai parameter, dengan itu bisa menyisipkan data saat pemanggilan fungsi."),(0,i.kt)("p",null,"Parameter dituliskan di statement pendefinisian fungsi dengan notasi seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn func_name(param_a: i32) {\n // ...\n}\n\nfn func_name(param_a: i32, param_b: bool) {\n // ...\n}\n\nfn func_name(param_a: i32, param_b: bool, param_c: &str) {\n // ...\n}\n\n// ...\n")),(0,i.kt)("p",null,"Kembali ke praktik, pada bagian ini kita akan buat sebuah fungsi bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_custom_message"),". Fungsi ini tugasnya masih sama seperti seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"greet")," hanya saja pesan yang ditampilkan adalah sesuai dengan value parameter fungsi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn greet_custom_message(name: &str, message: &str) {\n println!("hi {name}, {message}");\n}\n')),(0,i.kt)("p",null,"Ada dua parameter yang didefinisikan:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"name"),", tipe datanya string literal"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"message"),", tipe datanya juga string literal")),(0,i.kt)("p",null,"Kedua nilai parameter tersebut di-",(0,i.kt)("em",{parentName:"p"},"combine")," lalu di-print menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),"."),(0,i.kt)("p",null,"Ok, sekarang panggil fungsi tersebut dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),", sisipkan argumen pertama ",(0,i.kt)("inlineCode",{parentName:"p"},"Damian")," yang ditampung parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"name"),", dan argumen ke-2 ",(0,i.kt)("inlineCode",{parentName:"p"},"welcome to the castle!")," untuk parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"message")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n greet_custom_message("Damian", "welcome to the castle!");\n}\n')),(0,i.kt)("p",null,"Jalankan program. Output bisa dilihat di gambar berikut."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(4002).Z,width:"450",height:"71"})),(0,i.kt)("p",null,"O iya, parameter bisa memiliki tipe data apa saja selama di-",(0,i.kt)("em",{parentName:"p"},"support")," oleh Rust, jadi tidak hanya string literal ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Secara terminologi, parameter adalah variabel yang didefinisikan di fungsi, sedangkan argumen adalah nilai yang disisipkan pada parameter saat pemanggilan fungsi."),(0,i.kt)("p",{parentName:"blockquote"},"Seiring berjalannya waktu, terjadi ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/book/ch03-03-how-functions-work.html#parameters"},"sedikit perubahan")," mengenai makna untuk istilah ",(0,i.kt)("inlineCode",{parentName:"p"},"parameter")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"argumen"),". Sekarang kedua istilah tersebut lebih sering dimaknai sama.")),(0,i.kt)("h2",{id:"a174-nilai-balik-fungsi-return-value"},"A.17.4. Nilai balik fungsi (",(0,i.kt)("em",{parentName:"h2"},"return value"),")"),(0,i.kt)("p",null,"Sebuah fungsi bisa di-desain memiliki nilai balik. Caranya dengan menambahkan tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"->")," diikuti tipe data dari nilai balik pada pendefinisian fungsi."),(0,i.kt)("p",null,"Pada contoh berikut, sebuah fungsi dibuat dengan nama ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1"),", memiliki 3 buah parameter bertipe numerik (",(0,i.kt)("inlineCode",{parentName:"p"},"width"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"height"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"length"),"), dan nilai balik bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),". Tugas dari fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1")," adalah melakukan operasi matematika perhitungan volume terhadap data yang didapat dari parameter, yang kemudian hasil kalkulasinya dijadikan nilai balik."),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," (diikuti dengan data) digunakan untuk menentukan nilai balik suatu fungsi. Pada contoh berikut, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"volume")," adalah nilai balik fungsi."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn calculate_box_volume1(width: i32, height: i32, length: i32) -> i32 {\n let volume = width * height * length;\n return volume;\n}\n")),(0,i.kt)("p",null,"Selanjutnya siapkan beberapa variabel yang nantinya digunakan saat pemanggilan ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1"),". Lalu panggil fungsi tersebut kemudian tampilkan ",(0,i.kt)("em",{parentName:"p"},"return value"),"-nya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let width = 5;\nlet height = 8;\nlet length = 12;\n\nlet res1 = calculate_box_volume1(width, height, length);\nprintln!("result: {res1}");\n')),(0,i.kt)("p",null,"Jalankan program, hasilnya adalah sesuai harapan. Volume dari persegi panjang dengan data ",(0,i.kt)("inlineCode",{parentName:"p"},"5 x 8 x 12")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"480"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(9031).Z,width:"451",height:"64"})),(0,i.kt)("h3",{id:"-keyword-return-untuk-penentuan-nilai-balik"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"return")," untuk penentuan nilai balik"),(0,i.kt)("p",null,"Salah satu hal yang unik yang ada di Rust adalah beberapa variasi cara penulisan nilai balik fungsi. Cara pertama adalah menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," seperti yang sudah dipraktikkan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn calculate_box_volume1(width: i32, height: i32, length: i32) -> i32 {\n let volume = width * height * length;\n return volume;\n}\n")),(0,i.kt)("p",null,"Untuk cara ini penulis rasa cukup jelas."),(0,i.kt)("h3",{id:"-return-value-tanpa-keyword-return"},"\u25c9 ",(0,i.kt)("em",{parentName:"h3"},"Return value")," tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"return")),(0,i.kt)("p",null,"Cara ke-2 kita langsung praktikkan menggunakan kode berikut, silakan tulis lalu jalankan program:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_box_volume2(width: i32, height: i32, length: i32) -> i32 {\n let volume = width * height * length;\n volume\n}\n\nfn main() {\n let name2 = "Damian";\n let res2 = calculate_box_volume2(width, height, length);\n println!("hi {name2}, the box volume is {res2}");\n}\n')),(0,i.kt)("p",null,"Hasilnya kurang lebih sama, hanya di-bagian outputnya beda karena pada contoh ini pesan yang ditampilkan diubah."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(3307).Z,width:"446",height:"67"})),(0,i.kt)("p",null,"Sekarang kita fokus ke kode yang sudah ditulis. Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume2")," kurang lebih struktur dan isinya sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume1"),", bedanya hanya pada dua hal:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"calculate_box_volume2")," nilai baliknya dituliskan tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"li"},"return")),(0,i.kt)("li",{parentName:"ul"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"calculate_box_volume2")," pada statement terakhir tidak diakhir tanda akhir statement ",(0,i.kt)("inlineCode",{parentName:"li"},";"))),(0,i.kt)("p",null,"Kedua poin tersebut merupakan syarat untuk penerapan ",(0,i.kt)("em",{parentName:"p"},"return value")," tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return"),". Caranya kurang lebih adalah dengan menuliskan data nilai balik dengan tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," dan di akhir statement tidak ditambahi tanda semicolon ",(0,i.kt)("inlineCode",{parentName:"p"},";"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Statement terakhir sebuah blok kode fungsi yang ditulis tanpa semicolon ",(0,i.kt)("inlineCode",{parentName:"p"},";")," disebut sebagai ",(0,i.kt)("inlineCode",{parentName:"p"},"tail")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"body tail"),".")),(0,i.kt)("h3",{id:"-statemen-sebagai-return-value-tanpa-keyword-return"},"\u25c9 Statemen sebagai ",(0,i.kt)("em",{parentName:"h3"},"return value")," tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"return")),(0,i.kt)("p",null,"Cara selanjutnya yang akan kita bahas ini sebenarnya sama seperti sebelumnya, hanya saja bedanya di sini tidak menggunakan nama variabel sebagai nilai balik, melainkan langsung statement, yang hasil eksekusi statement tersebut dijadikan nilai balik fungsi."),(0,i.kt)("p",null,"Langsung saja kita praktikkan. Siapkan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_box_volume3")," berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_box_volume3(width: i32, height: i32, length: i32) -> i32 {\n width * height * length\n}\n\nfn greet_custom_message(name: &str, message: &str) {\n println!("hi {name}, {message}");\n}\n')),(0,i.kt)("p",null,"Panggil fungsi tersebut, tampung nilai baliknya ke variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"res3"),". Lalu siapkan ",(0,i.kt)("inlineCode",{parentName:"p"},"message3")," yang isinya adalah sebuah pesan string literal yang dibuat menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format"),". Terakhir tampilkan pesan tersebut menggunakan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_custom_message"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let res3 = calculate_box_volume3(width, height, length);\n let message3 = format!("the box volume is {}", res3);\n\n greet_custom_message("Damian", message3.as_str());\n}\n')),(0,i.kt)("p",null,"Bisa dilihat hasilnya sama seperti pada program sebelumnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(3307).Z,width:"446",height:"67"})),(0,i.kt)("h3",{id:"-macro-format-untuk-membuat-formatted-string"},"\u25c9 Macro ",(0,i.kt)("inlineCode",{parentName:"h3"},"format")," untuk membuat ",(0,i.kt)("em",{parentName:"h3"},"formatted")," string"),(0,i.kt)("p",null,"Bagian ini adalah penjelasan tambahan dari kode program yang baru saja dipraktikkan."),(0,i.kt)("p",null,"Macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format")," digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"formatting")," sebuah string. ",(0,i.kt)("em",{parentName:"p"},"Formatting")," di sini maksudnya adalah pembuatan string dengan menggunakan teknik penyusunan isi string dalam format tertentu, mirip seperti yang dilakukan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"print")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),", bedanya hanya pada macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format")," hasilnya bukan sebuah output ke console output, melainkan sebagai nilai balik."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// 2 bari statements berikut ...\nlet message3 = format!("the box volume is {}", res3);\nprintln!("{}", message3.as_str());\n\n// ... adalah sama dengan statement berikut ...\nprintln!("the box volume is {}", res3);\n')),(0,i.kt)("p",null,"Satu hal yang penting diketahui dari macro ",(0,i.kt)("inlineCode",{parentName:"p"},"format"),". Nilai balik macro ini bukanlah string literal ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", tetapi tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". ",(0,i.kt)("strong",{parentName:"p"},"Dua tipe tersebut adalah berbeda"),"."),(0,i.kt)("p",null,"Pada contoh di atas, method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str")," milik tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," digunakan untuk mengambil data string literal-nya. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"as_str")," ini menghasilkan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," dari sebuah ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("h2",{id:"a175-conditional-return-value"},"A.17.5. ",(0,i.kt)("em",{parentName:"h2"},"Conditional return value")),(0,i.kt)("p",null,"Kapan harus menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," dalam penentuan nilai balik dan kapan tidak? Jawabannya mungkin adalah preferensi, tapi di luar itu ada juga case dimana keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," harus digunakan, yaitu pada fungsi yang memiliki nilai balik terkondisi. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn get_score_message(score: f32) -> &\'static str {\n if score == 100.0 {\n return "you got a perfect score!"\n }\n \n if score > 76.0 {\n return "congrats, you passed the exam!"\n }\n\n "your score is below the passing grade"\n}\n\nfn main() {\n println!("{}", get_score_message(100.0));\n println!("{}", get_score_message(98.2));\n println!("{}", get_score_message(33.12));\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(6415).Z,width:"446",height:"100"})),(0,i.kt)("p",null,"Teknik penentuan nilai balik tanpa keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," hanya bisa dipergunakan di akhir blok kode, contohnya pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"get_score_message")," statement terakhir blok kode adalah string literal ",(0,i.kt)("inlineCode",{parentName:"p"},'"your score is below the passing grade"'),"."),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"Jika pada selain akhir blok ada kondisi dimana nilai balik harus ditentukan, maka wajib menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"strong"},"return")),". Bisa dilihat pada fungsi yang sudah ditulis, ",(0,i.kt)("inlineCode",{parentName:"p"},"return")," statement dalam blok kode seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," dipergunakan."),(0,i.kt)("h2",{id:"a176-nilai-balik-fungsi-bertipe-string-literal-str"},"A.17.6. Nilai balik fungsi bertipe string literal ",(0,i.kt)("inlineCode",{parentName:"h2"},"&str")),(0,i.kt)("p",null,"Khusus untuk beberapa jenis tipe data, seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),", jika digunakan sebagai tipe data ",(0,i.kt)("em",{parentName:"p"},"return value")," fungsi harus ditambahi keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"static")," dengan penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"&'static str"),". Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn get_score_message(score: f32) -> &\'static str {\n return "you got a perfect score!"\n}\n')),(0,i.kt)("p",null,"Agar tidak makin bingung, pembahasannya dipisah pada chapter lain, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/static"},"Static")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/lifetime"},"Lifetime"),"."),(0,i.kt)("h2",{id:"a177-default-return-value"},"A.17.7. ",(0,i.kt)("em",{parentName:"h2"},"Default return value")),(0,i.kt)("p",null,"Tambahan info saja, bahwa di Rust, semua fungsi itu memiliki nilai balik, yep semuanya. Untuk fungsi yang tidak didefinisikan nilai baliknya maka nilai baliknya adalah tuple kosong ",(0,i.kt)("inlineCode",{parentName:"p"},"()"),". Sebagai contoh fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"greet_custom_message")," yang sudah ditulis, coba saja tampung nilai baliknya dan print. Outputnya adalah ",(0,i.kt)("em",{parentName:"p"},"empty tuple")," atau tuple kosong ",(0,i.kt)("inlineCode",{parentName:"p"},"()"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let a = greet_custom_message("Damian", "welcome to the castle!");\nprintln!("result: {:?}", a);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"function",src:n(3438).Z,width:"628",height:"237"})),(0,i.kt)("h2",{id:"a178-pembahasan-lanjutan"},"A.17.8. Pembahasan lanjutan"),(0,i.kt)("p",null,"Ada beberapa topik lainnya yang relevan dengan function, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Associated function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/associated-function"},"Associated Function")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Method"),", pembahasannya juga di chapter terpisah, yaitu ",(0,i.kt)("a",{parentName:"li",href:"/basic/method"},"Method"))),(0,i.kt)("p",null,"Selain itu nantinya juga ada pembahasan mengenai topik yang cukup advance yang berhubungan dengan fungsi, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Unsafe function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/safe-unsafe"},"Safe & Unsafe")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Async function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/async"},"Async")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Constant function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/constant-evaluation"},"Constant Evaluation")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("strong",{parentName:"li"},"Trait \u279c Function"),", pembahasannya ada di chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-function"},"Trait \u279c Function"))),(0,i.kt)("p",null,"Untuk sekarang silakan lanjut ke pembahasan chapter berikutnya terlebih dahulu, jangan langsung loncat ke chapter di atas."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/function"},"github.com/novalagung/dasarpemrogramanrust-example/../function")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang diverging function (",(0,i.kt)("inlineCode",{parentName:"li"},"() -> !"),")")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch03-03-how-functions-work.html"},"https://doc.rust-lang.org/book/ch03-03-how-functions-work.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.fn.html"},"https://doc.rust-lang.org/std/keyword.fn.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.return.html"},"https://doc.rust-lang.org/std/keyword.return.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.static.html"},"https://doc.rust-lang.org/std/keyword.static.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/fn.html"},"https://doc.rust-lang.org/rust-by-example/fn.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://rust-lang.github.io/api-guidelines/naming.html"},"https://rust-lang.github.io/api-guidelines/naming.html"))))}k.isMDXComponent=!0},2114:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABWCAIAAADQTQ/bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTI6MzA6MjQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjAwOjU5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjAwOjU5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRiMDQ1ZjEzLTU0MDQt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"},4002:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAABHCAIAAAAbcNDNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTM6MTU6MjArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjAyOjE1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjAyOjE1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjgzNTc1ZGM5LTI2MmMt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"},9031:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcMAAABACAIAAADpt4tLAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTM6NDM6NTIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjAzOjIyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjAzOjIyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZlZTI4ZDM4LTk2ZmYt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"},3307:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAABDCAIAAABslPfNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTM6NTM6MjUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjA0OjM1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjA0OjM1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjU1YmRkNDdiLTkwNDQt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"},6415:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAABkCAIAAAB2PcJDAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTQ6NDU6MDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjA1OjE2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjA1OjE2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmVjMTM4MzNjLTYxOWYtZWI0Mi1iZjE3LWYxZmQwNGI3ZWRjNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDplYzEzODMzYy02MTlmLWViNDItYmYxNy1mMWZkMDRiN2VkYzYiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplYzEzODMzYy02MTlmLWViNDItYmYxNy1mMWZkMDRiN2VkYzYiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmVjMTM4MzNjLTYxOWYtZWI0Mi1iZjE3LWYxZmQwNGI3ZWRjNiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xMFQxNDo0NTowMyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp588r8AAA4QSURBVHja7Z07cuQ2FEW9EmmcOXY8nlSZ5cSBAk2mcqpy1VRN1gvRErQK5V6Uu/nF5z3ggQTRbOrcmipNs0Hiy8MHkLz9yx1CCKFC/UITIIQQ6EQIIdCJEEKgEyGEQCdCCIFOhBBCoBMhhD4JOn+///n3r/9+q5SyS/PP75uV4e7x5cfr89cqNT8falCtIy7I35S1PWWjprMd8+vz64+Xx2atZOzROdHqsrUaJpnqn1PYq1JnLH0idN7/+/evP+d/X77/5mHr54MVcJmUN4bONkNIyQh01r/AmLMzle3aI6QvZr4ItlTrx9Iln4LLTp98zmu+aC24bF0XnQ/b5wM6r5nREdFZdF7bc7sJdBYgsUFRnUvT5b+57LoWfpmK5TV40VVuj+h0QtEHl2Jfvn+7H7b/ef+HlnKKQ92UPTq/jemH3b0jzIh0d0+j07nczX0WXQODDsn1TzTavN4dP5z/nlNNF0yv9/0CCSm9cjsHmLe7x3t5Hi7Tj/PlWkgZHXX8RgwKxKZbGb7YumNowqDpxEYOQpLhqErdxe4QuzvuIys6tY7zvhmP2Q+k6YvxsEKN4lbSMxJx6Cb3i2+4FpS1Z3JoZAfKkGCuglcZp7B6jfYfdfpfDTi7/0sIIYODXD6GvJN3d3acNrqRZibqdE+KqQecjVM/emdPdiyZ0emN+wloHjLClHKZU5FPN3rPn5y/4lBTl7mkBjEVoxSd5u4QG0RG57z71JwyE4TuUOgj9tHaqPPr88u4wW9kF4XBWHQyF/tI6xop90ShrVF3tj3zbeFWOD2OnL3Gge01iH2qsJe1zg5tOjoHXIZEE9DpH0re/Y9vX5zV1ft/uoP89eDsm0Sn37pjX/hL4+NW/2qWX103ojPcGAQ43VatoAXo9AabBZ1uIwgNopdoBTrN3SEkjVpp/OA2aFiG+FSXr47pOUfYghUm7B73X12ivig1kgetkpFQwvgKsGDObm1P8ejDZSq8tKslCVINzPUHto2dNxJ12tDZM1GasPu7d5T0/z3cff9zFTrjSGO+cI5Xttw4WoXO6OQWSfG4JTq9E1FqEDs6hcBNS2vuDvEkTYX2cxziZb0cnTqAl6MzqOmIThF8YY20QSsfQV5vmqbWcfcYI7jl6AwXh5SkQXzqRp1OlB6GsLnVpGOhc1LHwXkanow63V3WoVPsueELAznrRZ1SPLV51Bk8kSI2SLOoU+4OIWlqwq4wu07UGYJoGTrj+PIxMd0WFsOVPI1Rp1aSFlFnMDT0zIIl3l7C7tLCdKL8B0VnH35q6BR3nHfpp/CJtc5g1ci5gkvd3EHz8fk1f/0V0emszCXW5txu9oIKd+HxNV4Vq4VO62RObLqVa5327nBLKS0TT41csIZnRqfcR2XojHYL1ir1qFO/lmiDVgw7008vLKjRcnT2hXcuAsGsWy7rVAe/6hImM2NvV+j0b3AP8BLZp6cM749r5PUT9wn6WLX7eKFn4g67cwPQCSe1e8fzevTy6Vh/l1u/reFdXIV7hcKwTt14dxYB3L9ySnmjUgC56dbdYbd2h9IgQiOLd6PVutvQKfbRktmtckO8ex7CFnXKzyF4g0R6OkKKlNUnI/MVKmzP5BGiJZUcOvU43PisJy9i7ki1H4Vr+xjjkRS0XMkT3jvtrDo12tdzndcV6ASdKLEGkJzW3hA6a9Wo/ttEoBNVGd4132EHnTX6YvOXyxu9w16tRpXfYQedCCH0aQQ6EUIIdCKEEOhECCHQeS0VmMhZND+fvhtl1+43dWPLvD/cwsB5X465Oxwh6Ljo9N5Ar0m6Evtks6TnO65pp5h7vnxbI0s19wVGiMswvT+z8SbPNCHQ6b0KOTh0FFsU7z302zKjDP429gBWjrDB81GHf9Yagc4V6AxsNKUXMSP/Y7spspwyfr/T96/LRhg7d6Ld0ANYRVrS5CJn3hxaAxf4NMc7z7GxwUZXbCX3nWnv7drCn3lAoHPrqLMzN0q9w+4bGNtNkXX/436VQLRWWhQQtXSijTe39QCO/EF+GN9QVtxtFecak+1T3vs588KL3PJTkYLfdpD6CIHOtugUI0ERnaaNOjrlSPY3JyytgE7x3N7GiTYVKN5dwQO4KOqUN2YNHNS6G7yfk2sJast3ez37llS6KScCnW2jzsjiqAU6uzROzGufradOnHZOtBEPmnsACzRajk71/lKR2ehCdOotHwbbqZQIdLafsM/Gw23RGdjQrUVnSyfa6KvmHsCZJYPyqHMVOnPezzl0Jlr+cb5o4BMAOveFTikCdRyIN0Bnl+OCSDM8467nRBuhpbUHsAA2CZ0282a18iaf5rz3c/zB8BM1U3XmQvAIEujcFToH2HUrntNPCc0OxIWhqMk+eUTzqsDzqk60MRMaeQCnCRb/xqzRvNkrll53zWhZ9n62oVNqJd+x2nmOtOjnkRHoPJiC9c3LisH8o+2bq6637nY3Kyzl5FYJAp2fSN7PuvURaEN0XsFb99DlRAh0NpM/YW/ITWHCvl8e3Uo5EQKdCCEEOhFCCHQihBDoRAghBDoRQgh0IoQQ6EQIIdCJEEKgEyGEEOisqtP7f4M+3p4OUJ+nt4+D1AQh0Dkwan+n9AWc76cj1Qh0IgQ6W3BmMTlBJ0KHR2cQXc0f5/nqeMJ5OMmxxdl9PkR4zMtBAqWO6SRPMeCc7Pz1lJdX5GBbz7jpizlzIegUdo/baXmNwl4IKipvkgqvlHPl1QAh0Jlg5/jBjVC6U3HcaETnfNBpb/mYBTHa09v7mCodQPXsGL6fSuLUc959AJJbPoV94u7dVqEg5hpJbSgcU246ofBaOccDg06Eqk3YnRN4POWDmKtLUYJOd//xBJaOeVo6vU3m7n/ZHT3khlvRDxfIDs7D2DLcPUHwAnRKsW24r9J0ceG1aoJOhOqjc0bGdG4Fp34xOh0muOFQdMwydAYBoR2d58LHwaRUqCStwt0Tt5LsF4NpHu5OzMNjKk0n5KJUE3QitAE6x3NxPrWkBdDiCXtw8qqLqkbQqAGiKepUdihBZ7y7WoryOHqqnXRMpekUdIJHhBqhsz8LPz7mE9Hl1BQ3Bmt8etyXX8PzpqW2W7/BIp4x6vSQFO9iRaeyu7x1yc3seQ/pmHLTSYXXSjT2GVxFqCY6hXsTTuAY36P+eDuZo075NnF08zd7P9pN9JZdLhAmrMJ2MzrVw7pb5bxs5dSWBxJNpxReqz7oRGgTdNZ75i+IOls/UMisFSHUBJ2rXp3JHS4xhwSdCKGbROcwD6wdFPoT9sYcA50IoUYTdoQQQqATIYRAJ0IIgU6EEAKdaBuVPzK221tkWN4h0Hl9QIBOLQHoRAh0gk7QidCu0Wny1tUshIW3LvMuvBmrY8UD2FqX6ubNBvvkGQxi4XMbg3cIcp7OStP1lTDZPCcY56XsNkzFcF7njOp+8Y95G8xST65p6h0P26IjotPqretaCPtuwaGrsezCq3kVx7HV6p+3qG7eLNsnizUSjyNuVN2XzSbQYtSZ6qNc9JdxdPa+juo+YtX56znKgE50JHRavXUV0EiuxgaHuMDdSEDnihNtA/NmwcjuSUkhFl7xQ4rsk/P5FEzYnT5S/Y/vckWarza66crsWui5oIJOdGR0Wr11ldNScjXWTk/Fq1hMHHkAL2JnVfNm4ZeL9BrFhQ83ivbJW6Az6X+cWQUIViEiHz6v7qATfbao0+Ktq4FGcDWWz/nUj1nogFB+/cdWqXrmzdqPdqRja7Hw40bDxL4eOm3U0lN2GZ2cCYpU9yQ6ETraWqfZW7fgtNTQKXoVJ5ff/C+fgpsPaajUM2+W7ZOz7stizbzcE1ctS12jDHIzgwVjIYyyxeXTbNSJWyg6HDrvrN66+agzbSGsexUHd3VVD+CsQXwy4ltj3pz1OZ5qJBZeq5F0WOf2eH9f39p1qRtfprv2ckofet2nMWgO6g460WdD53I1dzU2T+DrzhZ5tgYh0FmZZK1cjftwzMbDyubNoBMh0LkF0K7kaqyXp3LsCzoRAp0IIYRAJ0IIgU6EEAKdCCEEOm9Z01OJpSq4TTQ/8LjtfaXd3rla3MgtSsbrTQh07hSdG4Htdqw5QScCnQh0HuvKCTpRJXSuNgZWXI0zc9ko06zRssE+2Zi38GZndv9iC+EIbGGN7CjcxtV4E/NmqZELHLJTYewiL+24/TzP1r08i4xuMupcawwsuhoXBGJWo2U5I7uJr1gGc+QmWx0ncn+KXtIPahRlnSlLbVfjTcybtbobHbIzA3SRl7ZoHV06bBDoTA/0JcbAWec1/2QNvrUaLZ+kjEpMfHV0mtgp+HWmc/d2ENtz3Nto0Vbb1XgL82YVnUaH7NylvdxLW65l8bBBoDM50hcZAxcNvMgD2Gq0fBIzspv46rGSzVNZoEE69xCdcXsOtkin94tOWS/gyq7GW5g3F6BTdsjOXHAXeGmL6CwfNgh0ps6iZcbAi67ZU9BgNVrW0Vm2UpU08zUvNkg/hpHaQW7Prr1P791CYN5grrKr8RbmzQXolB2ysyudxV7aKjpZ4EQV0LnKGHgROv11NJPRsjqnLDoL9LPGvk6b9ipWg7qoRv0PSL735/I58szf5qrtalzbvNmMztXG9WYvbdE6eluHL/SZ0LnCGNiMTtXA2Ga0rGVkNPGNJmkZT2VjLvF2MaM7zTravYC0dTXewrxZbWSjQ3Y26lzipS1bR9u9nxHozIWdjJ/PpKvOWu0O2c29tBEqQGdtY2AEOgsGXGr+3NJLGyE7OrcxBkag0zbwDGsle/PSRqATIYQQ6EQIIdCJEEKgEyGEQCdCCIFOhBBCvf4H243KXipxqzoAAAAASUVORK5CYII="},3438:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/function-6-2ed9468eff22575ec04867323e17a7b2.png"}}]); \ No newline at end of file diff --git a/assets/js/c76cc2e3.978efe66.js b/assets/js/c76cc2e3.978efe66.js new file mode 100644 index 00000000..764a965f --- /dev/null +++ b/assets/js/c76cc2e3.978efe66.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4729],{3905:(e,a,n)=>{n.d(a,{Zo:()=>o,kt:()=>k});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function d(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var r=t.createContext({}),c=function(e){var a=t.useContext(r),n=a;return e&&(n="function"==typeof e?e(a):d(d({},a),e)),n},o=function(e){var a=c(e.components);return t.createElement(r.Provider,{value:a},e.children)},m={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},u=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,l=e.originalType,r=e.parentName,o=p(e,["components","mdxType","originalType","parentName"]),u=c(n),k=i,A=u["".concat(r,".").concat(k)]||u[k]||m[k]||l;return n?t.createElement(A,d(d({ref:a},o),{},{components:n})):t.createElement(A,d({ref:a},o))}));function k(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var l=n.length,d=new Array(l);d[0]=u;var p={};for(var r in a)hasOwnProperty.call(a,r)&&(p[r]=a[r]);p.originalType=e,p.mdxType="string"==typeof e?e:i,d[1]=p;for(var c=2;c{n.r(a),n.d(a,{assets:()=>r,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>c});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:16,title:"A.16. Tipe Data \u279c Vector",sidebar_label:"A.16. Vector"},d=void 0,p={unversionedId:"basic/vector",id:"basic/vector",title:"A.16. Tipe Data \u279c Vector",description:"Pada chapter ini kita akan belajar tetang tipe data Vector. Vector adalah tipe data seperti array tapi dinamis. Dinamis di sini artinya bisa bertambah dan berkurang kapanpun sesuai kebutuhan.",source:"@site/docs/basic/vector.md",sourceDirName:"basic",slug:"/basic/vector",permalink:"/basic/vector",draft:!1,tags:[],version:"current",sidebarPosition:16,frontMatter:{sidebar_position:16,title:"A.16. Tipe Data \u279c Vector",sidebar_label:"A.16. Vector"},sidebar:"tutorialSidebar",previous:{title:"A.15. Tuple",permalink:"/basic/tuple"},next:{title:"A.17. Function",permalink:"/basic/function"}},r={},c=[{value:"A.16.1. Tipe data Vec<T>",id:"a161-tipe-data-vect",level:2},{value:"\u25c9 Deklarasi vektor, size, dan capacity",id:"-deklarasi-vektor-size-dan-capacity",level:3},{value:"\u25c9 Method pop \u279c menghapus elemen terakhir",id:"-method-pop--menghapus-elemen-terakhir",level:3},{value:"\u25c9 Method remove \u279c menghapus elemen index ke I",id:"-method-remove--menghapus-elemen-index-ke-i",level:3},{value:"\u25c9 Method push \u279c menambahkan elemen baru",id:"-method-push--menambahkan-elemen-baru",level:3},{value:"\u25c9 Realokasi vector",id:"-realokasi-vector",level:3},{value:"\u25c9 Mengubah value sebuah elemen menggunakan notasi [i]",id:"-mengubah-value-sebuah-elemen-menggunakan-notasi-i",level:3},{value:"\u25c9 Method is_empty \u279c mengecek apakah vector kosong",id:"-method-is_empty--mengecek-apakah-vector-kosong",level:3},{value:"\u25c9 Method clear \u279c mengosongkan isi vector",id:"-method-clear--mengosongkan-isi-vector",level:3},{value:"\u25c9 Method append \u279c concatenation/penggabungan vector",id:"-method-append--concatenationpenggabungan-vector",level:3},{value:"\u25c9 Method sort \u279c untuk mengurutkan vector",id:"-method-sort--untuk-mengurutkan-vector",level:3},{value:"A.16.2. Macam deklarasi vektor",id:"a162-macam-deklarasi-vektor",level:2},{value:"A.16.3. Iterasi data vector",id:"a163-iterasi-data-vector",level:2},{value:"A.16.4. Ownership tipe data vector",id:"a164-ownership-tipe-data-vector",level:2},{value:"A.16.5. Vector slice",id:"a165-vector-slice",level:2},{value:"A.16.6. Tipe data VecDeque<T>",id:"a166-tipe-data-vecdequet",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:c};function m(e){let{components:a,...l}=e;return(0,i.kt)("wrapper",(0,t.Z)({},o,l,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tetang tipe data ",(0,i.kt)("em",{parentName:"p"},"Vector"),". Vector adalah tipe data seperti array tapi dinamis. Dinamis di sini artinya bisa bertambah dan berkurang kapanpun sesuai kebutuhan."),(0,i.kt)("p",null,"Vector sangat mirip seperti array, yang karakteristiknya adalah tipe data elemen wajib sama, punya informasi size, elemen-nya bisa diakses atau diubah. Salah satu perbedaan vector dibanding array adalah jumlah elemen pada vector bisa bertambah lebih dari kapasitas yang sudah ditentukan."),(0,i.kt)("p",null,"Vector memiliki 3 buah atribut yg penting untuk diketahui:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"pointer ke data asli"),(0,i.kt)("li",{parentName:"ul"},"lebar atau size"),(0,i.kt)("li",{parentName:"ul"},"kapasitas (representasi dari seberapa banyak memori di-booking untuk data vector tersebut)")),(0,i.kt)("p",null,"Vector bisa bertambah jumlah isinya selama size di bawah kapasitas yang sudah dialokasikan. Jika suatu ketika vector isinya bertambah lebih banyak dari jumlah alokasi maksimal kapasitas, maka vector akan dialokasikan ulang dengan kapasitas yang lebih besar."),(0,i.kt)("h2",{id:"a161-tipe-data-vect"},"A.16.1. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Vec")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," adalah tipe data yang merepresentasikan vector, yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah generics. Vector datanya dialokasikan di heap memory."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai generic dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai heap dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/basic-memory-management"},"Basic Memory Management")))),(0,i.kt)("p",null,"Langsung saja kita praktikkan."),(0,i.kt)("h3",{id:"-deklarasi-vektor-size-dan-capacity"},"\u25c9 Deklarasi vektor, size, dan capacity"),(0,i.kt)("p",null,"Ada beberapa cara yang bisa dipakai untuk membuat data vector. Salah satunya adalah menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec"),", penulisannya seperti pembuatan array hanya saja perlu ditambahi prefix ",(0,i.kt)("inlineCode",{parentName:"p"},"vec!"),". Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut data_one = vec!["batman", "superman", "lobo"];\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(7662).Z,width:"453",height:"110"})),(0,i.kt)("p",null,"Pada contoh di atas variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," adalah sebuah vector yang isinya 3 elemen, yaitu literal string ",(0,i.kt)("inlineCode",{parentName:"p"},"batman"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"superman"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"lobo"),". Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," dideklarasikan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec")," kemudiaan diikuti notasi penulisan yang mirip seperti array."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai macro dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"))),(0,i.kt)("p",null,"Pembuatan vector menggunakan teknik ini hasilnya adalah data vector yang ",(0,i.kt)("inlineCode",{parentName:"p"},"size")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"capacity")," nya adalah sesuai dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value"),", yang pada konteks ini adalah 3."),(0,i.kt)("p",null,"Umumnya vector dideklarasikan dengan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," agar bisa diubah nilainya, karena tujuan disediakannya tipe data ini adalah untuk bisa mengakomodir tipe data array tetapi dinamis (bisa manipulasi datanya)."),(0,i.kt)("p",null,"Perihal method ",(0,i.kt)("inlineCode",{parentName:"p"},"len")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"capacity"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"len")," digunakan untuk mencari tahu size atau jumlah elemen yang ada pada sebuah vector"),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"capacity")," digunakan untuk mencari tahu kapasitas atau jumlah maksimum elemen yang ada pada sebuah vector")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"O iya, kode program di atas akan menghasilkan warning saat di-run. Hal ini dikarenakan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," yang didefinisikan mutable belum diubah nilainya. Hiraukan saja, karena selanjutnya kita akan manipulasi data variabel tersebut.")),(0,i.kt)("h3",{id:"-method-pop--menghapus-elemen-terakhir"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"pop")," \u279c menghapus elemen terakhir"),(0,i.kt)("p",null,"Oke, selanjutnya mari kita oprek variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," yang sudah ditulis."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," memiliki method ",(0,i.kt)("inlineCode",{parentName:"p"},"pop")," yang fungsinya menghapus data elemen terakhir. Mari gunakan method ini pada ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.pop();\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(7554).Z,width:"450",height:"116"})),(0,i.kt)("p",null,"Bisa dilihat pada contoh di atas, setelah menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"pop"),", isi ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," menjadi 2 elemen saja. Elemen terakhir (yaitu string ",(0,i.kt)("inlineCode",{parentName:"p"},"lobo"),") dihapus. Efeknya, atribut size menjadi 2, tapi kapasitas tetap 3."),(0,i.kt)("h3",{id:"-method-remove--menghapus-elemen-index-ke-i"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"remove")," \u279c menghapus elemen index ke ",(0,i.kt)("inlineCode",{parentName:"h3"},"I")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"remove")," adalah salah satu method lainnya yang ada pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),". Kegunaan dari method ",(0,i.kt)("inlineCode",{parentName:"p"},"remove")," adalah untuk menghapus elemen pada indeks tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.remove(1);\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(41).Z,width:"450",height:"134"})),(0,i.kt)("p",null,"Dicontohkan di atas elemen indeks ke-",(0,i.kt)("inlineCode",{parentName:"p"},"1")," dihapus dengan cara memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"remove")," lalu menyisipkan indeks elemen sebagai parameter pemanggilan method. Hasilnya elemen ",(0,i.kt)("inlineCode",{parentName:"p"},"superman")," dihapus dari vector."),(0,i.kt)("h3",{id:"-method-push--menambahkan-elemen-baru"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"push")," \u279c menambahkan elemen baru"),(0,i.kt)("p",null,"Sekarang isi dari vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," tinggal 1 elemen, mari kita tambahkan 3 elemen baru dengan memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"push"),"."),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"push")," fungsinya adalah untuk menambahkan elemen baru pada vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.push("constantine");\ndata_one.push("trigon");\ndata_one.push("darkseid");\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(4480).Z,width:"452",height:"135"})),(0,i.kt)("p",null,"Bisa dilihat sekarang ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," isinya adalah 4 elemen dan atribut size-nya cocok, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"4"),". Namun ada yang aneh, kenapa kapasitas jadi ",(0,i.kt)("inlineCode",{parentName:"p"},"6")," padahal di awal kapasitas adalah 3."),(0,i.kt)("h3",{id:"-realokasi-vector"},"\u25c9 Realokasi vector"),(0,i.kt)("p",null,"Perubahan kapasitas atau realokasi vector terjadi ketika sebuah vector isinya bertambah lebih banyak dari jumlah alokasi maksimal kapasitas."),(0,i.kt)("p",null,"Lalu apa efeknya? secara high level bisa dibilang tidak ada, namun kalau dibahas lebih rinci, efeknya adalah di sisi alokasi space untuk menampung elemen. Proses realokasi menghasilkan vector yang baru dengan kapasitas lebih besar."),(0,i.kt)("h3",{id:"-mengubah-value-sebuah-elemen-menggunakan-notasi-i"},"\u25c9 Mengubah value sebuah elemen menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"h3"},"[i]")),(0,i.kt)("p",null,"Sama seperti array, vector juga bisa dimodifikasi nilai elemennya dengan menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"[i]"),"."),(0,i.kt)("p",null,"Pada contoh berikut elemen indeks ke-",(0,i.kt)("inlineCode",{parentName:"p"},"2")," diubah nilainya dari ",(0,i.kt)("inlineCode",{parentName:"p"},"trigon")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"red hood"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one[2] = "red hood";\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(5216).Z,width:"449",height:"131"})),(0,i.kt)("h3",{id:"-method-is_empty--mengecek-apakah-vector-kosong"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_empty")," \u279c mengecek apakah vector kosong"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_empty")," digunakan untuk mengidentifikasi apakah sebuah vector isinya kosong atau tidak."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let is_vector_empty = data_one.is_empty();\nprintln!("result: {:?}", is_vector_empty);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(8859).Z,width:"447",height:"109"})),(0,i.kt)("h3",{id:"-method-clear--mengosongkan-isi-vector"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"clear")," \u279c mengosongkan isi vector"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"clear")," digunakan untuk mengosongkan sebuah vektor."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.clear();\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(802).Z,width:"445",height:"94"})),(0,i.kt)("h3",{id:"-method-append--concatenationpenggabungan-vector"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"append")," \u279c concatenation/penggabungan vector"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"append")," digunakan untuk menggabungkan dua buah vector. Penggunaannya cukup mudah, panggil saja method nya lalu sisipkan ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dari vector satunya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut result_one = vec![3, 1, 2];\n\nlet mut data_two = vec![7, 6, 8];\nresult_one.append(&mut data_two);\n\nprintln!("data: {:?}", result_one);\nprintln!("length: {}, capacity: {}", result_one.len(), result_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(2366).Z,width:"450",height:"125"})),(0,i.kt)("p",null,"Pada contoh di atas ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," adalah vector mutable dengan isi 3 elemen. Kemudian dideklarasikan ",(0,i.kt)("inlineCode",{parentName:"p"},"data_two")," yang isinya juga vector 3 elemen. Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_two")," dimasukkan kedalam vector ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"append"),", dengan ini maka isi ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," adalah gabungan dari ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," yang lama dan ",(0,i.kt)("inlineCode",{parentName:"p"},"data_two"),"."),(0,i.kt)("p",null,"Proses append vector mengharuskan parameter method ",(0,i.kt)("inlineCode",{parentName:"p"},"append")," diisi dengan ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dari vector yang ingin dimasukkan. Cara untuk mengambil ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," adalah dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut"),"."),(0,i.kt)("p",null,"Ok, selanjutnya tambahkan lagi isi ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," dengan vector lain."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'result_one.append(&mut vec![4, 5]);\n\nprintln!("data: {:?}", result_one);\nprintln!("length: {}, capacity: {}", result_one.len(), result_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(6241).Z,width:"447",height:"127"})),(0,i.kt)("p",null,"Proses penggabungan vector pada contoh ke-dua di atas sedikit berbeda. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"append")," parameternya adalah langsung ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dari literal vector. Ini merupakan salah satu cara yang bisa digunakan dalam penggabungan vector."),(0,i.kt)("h3",{id:"-method-sort--untuk-mengurutkan-vector"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort")," \u279c untuk mengurutkan vector"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"sort")," digunakan untuk mengurutkan elemen vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("data: {:?}", result_one);\nresult_one.sort();\nprintln!("data: {:?}", result_one);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(3380).Z,width:"447",height:"127"})),(0,i.kt)("h2",{id:"a162-macam-deklarasi-vektor"},"A.16.2. Macam deklarasi vektor"),(0,i.kt)("p",null,"Ada beberapa cara deklarasi vector. Pada contoh berikut dua buah vector dideklarasikan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec!"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut vector_4 = vec![1, 2, 3];\nlet mut vector_5: Vec = vec![1, 2, 3];\n")),(0,i.kt)("p",null,"Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_4")," didefinisikan dengan cara yang sudah kita terapkan sebelumnya, yaitu menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec"),". Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_5")," juga didefinisikan dengan cara yang sama, hanya saja pada vector ini tipe datanya ditentukan secara eksplisit yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),"."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," Artinya adalah vector dengan tipe data elemen adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i64"),". Dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," bisa ditentukan tipe data elemen yang diinginkan."),(0,i.kt)("p",null,"Cara deklarasi vector selanjutnya adalah pembuatan vector dengan isi kosong. Deklarasi vector ini mewajibkan tipe data vector dituliskan secara eksplisit, dikarenakan tipe data tidak bisa diidentifikasi dari isinya (karena isinya kosong). Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut vector_7: Vec<&str> = vec![];\nlet mut vector_8: Vec<&str> = Vec::new();\n")),(0,i.kt)("p",null,"Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_7")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_8")," keduanya bertipe vector dengan isi atau elemen bertipe data literal string ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Deklarasi vector kosong bisa dilakukan dengan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec")," yang ditulis tanpa isi, atau bisa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec::new()"),"."),(0,i.kt)("h2",{id:"a163-iterasi-data-vector"},"A.16.3. Iterasi data vector"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," bisa digunakan untuk iterasi vector. Cara penerapannya seperti pada array atau slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_eight = vec![1, 2, 3];\nfor e in vec_eight {\n print!("{e} ");\n}\n\n// 1 2 3\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_nine = vec![1, 2, 3];\nfor i in 0..vec_nine.len() {\n print!("{} ", vec_nine[i]);\n}\n\n// 1 2 3\n')),(0,i.kt)("p",null,"Keyword perulangan lainnya juga bisa digunakan."),(0,i.kt)("h2",{id:"a164-ownership-tipe-data-vector"},"A.16.4. Ownership tipe data vector"),(0,i.kt)("p",null,"Salah satu atribut vector yang penting untuk diketahui adalah, pemilik data sebenarnya (atau owner). Agar lebih jelas, silakan coba terlebih dahulu kode berikut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_ten = vec![1, 2, 3];\nfor e in vec_ten {\n print!("{e} ");\n}\nfor i in 0..vec_ten.len() {\n print!("{} ", vec_ten[i]);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(2061).Z,width:"634",height:"626"})),(0,i.kt)("p",null,"Terlihat sekilas tidak ada kode yang bermasalah dari program di atas, tapi error, aneh."),(0,i.kt)("p",null,"Di Rust, ownership atau kepemilikan data adalah hal yang sangat penting. Saking pentingnya, beberapa orang menyebut Rust sebagai bahasa yang ",(0,i.kt)("em",{parentName:"p"},"value oriented"),"."),(0,i.kt)("p",null,"Dalam kasus kode program vector di atas, ketika keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," digunakan untuk mengiterasi vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vec_ten"),", membuat pemilik data vektor berpindah ke variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"e"),". Hal ini efeknya adalah ketika kita berusaha mengakses variabel yang sama setelah perulangan selesai, maka yang muncul adalah error, karena value-nya sudah berpindah."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Perpindahan owner disebut dengan ",(0,i.kt)("em",{parentName:"p"},"move semantics"),". Lebih jelasnya nanti dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"))),(0,i.kt)("p",null,"Solusi untuk antisipasi error ini adalah dengan cara meminjam value yang sebenarnya dari owner, untuk kemudian digunakan dalam perulangan. Caranya dengan menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"borrowing")," menggunakan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"reference")," yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"&"),". Data sebenarnya milik owner dipinjam untuk dipergunakan di perulangan."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai reference dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/pointer-references"},"Pointer & References")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai borrowing dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/borrowing"},"Borrowing")))),(0,i.kt)("p",null,"Silakan ubah kode yang sebelumnya ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for e in vec_ten {\n print!("{e} ");\n}\n')),(0,i.kt)("p",null,"... menjadi seperti ini, kemudian run, maka error akan hilang."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for e in &vec_ten {\n print!("{e} ");\n}\n')),(0,i.kt)("p",null,"Salah satu alternatif cara lainnya untuk antisipasi value berpindah tempat adalah dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," untuk mengkonversi vector menjadi iterator. Jadi yang di-iterasi bukan vector-nya, melainkan objek iterator yang dibuat dari vector tersebut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for e in vec_ten.iter() {\n print!("{e} ");\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"li"},"ownership")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/ownership"},"Ownership")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"li"},"borrowing")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/borrowing"},"Borrowing")))),(0,i.kt)("h2",{id:"a165-vector-slice"},"A.16.5. Vector slice"),(0,i.kt)("p",null,"Seperti array, slice juga bisa dibuat dari vector. Cara penerapannya juga sama persis. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_population = vec![2, 1, 3];\nlet vec_sample = &vec_population[0..1];\nprintln!("{:?}", vec_sample); // [2]\n')),(0,i.kt)("p",null,"Semua operasi slice bisa diterapkan di vector."),(0,i.kt)("h2",{id:"a166-tipe-data-vecdequet"},"A.16.6. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"VecDeque")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," adalah sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," plus mendukung operasi menambah dan mengurangi elemen dari dua sisi secara efisien."),(0,i.kt)("p",null,"Pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),", ada method ",(0,i.kt)("inlineCode",{parentName:"p"},"pop")," yang fungsinya menghapus data elemen terakhir dan method ",(0,i.kt)("inlineCode",{parentName:"p"},"push")," untuk menambah elemen baru dari kanan. Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," memiliki bebebrapa method tambahan, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"pop_front")," untuk hapus data elemen pertama atau paling kiri (indeks ke-0)"),(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"push_front")," untuk menambah data dari kiri (indeks ke-0)"),(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"pop_back")," untuk hapus data elemen pertama atau paling kanan (indeks terakhir)"),(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"push_back")," untuk menambah data dari kanan (indeks terakhir)")),(0,i.kt)("p",null,"Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::collections::VecDeque;\n\nlet mut vec_10 = VecDeque::from(vec!["a", "b", "c"]);\n\nvec_10.pop_front();\nvec_10.push_front("z");\nprintln!("data: {:?}", vec_10);\n\nvec_10.pop_back();\nvec_10.push_back("h");\nprintln!("data: {:?}", vec_10);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(4050).Z,width:"453",height:"129"})),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," tidak otomatis di-import. Kita perlu mengimport path di mana tipe data tersebut berada menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::collections::VecDeque;\n")),(0,i.kt)("p",null,"Cara membuat vector ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," bisa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque::from")," dengan parameter diisi data vectornya, seperti pada kode program yang sudah ditulis."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/vector"},"github.com/novalagung/dasarpemrogramanrust-example/../vector")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/macro.vec.html"},"https://doc.rust-lang.org/std/macro.vec.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/vec/struct.Vec.html"},"https://doc.rust-lang.org/std/vec/struct.Vec.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std/vec.html"},"https://doc.rust-lang.org/rust-by-example/std/vec.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/collections/struct.VecDeque.html"},"https://doc.rust-lang.org/std/collections/struct.VecDeque.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/36672845/in-rust-is-a-vector-an-iterator"},"https://stackoverflow.com/questions/36672845/in-rust-is-a-vector-an-iterator")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/28800121/what-do-i-have-to-do-to-solve-a-use-of-moved-value-error"},"https://stackoverflow.com/questions/28800121/what-do-i-have-to-do-to-solve-a-use-of-moved-value-error")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/43036279/what-does-it-mean-to-pass-in-a-vector-into-a-for-loop-versus-a-reference-to-a"},"https://stackoverflow.com/questions/43036279/what-does-it-mean-to-pass-in-a-vector-into-a-for-loop-versus-a-reference-to-a"))))}m.isMDXComponent=!0},7662:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcUAAABuCAIAAADZD59KAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTY6NDg6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjExOjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjExOjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM2M2NmNTZmLWI1Njgt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"},3380:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB/CAIAAADw7lslAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6NTg6NDUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA0OjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA0OjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMzYmNmNWRmLTA4ZjUt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"},2061:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/vector-11-27b0884891ab00c87d90603997e1878c.png"},4050:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcUAAACBCAIAAAA+HTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTg6MzM6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjAzOjMwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjAzOjMwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZkNDhjYTk5LTI1NzYt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"},7554:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAB0CAIAAACZnqXOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MTk6MzErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjEwOjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjEwOjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQwMmRjMzhkLTJkODgt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"},41:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAACGCAIAAADBxB3cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjA6MDUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjM0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjM0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZiNGQzY2VkLTBjZDYtMTg0OS05MDA0LTc3NTUwZDZiMTIxYiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2YjRkM2NlZC0wY2Q2LTE4NDktOTAwNC03NzU1MGQ2YjEyMWIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2YjRkM2NlZC0wY2Q2LTE4NDktOTAwNC03NzU1MGQ2YjEyMWIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjZiNGQzY2VkLTBjZDYtMTg0OS05MDA0LTc3NTUwZDZiMTIxYiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0wN1QxNzoyMDowNSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PorURwUAABIOSURBVHja7Z09cty4FoW9Emkmczyxx6kya5IJHMiZyqlrqlT1Mi/ES/AqnHtRT002SfycC1ywSTbZ+k65ymo2SOKPX18A5OG7O4QQQhfoHVWAEEJgFCGEwChCCIFRhBACowghhMAoQgiBUYQQAqMIIQRGEUIIgVGEEAKjCCF0Gxh9fH759vTh9NeHp28vz4+LZ+b1BCsc9bIMnUs8Rw21NO9El2Vvgxp7/fRSzaK7FBf2utPu+YmqZ99hJaO9Ndy7WZ1wJYwaPV3UT6ApH9F2M3vx3pWzvWZoxpU347KXJzofw8zlch1FV92M48/AqCx73Er9MVbBqFnzYHTn0NxTw72b1QXXwqiv8KdLbDh7h5nTBx+B1d7FvVRJ18CokbjrKo9Wf1moo5hVdzFG55ddHWcdjNYOC0b3GnvuqOHezSpEX4AxYhjL0sdOSZgXbJQpk5qoXywhCM+f/BRN9o4/diWqXtC6ffKyO2opyYn4wT2liH93w93HPbKznyZIns6h7GMppJVVF51jymnUNsEHkaVpU1SfQZQZnjMru33Z5PUpj5lvDMvZfzscwaj5eiV7undwytc/xy+6pH3DFntIv81oTXVMR4UMXxi7+/uS7POiREbZq31p6HOiK+6r4d7N+imIhpojiD48PYej/ulyyqgYsCu/iKscVRgtj34LGI3OrzDqvcTzslu1ZBVPVnOXNPgmzP64WZx9KErwf4mjsursDKW5s4gUFzas63EYoU9lYTSrT3nM8sbTruUW9Vay0Zoy5fmaG/vAtyerh4irw2hN65h5JU/HDCo+3/1DS1+q9fl62fO+ZF0dRvfdS8N5MJqfMd6SgCmvFxHglaKwWjSe1FU8ZVud8UxzW4/90/LX9hjS61pSFaJPFHwcTpkdMs/IOcnwXfp/Ic/1GFF1/WKWoi/FD1iM2GSQkMYfoj7lMfXG8yXw9PxiV5rRuwvpC60pfmzixQV5Jnl1WK0pjqnLns5kTYAornf4+5Ls8/6yV+vT6r47aTgPRnNMGldAEn9nY4x8KCAXemrhaHSJmcNr6wilaNTHUbN9SkPgBIo683anGAMA3VHyszdiVFbd8hi1I1XHNSDqUx5Tbyz/yIbH9ley1ZoqZb1E0/RUenUUMJoes1D2KRqdwqjy7FSlL9X6vBpN1fu6vDrM7ruPhlsoGj3/ipZ/24YEDky6o9HGRZNs7+qPksiS7rx52atgyEeXdtv3l5M+pDr7PIxmM4grRqNZM4b7uqDT8yU7pt44lKwe7/grWbemTuktkTUL5seoquQw9ChWsrcvefr8PIzKnBS67x4abv7caDZGSKZ09EB/+hUz2dU4N2rFVJ5oNJ0LlXOjnktcll3WUo3248EFkL5lc1x2zc/EaFR1Wf7iSOZlukKzLJnhVjhtV4ikan1XTnSWNxqDWXF2dyXr1tQpayUaM2VMgzkxKstuXFLW7p6+5OjzdRJlfcm8OiqB0bUbzr1SH51cLodF64tPwa+TuplTH2HOSr09l9Y+JWBjVI7Jk3sai2UXi4b6XEkEkDV2sAo6ruCLs/sxWqq6bMk4GBk/jjUispTF0nnd2WWv1/FLdndq4SZisZgpV9VUE5cr2WhNlbKwaJaXKNvegFFdIao+q7NTlb5kVYgPo7IvFa4O+96eHTTcvPtGN75BbL+3rr2xKrj1sm999hXvv66tXd5WD7t2w817imnN3HGvM3or2gqjs9YD0AoY3QL5u3umHqFbwKj9ADXaHKMIIYQygVGEEAKjCCEERhFCCIxurL/u//fvn/99HD/f//fvn//r/z2UU6JNNWtlEsPsy7KEYfbtYfTLpwFw/97/syhGU2L2MH3wpDwaWGZ2X/farM9iue2Yyp0Ow+y82jHMBqMeho70vP+yblSoMHob8dmsCzR4tqPqevXkuGm34Zj59YNhtpMvGGaD0Uh/f/zjNRL8+pcRS05j8Puvr8keuo2f7r88DNtPyf748nFI/On+7/L4PcWoSqmPGWfJDpxNfw0jTIstdG0PWmG1a7jqurKUdN3icw2Pz8kz577LoZ4+uQ4wzHbgBcPsIxpmr4zRf05A/OPLe3uy8vz3CaMnor0/ge/1q46/I9p6op2/Kgaejo3hMbu/O8pPB+9OneVZX/3KujjxXPDaIWur3cxV15ulxEvFMQhvw6LjmCVP3TsMs+8wzL4Zw+yVMdqN6FMkdWydYr1Tmk8njHYUe8XZKX2I0SGYHVC7BEbPxxyB3oeo74Nw9b1jIDQGK8pq1z9kM/yMqw5fpSxFP5fli7kRo95jZjnGMLs42Yxh9nENs68RjcazpX6MnlOugtEuTb8xoXyhfZSHzOQNahv6VQKAAKPeuaE8S0m06JjdcmG04ZjKTxTD7DJNMcw+pmH2NeZGk0WnPsb0RqMPywzqJUbHiVExmVucODNXKdwYNax23VPsMkvxym3bepAjhSPMKmAUw+xC7WKYfXcow+zVV+o79oXQ/CjmRr/+VcdoRuQlMdod3H8z1rCMG89Mi5mab6atZsbR3M+4aaVSZ0ky1ZiRExhNU9rHbJ0bxTD7rtRZMMw+lmH2FveN9iSNlsV7JgahXwmjaZCYLqmPk5vRxmGhX6fMo9GvccpKQJpf9lUra8OX1/Yzbrzho5Sl7JIsDISy3IudX1z3mIrYBMNsvXiOYfahDbN3/hRTPDe68hxuOl379x26TAv5x2KYffNlP7hhNhi1p2vB6G5AihAY3T1G00E9DCXEQ2D0RjCKEEJ7FxhFCCEwihBCYBQhhMDoIvJbLHtSzluharB5XnD5ZLrd7joLMk6/0aaUG1Wd75iLrCq0lN3VolOiY7yus95sTe/3XaYvvVGMRk9eRg/d+y2WPSkPhtGr3hwJRpf/sbnQ83RnPcR7+1rLTW6X9KUZDuLa0O/yWr0iRjcwVwaj1zzRLWK06Rr3n+0QGG3A4wZZneEg/vz8bFmgXtgxdoRRv8WyYdscPvrZp+wx+nFIn7hDjY+H5ruXMVp71nB6qq7kB1HredJ0yLKblV65aUrLNFoY/RputcoSOD2qejDvsVh1F4Y1vubQ3sOWs5N4JNIou2wO2dyGcbIDo7bbt9OlWJcoryX7RFWL5Tj7Tkcxf30Wu0a1o5wThLYJ2gLMLtGxolGPxbI8SGLqXNg92HHcKJykPaM11S7KKMHRr9wYja6BzLc+8srNjWkLkULmCWR6D5esq8KrNnuk2pONVoy6m8P0Hi7ZIWduFblnXNIcBft6wzh5fjTqdCn+YJRIe40bTaPO7rPAbYjDZfeu1UXVQTysBek+o01ljzY3GloreUztTIymLk2mmdM4G3s234ueqS9i1PTyEraYyuB5AYwKo3vDK1faqHkxavtrGL0trATlgOsw5W3GqLs5tMWkruT0pVFlV3nTprQQnKY1uMCgvuhSLEukO+2d+3VMZavDBmMrT33Ko/scxCMDKR1XFCyebiYa9WE0co2KBvXx7v88/Jl7QUXP1LdjVDlURi86qFP0MowaXrm5A/x6GI0uygbLTt8Y1krrbg7tPVwI+afYLXO4mofRgnHybIy2uBSnJbI6rT6CnpMybbDdkd18jDodxC2jxfAWiWQU1b7udEMYHdW/z3kcqhej0XCXyzAqW1G+GW3laFTFWatHo8ldLsaLcjaKRj0u2ipEjQI6g9/LRKMplOZh1O9SrErU8Gqqag6LNthrYNTtIJ5MCctZT+s9036S3iJGJ4PngtH9g7HL4FFizo1KZ1lzNJC5KbdhNHPqNQeh0is3M6YtwWk+Rr0DvpLN8Ny5UX9zSO9hVckNc35ujFaMk10YlW7fLpdi+3fF6rQyHC3fBTGjRPMx2u5KXvp9MF43e0SM+i2WHbbNsbV+RmHlBt3HsLEVf3FAETnLVqxtHR2qNGSbnHodK8v2q3fFUFAu4Bvew4YlsOUTrDKgq+6ylXpvcxgVouyQq9bFtfce11bqS4h3LW5nC+tll2K9Tu9yLzZLVLTBrheosT6LRyi6kstrrH4bSdMcKQ+D7kVL32q37W2StyTxxre1b4JcubGWKdG+7hvdlcAoGEXWPEFx6HsgjC5VouWfYgKjaPGuvuQz9WB0ibZY/WH3jZ6pX6xECz9TD0YRQgiBUYQQAqMIIQRGEUIIjO5YDcZ3Hk33wu9G1Xn/VR3k3sjdLTtsdwRGY0VPxC9JvRYraLfUPSPXtIOs3cu+rhGn51nX26DzJnc/ITB6GUb7B4p695BNXk9/xMu+/ZHntf2MV7m5ivfbIzB6AUYTG1D1MGjm5ew3eNYp82dMY8+9aoyyc1fdFf2MxdlNJw7jxQ+xo7FdTOF8bNRnraGC7MSmP8V8InSsaLQzYSo9Ux+bMfsNnm0v534mQVpAzYqetnTVzTdv62dc4qjYPfUEEQUqebUEp5f1aTVQ6ezJWylUzSN0BIzKCFFi1LXRxqiOcN8H4eoCGJXj3nVcdUsB5N0V/IylZbV5dpcdj+F8rN3idPvo+ux2eooNsewfCISOEI1mVkxbYLRLE8TC/hF96XLbzlU3g8jmfsYmR0eK6rOb76gSGFXY9lLOrs80tC6lROgog/rJRHlbjCbWeZdidEtX3eyrzf2Ms4xlltWes/uj0eFjC0YL9fk4/SzgRoBuAaMqMg3clFfAaHfGGRHonTF1p2bY1nXVzdiztZ+x5GhsWa1LZJVT1mfufFyMze2QM2+l6ZDc1oRuAKNn8HUzpOOrkyY35cYQ1WUFPWD6ooD0qq66ORM38jMu/CDkltX6XOHWYjGF87Ebo+rscQand5u1vQgagVGUz4eeZhWml9qvrmV9gtdbEvHkkwUZBEbfqKJX2vWR6YYYvYJP8E3nEyEwehXFg/oNGSoG9ftl01HyiRAYRQghMIoQQmAUIYQQGEUIITCKEEJgFCGEwChCCCEwihBCYBQhhMAoQgiBUYQQQmAUIYTAKEIIgVGEEHo7GP3+8/evH583zuLrSc8az33adPrw+cev379/fj9tOv3Z/3UdiSxFeb9m3hBCB8LoGpwVx7wYo8vnU2O017URjxACo+kxRy5N310boyJLYBQhMBpQ4Hc6sA42dpuiRNE4Nk0ZDdYddPEhr0fVOIgej+vL5+t+P3903/z68f38/2ed+dctr3/lJ/IgFiH0JjF6AsbAgJFon3/8HMh2YkQ4aZkgz0q5BkZH1I159uZzyEvwfz9Cz3cPT5SUCIwiBEZrBJBEC5OUkTcPJy3RqGK/J5/D5/R/sXt0Il+JwChCYDQnWjI2LmDUSLkuRsdPznxaGBW7g1GE0AIYHZal69GomXL1aPTXj4Z8Kowau4NRhFATRoPhcTApGIyZ+60DJLLJQjPlOktMSS7c+bQxmu0ORhFCbRgNbiH/+b1fpY7Hyt0KdzycDkfQdso1lpjSOwK8+TQG9Wp3MIoQasXotXWVR6cWFRhFCIyCUTCKEDo0RtXd+4cQz9QjBEYRQgiBUYQQAqMIIQRGEULobWJ0undy3VWSN7Wc3S09Hfz+A4RQWzS6OOSy25gWOcNR8CTyufh9XdNdAtwngBAYdWOje9bomFHeirfHfj5spSB00xhNH/q0/YzDqOgUgxkGz5bv8p3vsdHvP0dLptnECHJquVPbxTTcqbNj5pMkppN0WOboo/c52g0QjRCaidHEtKPgZ5xYm4QkyKNRww65gRrzMRrZOY1HK9s21/yh1TGt2FuaY0XgbLcjgKII7Rajp3dufI+vUsOzI7z8yz75Myw/FsRofT9plCcJFaa0junAaJhmHgi3Wh1ECIw2YzQfhZoYTd7dObFgZxhVdvl3ddvmMBzNUhrHdGM0ek3eRSBkchShPWI0v6x1knBmVDl87igazU5Yt20u+kOXCuHC6JDqUopijoLQ/gb16mXskoP25ZvxroDRy+ZGo8nM8gA4OUfVtnmkp/aHltVkcU3/AJzg+utXun3GEhMURehqGM0G8Plrk4NXF5ej0ZhmyVr/hRjN8jmdKbXd9xzCdqdu84fOjmnV5526+eHOWKVqrhAYitD1o9FlBpNXmqOzF8z3Pz5mlR2hN47ReDRZGOSumYFln2vaFKOMxhF68xhNB/U3gISNMHquNyJRhMAoQgiBUYQQQmAUIYTAKEIIgVGEEAKjCCGEwChCCIFRhBACowghBEYRQgiMIoQQAqMIIQRGEUIIjCKE0JvT/wE0Wjx1dKk4VAAAAABJRU5ErkJggg=="},4480:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcQAAACHCAIAAAAHhr4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjA6NDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZhMjMwODMxLWFhZmMt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"},5216:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAACDCAIAAAB6PjdsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjE6MTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjIzNGI3OWZlLTU4NDIt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"},8859:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABtCAIAAAC+8Pi1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjU6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjAxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjAxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmVlYjdiM2VmLTJiMzgt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"},802:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAABeCAIAAAA4612LAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjY6MzUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA3OjIwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA3OjIwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRiMzkxYzljLWFmOTAt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"},2366:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAB9CAIAAAC+kfQGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6Mzk6NTkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA2OjIyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA2OjIyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE0NDc0MjZkLTFjYTct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"},6241:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB/CAIAAADw7lslAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6NTI6MjYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA1OjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA1OjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjlmZGJjMGIyLTFmNTUt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"}}]); \ No newline at end of file diff --git a/assets/js/c76cc2e3.c1ae2c67.js b/assets/js/c76cc2e3.c1ae2c67.js deleted file mode 100644 index f4972cae..00000000 --- a/assets/js/c76cc2e3.c1ae2c67.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4729],{3905:(e,a,n)=>{n.d(a,{Zo:()=>o,kt:()=>k});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function d(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var r=t.createContext({}),c=function(e){var a=t.useContext(r),n=a;return e&&(n="function"==typeof e?e(a):d(d({},a),e)),n},o=function(e){var a=c(e.components);return t.createElement(r.Provider,{value:a},e.children)},m={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},u=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,l=e.originalType,r=e.parentName,o=p(e,["components","mdxType","originalType","parentName"]),u=c(n),k=i,A=u["".concat(r,".").concat(k)]||u[k]||m[k]||l;return n?t.createElement(A,d(d({ref:a},o),{},{components:n})):t.createElement(A,d({ref:a},o))}));function k(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var l=n.length,d=new Array(l);d[0]=u;var p={};for(var r in a)hasOwnProperty.call(a,r)&&(p[r]=a[r]);p.originalType=e,p.mdxType="string"==typeof e?e:i,d[1]=p;for(var c=2;c{n.r(a),n.d(a,{assets:()=>r,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>p,toc:()=>c});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:16,title:"A.16. Tipe Data \u279c Vector",sidebar_label:"A.16. Vector"},d=void 0,p={unversionedId:"basic/vector",id:"basic/vector",title:"A.16. Tipe Data \u279c Vector",description:"Pada chapter ini kita akan belajar tetang tipe data Vector. Vector adalah tipe data seperti array tapi dinamis. Dinamis di sini artinya bisa bertambah dan berkurang kapanpun sesuai kebutuhan.",source:"@site/docs/basic/vector.md",sourceDirName:"basic",slug:"/basic/vector",permalink:"/basic/vector",draft:!1,tags:[],version:"current",sidebarPosition:16,frontMatter:{sidebar_position:16,title:"A.16. Tipe Data \u279c Vector",sidebar_label:"A.16. Vector"},sidebar:"tutorialSidebar",previous:{title:"A.15. Tuple",permalink:"/basic/tuple"},next:{title:"A.17. Function",permalink:"/basic/function"}},r={},c=[{value:"A.16.1. Tipe data Vec<T>",id:"a161-tipe-data-vect",level:2},{value:"\u25c9 Deklarasi vektor, size, dan capacity",id:"-deklarasi-vektor-size-dan-capacity",level:3},{value:"\u25c9 Method pop \u279c menghapus elemen terakhir",id:"-method-pop--menghapus-elemen-terakhir",level:3},{value:"\u25c9 Method remove \u279c menghapus elemen index ke I",id:"-method-remove--menghapus-elemen-index-ke-i",level:3},{value:"\u25c9 Method push \u279c menambahkan elemen baru",id:"-method-push--menambahkan-elemen-baru",level:3},{value:"\u25c9 Realokasi vector",id:"-realokasi-vector",level:3},{value:"\u25c9 Mengubah value sebuah elemen menggunakan notasi [i]",id:"-mengubah-value-sebuah-elemen-menggunakan-notasi-i",level:3},{value:"\u25c9 Method is_empty \u279c mengecek apakah vector kosong",id:"-method-is_empty--mengecek-apakah-vector-kosong",level:3},{value:"\u25c9 Method clear \u279c mengosongkan isi vector",id:"-method-clear--mengosongkan-isi-vector",level:3},{value:"\u25c9 Method append \u279c concatenation/penggabungan vector",id:"-method-append--concatenationpenggabungan-vector",level:3},{value:"\u25c9 Method sort \u279c untuk mengurutkan vector",id:"-method-sort--untuk-mengurutkan-vector",level:3},{value:"A.16.2. Macam deklarasi vektor",id:"a162-macam-deklarasi-vektor",level:2},{value:"A.16.3. Iterasi data vector",id:"a163-iterasi-data-vector",level:2},{value:"A.16.4. Ownership tipe data vector",id:"a164-ownership-tipe-data-vector",level:2},{value:"A.16.5. Vector slice",id:"a165-vector-slice",level:2},{value:"A.16.6. Tipe data VecDeque<T>",id:"a166-tipe-data-vecdequet",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],o={toc:c};function m(e){let{components:a,...l}=e;return(0,i.kt)("wrapper",(0,t.Z)({},o,l,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tetang tipe data ",(0,i.kt)("em",{parentName:"p"},"Vector"),". Vector adalah tipe data seperti array tapi dinamis. Dinamis di sini artinya bisa bertambah dan berkurang kapanpun sesuai kebutuhan."),(0,i.kt)("p",null,"Vector sangat mirip seperti array, yang karakteristiknya adalah tipe data elemen wajib sama, punya informasi size, elemen-nya bisa diakses atau diubah. Salah satu perbedaan vector dibanding array adalah jumlah elemen pada vector bisa bertambah lebih dari kapasitas yang sudah ditentukan."),(0,i.kt)("p",null,"Vector memiliki 3 buah atribut yg penting untuk diketahui:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"pointer ke data asli"),(0,i.kt)("li",{parentName:"ul"},"lebar atau size"),(0,i.kt)("li",{parentName:"ul"},"kapasitas (representasi dari seberapa banyak memori di-booking untuk data vector tersebut)")),(0,i.kt)("p",null,"Vector bisa bertambah jumlah isinya selama size dibawah kapasitas yang sudah dialokasikan. Jika suatu ketika vector isinya bertambah lebih banyak dari jumlah alokasi maksimal kapasitas, maka vector akan dialokasikan ulang dengan kapasitas yang lebih besar."),(0,i.kt)("h2",{id:"a161-tipe-data-vect"},"A.16.1. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Vec")),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," adalah tipe data yang merepresentasikan vector, dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah generics. Vector datanya dialokasikan di heap memory."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai generic dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai heap dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/basic-memory-management"},"Basic Memory Management")))),(0,i.kt)("p",null,"Langsung saja kita praktikkan."),(0,i.kt)("h3",{id:"-deklarasi-vektor-size-dan-capacity"},"\u25c9 Deklarasi vektor, size, dan capacity"),(0,i.kt)("p",null,"Ada beberapa cara yang bisa dipakai untuk membuat data vector. Salah satunya adalah menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec"),", penulisannya seperti pembuatan array hanya saja perlu ditambahi prefix ",(0,i.kt)("inlineCode",{parentName:"p"},"vec!"),". Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut data_one = vec!["batman", "superman", "lobo"];\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(7662).Z,width:"453",height:"110"})),(0,i.kt)("p",null,"Pada contoh di atas variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," adalah sebuah vector yang isinya 3 elemen, yaitu literal string ",(0,i.kt)("inlineCode",{parentName:"p"},"batman"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"superman"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"lobo"),". Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," dideklarasikan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec")," kemudiaan diikuti notasi penulisan yang mirip seperti array."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai macro dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"))),(0,i.kt)("p",null,"Pembuatan vector menggunakan teknik ini hasilnya adalah data vector yang ",(0,i.kt)("inlineCode",{parentName:"p"},"size")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"capacity")," nya adalah sesuai dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value"),", yang pada konteks ini adalah 3."),(0,i.kt)("p",null,"Umumnya vector dideklarasikan dengan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"mut")," agar bisa diubah nilainya, karena tujuan disediakannya tipe data ini adalah untuk bisa mengakomodir tipe data array tetapi dinamis (bisa manipulasi datanya)."),(0,i.kt)("p",null,"Perihal method ",(0,i.kt)("inlineCode",{parentName:"p"},"len")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"capacity"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"len")," digunakan untuk mencari tahu size atau jumlah elemen yang ada pada sebuah vector"),(0,i.kt)("li",{parentName:"ul"},"Method ",(0,i.kt)("inlineCode",{parentName:"li"},"capacity")," digunakan untuk mencari tahu kapasitas atau jumlah maksimum elemen yang ada pada sebuah vector")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"O iya, kode program di atas akan menghasilkan warning saat di-run. Hal ini dikarenakan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," yang didefinisikan mutable belum diubah nilainya. Hiraukan saja, karena selanjutnya kita akan manipulasi data variabel tersebut.")),(0,i.kt)("h3",{id:"-method-pop--menghapus-elemen-terakhir"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"pop")," \u279c menghapus elemen terakhir"),(0,i.kt)("p",null,"Oke, selanjutnya mari kita oprek variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," yang sudah ditulis."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," memiliki method ",(0,i.kt)("inlineCode",{parentName:"p"},"pop")," yang fungsinya menghapus data elemen terakhir. Mari gunakan method ini pada ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.pop();\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(7554).Z,width:"450",height:"116"})),(0,i.kt)("p",null,"Bisa dilihat pada contoh di atas, setelah menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"pop"),", isi ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," menjadi 2 elemen saja. Elemen terakhir (yaitu string ",(0,i.kt)("inlineCode",{parentName:"p"},"lobo"),") dihapus. Efeknya, atribut size menjadi 2, tapi kapasitas tetap 3."),(0,i.kt)("h3",{id:"-method-remove--menghapus-elemen-index-ke-i"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"remove")," \u279c menghapus elemen index ke ",(0,i.kt)("inlineCode",{parentName:"h3"},"I")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"remove")," adalah salah satu method lainnya yang ada pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),". Kegunaan dari method ",(0,i.kt)("inlineCode",{parentName:"p"},"remove")," adalah untuk menghapus elemen pada indeks tertentu."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.remove(1);\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(41).Z,width:"450",height:"134"})),(0,i.kt)("p",null,"Dicontohkan di atas elemen indeks ke-",(0,i.kt)("inlineCode",{parentName:"p"},"1")," dihapus dengan cara memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"remove")," lalu menyisipkan indeks elemen sebagai parameter pemanggilan method. Hasilnya elemen ",(0,i.kt)("inlineCode",{parentName:"p"},"superman")," dihapus dari vector."),(0,i.kt)("h3",{id:"-method-push--menambahkan-elemen-baru"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"push")," \u279c menambahkan elemen baru"),(0,i.kt)("p",null,"Sekarang isi dari vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," tinggal 1 elemen, mari kita tambahkan 3 elemen baru dengan memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"push"),"."),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"push")," fungsinya adalah untuk menambahkan elemen baru pada vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.push("constantine");\ndata_one.push("trigon");\ndata_one.push("darkseid");\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(4480).Z,width:"452",height:"135"})),(0,i.kt)("p",null,"Bisa dilihat sekarang ",(0,i.kt)("inlineCode",{parentName:"p"},"data_one")," isinya adalah 4 elemen dan atribut size-nya cocok, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"4"),". Namun ada yang aneh, kenapa kapasitas jadi ",(0,i.kt)("inlineCode",{parentName:"p"},"6")," padahal di awal kapasitas adalah 3."),(0,i.kt)("h3",{id:"-realokasi-vector"},"\u25c9 Realokasi vector"),(0,i.kt)("p",null,"Perubahan kapasitas atau realokasi vector terjadi ketika sebuah vector isinya bertambah lebih banyak dari jumlah alokasi maksimal kapasitas."),(0,i.kt)("p",null,"Lalu apa efeknya? secara high level bisa dibilang tidak ada, namun kalau dibahas lebih rinci, efeknya adalah di sisi alokasi space untuk menampung elemen. Terjadi proses realokasi dimana vector yang baru akan memiliki kapasitas lebih besar."),(0,i.kt)("h3",{id:"-mengubah-value-sebuah-elemen-menggunakan-notasi-i"},"\u25c9 Mengubah value sebuah elemen menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"h3"},"[i]")),(0,i.kt)("p",null,"Sama seperti array, vector juga bisa dimodifikasi nilai elemennya dengan menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"[i]"),"."),(0,i.kt)("p",null,"Pada contoh berikut elemen indeks ke-",(0,i.kt)("inlineCode",{parentName:"p"},"2")," diubah nilainya dari ",(0,i.kt)("inlineCode",{parentName:"p"},"trigon")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"red hood"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one[2] = "red hood";\n\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(5216).Z,width:"449",height:"131"})),(0,i.kt)("h3",{id:"-method-is_empty--mengecek-apakah-vector-kosong"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_empty")," \u279c mengecek apakah vector kosong"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_empty")," digunakan untuk mengidentifikasi apakah sebuah vector isinya kosong atau tidak."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let is_vector_empty = data_one.is_empty();\nprintln!("result: {:?}", is_vector_empty);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(8859).Z,width:"447",height:"109"})),(0,i.kt)("h3",{id:"-method-clear--mengosongkan-isi-vector"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"clear")," \u279c mengosongkan isi vector"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"clear")," digunakan untuk mengosongkan sebuah vektor."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'data_one.clear();\nprintln!("data: {:?}", data_one);\nprintln!("length: {}, capacity: {}", data_one.len(), data_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(802).Z,width:"445",height:"94"})),(0,i.kt)("h3",{id:"-method-append--concatenationpenggabungan-vector"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"append")," \u279c concatenation/penggabungan vector"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"append")," digunakan untuk menggabungkan dua buah vector. Penggunaannya cukup mudah, panggil saja method nya lalu sisipkan ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dari vector satunya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut result_one = vec![3, 1, 2];\n\nlet mut data_two = vec![7, 6, 8];\nresult_one.append(&mut data_two);\n\nprintln!("data: {:?}", result_one);\nprintln!("length: {}, capacity: {}", result_one.len(), result_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(2366).Z,width:"450",height:"125"})),(0,i.kt)("p",null,"Pada contoh di atas ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," adalah vector mutable dengan isi 3 elemen. Kemudian dideklarasikan ",(0,i.kt)("inlineCode",{parentName:"p"},"data_two")," yang isinya juga vector 3 elemen. Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"data_two")," dimasukkan kedalam vector ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"append"),", dengan ini maka isi ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," adalah gabungan dari ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," yang lama dan ",(0,i.kt)("inlineCode",{parentName:"p"},"data_two"),"."),(0,i.kt)("p",null,"Proses append vector mengharuskan parameter method ",(0,i.kt)("inlineCode",{parentName:"p"},"append")," diisi dengan ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dari vector yang ingin dimasukkan. Cara untuk mengambil ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," adalah dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut"),"."),(0,i.kt)("p",null,"Ok, selanjutnya tambahkan lagi isi ",(0,i.kt)("inlineCode",{parentName:"p"},"result_one")," dengan vector lain."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'result_one.append(&mut vec![4, 5]);\n\nprintln!("data: {:?}", result_one);\nprintln!("length: {}, capacity: {}", result_one.len(), result_one.capacity());\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(6241).Z,width:"447",height:"127"})),(0,i.kt)("p",null,"Proses penggabungan vector pada contoh ke-dua di atas sedikit berbeda. Method ",(0,i.kt)("inlineCode",{parentName:"p"},"append")," parameternya adalah langsung ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dari literal vector. Ini merupakan salah satu cara yang bisa digunakan dalam penggabungan vector."),(0,i.kt)("h3",{id:"-method-sort--untuk-mengurutkan-vector"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"sort")," \u279c untuk mengurutkan vector"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"sort")," digunakan untuk mengurutkan elemen vector."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("data: {:?}", result_one);\nresult_one.sort();\nprintln!("data: {:?}", result_one);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(3380).Z,width:"447",height:"127"})),(0,i.kt)("h2",{id:"a162-macam-deklarasi-vektor"},"A.16.2. Macam deklarasi vektor"),(0,i.kt)("p",null,"Ada beberapa cara deklarasi vector. Pada contoh berikut dua buah vector dideklarasikan menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec!"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut vector_4 = vec![1, 2, 3];\nlet mut vector_5: Vec = vec![1, 2, 3];\n")),(0,i.kt)("p",null,"Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_4")," didefinisikan dengan cara yang sudah kita terapkan sebelumnya, yaitu menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec"),". Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_5")," juga didefinisikan dengan cara yang sama, hanya saja pada vector ini tipe datanya ditentukan secara eksplisit yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),"."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," Artinya adalah vector dengan tipe data elemen adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i64"),". Dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," bisa ditentukan tipe data elemen yang diinginkan."),(0,i.kt)("p",null,"Cara deklarasi vector selanjutnya adalah pembuatan vector dengan isi kosong. Deklarasi vector ini mewajibkan tipe data vector dituliskan secara eksplisit, dikarenakan tipe data tidak bisa diidentifikasi dari isinya (karena isinya kosong). Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut vector_7: Vec<&str> = vec![];\nlet mut vector_8: Vec<&str> = Vec::new();\n")),(0,i.kt)("p",null,"Vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_7")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"vector_8")," keduanya bertipe vector dengan isi atau elemen bertipe data literal string ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Deklarasi vector kosong bisa dilakukan dengan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"vec")," yang ditulis tanpa isi, atau bisa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec::new()"),"."),(0,i.kt)("h2",{id:"a163-iterasi-data-vector"},"A.16.3. Iterasi data vector"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," bisa digunakan untuk iterasi vector. Cara penerapannya seperti pada array atau slice."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_eight = vec![1, 2, 3];\nfor e in vec_eight {\n print!("{e} ");\n}\n\n// 1 2 3\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_nine = vec![1, 2, 3];\nfor i in 0..vec_nine.len() {\n print!("{} ", vec_nine[i]);\n}\n\n// 1 2 3\n')),(0,i.kt)("p",null,"Keyword perulangan lainnya juga bisa digunakan."),(0,i.kt)("h2",{id:"a164-ownership-tipe-data-vector"},"A.16.4. Ownership tipe data vector"),(0,i.kt)("p",null,"Salah satu atribut vector yang penting untuk diketahui adalah, pemilik data sebenarnya (atau owner). Agar lebih jelas, silakan coba terlebih dahulu kode berikut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_ten = vec![1, 2, 3];\nfor e in vec_ten {\n print!("{e} ");\n}\nfor i in 0..vec_ten.len() {\n print!("{} ", vec_ten[i]);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(2061).Z,width:"634",height:"626"})),(0,i.kt)("p",null,"Terlihat sekilas tidak ada kode yang bermasalah dari program di atas, tapi error, aneh."),(0,i.kt)("p",null,"Di Rust, ownership atau kepemilikan data adalah hal yang sangat penting. Saking pentingnya, beberapa orang menyebut Rust sebagai bahasa yang ",(0,i.kt)("em",{parentName:"p"},"value oriented"),"."),(0,i.kt)("p",null,"Dalam kasus kode program vector di atas, ketika keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," digunakan untuk mengiterasi vector ",(0,i.kt)("inlineCode",{parentName:"p"},"vec_ten"),", membuat pemilik data vektor berpindah ke variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"e"),". Hal ini efeknya adalah ketika kita berusaha mengakses variabel yang sama setelah perulangan selesai, maka yang muncul adalah error, karena value-nya sudah berpindah."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Perpindahan owner disebut dengan ",(0,i.kt)("em",{parentName:"p"},"move semantics"),". Lebih jelasnya nanti dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"))),(0,i.kt)("p",null,"Solusi untuk antisipasi error ini adalah dengan cara meminjam value yang sebenarnya dari owner, untuk kemudian digunakan dalam perulangan. Caranya dengan menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"borrowing")," menggunakan operator ",(0,i.kt)("inlineCode",{parentName:"p"},"reference")," yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"&"),". Data sebenarnya milik owner dipinjam untuk dipergunakan di perulangan."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai reference dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/pointer-references"},"Pointer & References")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai borrowing dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/borrowing"},"Borrowing")))),(0,i.kt)("p",null,"Silakan ubah kode yang sebelumnya ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for e in vec_ten {\n print!("{e} ");\n}\n')),(0,i.kt)("p",null,"... menjadi seperti ini, kemudian run, maka error akan hilang."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for e in &vec_ten {\n print!("{e} ");\n}\n')),(0,i.kt)("p",null,"Salah satu alternatif cara lainnya untuk antisipasi value berpindah tempat adalah dengan menggunakan method ",(0,i.kt)("inlineCode",{parentName:"p"},"iter")," untuk mengkonversi vector menjadi iterator. Jadi yang di-iterasi bukan vector-nya, melainkan objek iterator yang dibuat dari vector tersebut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'for e in vec_ten.iter() {\n print!("{e} ");\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"li"},"ownership")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/ownership"},"Ownership")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai ",(0,i.kt)("em",{parentName:"li"},"borrowing")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/borrowing"},"Borrowing")))),(0,i.kt)("h2",{id:"a165-vector-slice"},"A.16.5. Vector slice"),(0,i.kt)("p",null,"Seperti array, slice juga bisa dibuat dari vector. Cara penerapannya juga sama persis. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let vec_population = vec![2, 1, 3];\nlet vec_sample = &vec_population[0..1];\nprintln!("{:?}", vec_sample); // [2]\n')),(0,i.kt)("p",null,"Semua operasi slice bisa diterapkan di vector."),(0,i.kt)("h2",{id:"a166-tipe-data-vecdequet"},"A.16.6. Tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"VecDeque")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," adalah sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec")," plus mendukung operasi menambah dan mengurangi elemen dari dua sisi secara efisien."),(0,i.kt)("p",null,"Pada tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),", ada method ",(0,i.kt)("inlineCode",{parentName:"p"},"pop")," yang fungsinya menghapus data elemen terakhir dan method ",(0,i.kt)("inlineCode",{parentName:"p"},"push")," untuk menambah elemen baru dari kanan. Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," memiliki bebebrapa method tambahan, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"pop_front")," untuk hapus data elemen pertama atau paling kiri (indeks ke-0)"),(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"push_front")," untuk menambah data dari kiri (indeks ke-0)"),(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"pop_back")," untuk hapus data elemen pertama atau paling kanan (indeks terakhir)"),(0,i.kt)("li",{parentName:"ul"},"method ",(0,i.kt)("inlineCode",{parentName:"li"},"push_back")," untuk menambah data dari kanan (indeks terakhir)")),(0,i.kt)("p",null,"Contoh penerapan:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::collections::VecDeque;\n\nlet mut vec_10 = VecDeque::from(vec!["a", "b", "c"]);\n\nvec_10.pop_front();\nvec_10.push_front("z");\nprintln!("data: {:?}", vec_10);\n\nvec_10.pop_back();\nvec_10.push_back("h");\nprintln!("data: {:?}", vec_10);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Vector",src:n(4050).Z,width:"453",height:"129"})),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," tidak otomatis di-import. Kita perlu mengimport path dimana tipe data itu berada menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::collections::VecDeque;\n")),(0,i.kt)("p",null,"Cara membuat vector ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque")," bisa menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"VecDeque::from")," dengan parameter diisi data vectornya, seperti pada kode program yang sudah ditulis."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/vector"},"github.com/novalagung/dasarpemrogramanrust-example/../vector")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/macro.vec.html"},"https://doc.rust-lang.org/std/macro.vec.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/vec/struct.Vec.html"},"https://doc.rust-lang.org/std/vec/struct.Vec.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/std/vec.html"},"https://doc.rust-lang.org/rust-by-example/std/vec.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/collections/struct.VecDeque.html"},"https://doc.rust-lang.org/std/collections/struct.VecDeque.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/36672845/in-rust-is-a-vector-an-iterator"},"https://stackoverflow.com/questions/36672845/in-rust-is-a-vector-an-iterator")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/28800121/what-do-i-have-to-do-to-solve-a-use-of-moved-value-error"},"https://stackoverflow.com/questions/28800121/what-do-i-have-to-do-to-solve-a-use-of-moved-value-error")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/43036279/what-does-it-mean-to-pass-in-a-vector-into-a-for-loop-versus-a-reference-to-a"},"https://stackoverflow.com/questions/43036279/what-does-it-mean-to-pass-in-a-vector-into-a-for-loop-versus-a-reference-to-a"))))}m.isMDXComponent=!0},7662:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcUAAABuCAIAAADZD59KAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTY6NDg6MTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjExOjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjExOjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM2M2NmNTZmLWI1Njgt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"},3380:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB/CAIAAADw7lslAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6NTg6NDUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA0OjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA0OjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMzYmNmNWRmLTA4ZjUtYjU0NS1iZWM1LTdiOWQ2ZjRjYWZjNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpjM2JjZjVkZi0wOGY1LWI1NDUtYmVjNS03YjlkNmY0Y2FmYzUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpjM2JjZjVkZi0wOGY1LWI1NDUtYmVjNS03YjlkNmY0Y2FmYzUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmMzYmNmNWRmLTA4ZjUtYjU0NS1iZWM1LTdiOWQ2ZjRjYWZjNSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0wN1QxNzo1ODo0NSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmoDnekAABHqSURBVHja7Z07bhxHEIZ5EtLOFDuWlTITnThwQGWEUsEAAWc6CI/AUzj3ocyd2Z3pR1V1dc9zZ78fBizO9rO6+5/q1z939wAAAOpxhwkAAAD2BAAA2BMAAGBPAACAPQEAAMCeAAAAewIAAOwJAACwJwAAwJ4AAABgTwAAgD0BAAD2BACAo7Dn08vrj+fPp399fv7x+vI0e0k+Mlgg1WkFOte4BRVWastoWvFWsNjHX6/FIrprMbHXnaLnGRVz36GRwX4a7q6+7y3EnkoHF8wSYCxH9FwtXhy7kNtHgRoGXMNoFzM6p6GWcr7+IZuuIf0G9hTrHrdSn8Yi7KlaHvbcOVfuo+Hu6nveUuzpq/NpZF1y79jl9IePeKXYZiyppkuwpxK46yFPWjeZqX+oppvMnu11l9JZhj1LycKee/U0d9Fwd/Vl78s9+AdDFXpPKXHqgodiyMQA5TES8t/5Lz95JrHjP7saFcex3Cx53R1WSkoivF5PIeK3bBh9iJHlfloFeT47rk+WAyuaLspjLGnUNsEfQpHGR5E9A58yzDOruz5acnuKaeYPw3r2v15SUCxfNrKnewdZfvxz+KEL2jes2UP6Z0prSmk6DHL5QYnu70tinxdqpNS92JcufU7ointpuLt64o/mkwP/fH5+Caf24yjKyDCgrHzsFulTYk97imuwZ5S/xJ7ekZ3XXbOSVj3RzF3Q4Jew+MNjIfdLVYL/W/Qpmk4vUFo6jYjiyoa2HiYNclYae2b2FNO0H56i2i3qNbLSmmLIM6MMfeDHs9ZDhNGhtKaWZm7kMc3A8Hn0zzV9qdTny3XP+5I2OpTuu33DFdkzzyh+kvBRbg7BnbN8rpLLnZgoXo4trmampS07+Gn9SzEu4WUrSQaRMwr+vGSZJZkX5Bzk8lv6f6PMZY9Q6vFmkaIfhfdWzKzJlCD1NgR7imnKD889//nlVTea0ruN8EZrCu+YeONAzEkcHVprCmnKdU+Xq0ZeMPcy/H1J7PP+uhftqXXfzRvurtJb0zt+4mRnE4nc3xf3bkrOZzSy1Dm0loLle/roU20Wa56bcKFceL0vDK97uX/kuVeyp2i6+dlT90sdXV+wp5im/NB+t4Zp+42staYUslyjcQ0qHR0Ge6ZpGnUffc/R27WXoAp9qdTnpblTua+Lo0Ptvls33By+5/mdab/JLgEc7Oj2PSv3QbLYxVeQUCS5z+Z1L/JBPoXUm7wfRXKSUu5t7JmtDi7oe2bNGMZ1cU1PK1ma8sNLzcrejd/IcmvKIb010pa6/OwpGTn0OEwje/uSp8+3sadYEqP7bttwjeue2UQgWa6RZ/PjO0ulrMp1T82D8vie6TqnuO7pGdli3UUrlUh+SFzgoR/Z+pVu+Ub2jEyXlS/2W17HgZkVSXWuwiU5w28qjTdxEdN+qMxYhdzdRpZbUw5ZqtFQKGWty8meYt2VIaVF9/QlR58vE1DWl9TRUfCHtms43557lKe4sRXtFD4H7yLpEKacQsueu75OVj/v19lTnHgnZxHNugvbf3Jeyfs+a+NgP3PYixdy97OnZbps8zeY/j4NFhGKlHnOue30updt/JqdKjUO/wr7k+JGmdTEtpGV1pRCGvtgeY2y5xXsKRtEsmdxCarQlzSD+NhT7EvG6NBP6WzacA3nPVc+2LXfI2c3ZoKj133t3Bc8N13ajjxWD9uu4RruGi1ZKI4mg1vBWuzZtNYP5mPPNQh+d/fcATgCe+q3m8Fa7AkAACAA7AkAALAnAADAngAAAHvOjt8e/vnz17+/DH8//P3nr//0/z3aIcGqaNpsRJd6WpHQpT4Me377euG1Px/+mJU9U6LsOfTRE/La+KSx17p3WX1KxnVpSrJw6FLnZkeXGvY0qHMgzYdvy/qAEnsewxtrGpfBDYyi7tSz47BtRZr5sEGX2kkr6FLDnif8/uWXD7/v+2+K5zhOtB++fwR77B5+ffj2eHl+CvbLty+XwF8ffrcn6Sl7SiHlNOMi6W6yKnWhOGWxUq0u9Soo2irita4iJT3WvIbw9JLcA/eNgnL4pPujS+1gFXSpr0uXekn2/OPEg798+6QvRJ7/fWLPE5F9OvHdx08d7Q6M1hPZ+SfTzXQ8DNPs/t2R+5h4l3VWZnnQSwrBifyBV3VYVrTNxGu9RUpkTRwz7To2dKRpSdfeo0t9jy71AXSpl2TPbtqeMlFHqaNndwrz9cSeHXl9sNgpfMieF9f1wrBzsOc5zYHHe4f0U+CcfnLMdgbXRFK09c/LFNngorSWVaTohWuP4Ur29KaZlRhdanMhGV3qa9SlXt33jFdC/ex5DrkIe3Zh+ocJuRvNIqm4jFqcupJe4XUfsKd33ScvUuIbOlauXOxZkaak34kutU2i6FJfmy716uueyT5S71F6fc/HeWbuInsOi57CQq25KKZuPLjZU1G0da+ai0WK92DrtngcIRxOlcGe6FIb1kWX+v5KdKmX3XPvKC/kyi/Cuuf338rsmRHxnOzZJe4/TXXZkI0Xm4VVmB+qjGVGn7lscNWeo1wkkUqV1TaBPdOQepq1657oUt9bnQVd6mvRpV78vGdPoNEGd0+FgaNnsWfqEqab48PCZfTwsmUvh8x9z+9xyIL7mY/2omK0In+rywZXntiwipSNRGO2k5VeiPzqOhsqeCLoUsvb4OhSX6ku9Z7vGsXrnguvz6ZLsb/fg2mYSa8VXerD1/1qdalhT2UpFvbcDX8CAHvulT3TmTvUiUMHYM/rZk8AANgvYE8AAIA9AQAA9gQAANjTCb+SsSdk26ZThZryjDsi4zG5bfZYnPqeVSFXMp0vzVk2Cmrq7mrRMdB1fOiy3GxVX8adpy/dFntG1yKji/B+JWNPyCtjz00PNcKe879jJmqM7qyHeM+f1ZxSm9KXGoS6ZSW9KVbdij1X0DCGPbfM6IjsWTW0/bldBXtWsOIKRW0Q6n55edEkR5s7xl7Y069krKgjh/cy+5A9e365hE/0mYa7m3l0mz1LFwHHK2+WNEOpw4myP5qqqyhJm4bUtJkFPV1FFFZS3k1TlW7NPZmmm+jE+JpDlvjVtJWE+4pK3cXmEJtb0Sd2sKcuqu0UA5ZrlFtJz6ioZBwX36np5ben2TWKHeUcIJQykEW49Bpdhe/pUTIWE0m0k43oQcThoSDY7JmSSc0haRY4upObPaOun6nCR5K0uf6r4RdkqjyqxK8lHhUO1uyas6cYtezpbg5V4tdSHc6EI3KxtqQ5DHF4RZ+43fd0igF/VmokS3orTSPl7pOcrfC6xe5dskVRqDu0gigEI4u4Xsm6Zyhu5FGTU9kz1UlS5ZSGldaz6l10z91kT1VES5ChlHSUZ2BPQUZekaQV9cu87KlLXSidLDSCJDTr0L6tZk93c8iSjrKR0w8w2Zrtqiyo4YqmFpxh5m6KAYs1kjvtvfvTRrbGYIW0lMeeYuo+oe5Iwkl2JwyRpWv3PX3sGek2RTP3OPofj7/makzRPfd69pQUIaOvB5TJcxp7KpK0ub76cuwZjcUKiUzfRFUL624OWeLXcPBHTy3TmGpjT0OfuJk9a8SA0xppnVZOQV54UtWm3X5cO3s6hbo1hcPwsEMyZ6rZSjoKew7oP4A8zMdN3zOMMo09xcYTPy62sO8peVWL+57JMRXlozMr+Z4esWrJIY3cN4W25/E9Uy5qY0+/GLBUo4rPPBVLaKpNL8GebqHuZLlXXNHUPszsKf/h2HPUUTZk5B+VKBe5EHXdUxRwVV3+TLS4jj0zQVx1pilK0mb6rxYntbOnd1Znqfm2rnv6m0OU+JWMXLGe52bPgj6xiz1FUW2XGLD+OtE6reh82ucZGmrUzp714t/Wa0H5UOsVsadfydihjhwL12fkK4ku9x5rLHRvzhoiAdeCgqyjH1nzslEQ17FHrH+rVpjviVvxisSvoryryfFKBZBNN23P3dscikEk1eGiQnDpQ8GlPXeL2X2nC9ItclsMWN5xd4kEqzUy1abLFaq0p5mCKf4tjrHygRDn+ic3NXeBuY/IrXu88UgQPpq29OHFhRtrnhrt67znTgB7wp5AXAww57dXxJ5z1Wj+u0awJ5irh895zx32nKMtFr+AvtI999lqNPM9d9gTAABuErAnAADAngAAAHsCAADsuSEqFOc8GI+u7wbFpfxFpdtu5HjKDtsdwJ4dolvqc5JdjeKyG9Khjy3lF0tHz5cVvvRcRD0GKa9yfAnAnk3s2V/76YU8VvmM+zWO9vpryEvLBi9yOorvwAPYs549E9lN6aZmJpns11GWQ+YXQGOxu6JHsnPx2gVlg4XcVVEM5WsKsXCwXk1BYFixZ6mhguLEsjtmOQG4Ct+zk0Gy7rnHmsd+HWVdMrlfLhBFmJp8pTXFa/PH68oGW/QpRE/lOYQKWbIpQfaiPbUGsnJPPvUgWR6AHbOn6A+K7Ol6qLOn7M9+CpzTGdhTnNwuI15ruYv3G8gGi8rQau4uQRxFYFiWaZPbR7ZnF+k5lqTS3wsA7Nj3zMSQ1mDPLkzg+fqn7dYoW0+8NuOO1WWDVfocyFPOXf3ek8CeElt7yU23Z+pIWyEB2PnMfdQqXpc9E826qey5pnht9tPqssFZwTJlaE/uft/z8mcNexr2fBrfBigEgCtmT8kPDUSLF2DPLscGf/NeWZaTVs+WFa/NKGdt2WCRPmNlaLlGWj1Fe+YCw6YnrjuYeSuNSXIuCVwve575rlv9HD5DNIoWVzqkLsXlCztPcj83Fa/NqXAl2WDjPZArQ8t5hU/NagoCw272lHKPCzh+Hqzuy8kA9rxlJGudp6WD8ePvi2NeOd7ldjk85WSPBcCet4Xoq3C9H7oie24gx3vocgIAe66JeOa+InUKM/f9UtK1lBMA2BMAAGBPAACAPQEAAMCeAAAAewIAAOwJAACwJwAAwJ4AAABgTwAAgD0BAAD2BACAw7Dnz/f//n37a+XyfWR6xvp5g3Vb+P0n1gC3yp5L0Gue5jja2sdbl0ZbWf96+7c59yDuhFfCFLqZw3h9LepLntQ+zv70I+wJYM9l2TMecfUZngjk/a0papflJdopnUnV7Qryszr/abQ3xG3JfUjk/b2NPfVIsCc4IHtGHsOl9wcPu0e5U3UZCmnIyAlyDBeTkRvo+uf7UOCpTN/KPxPeNR9x5sqxja7OdvsJewJQYs+QIYYh89fb+2UURCyUjykt5DzsOcHX3Zw9m9iiq/Bb+8R9NHqbDztYDfYEoMCecZcWh0wYxB5TbeNDSnP0ZyeR1zT2nDZxb6Wf/6KXWUsBziufjQuu52gTiq+0HOwJboQ9lfV/YUyZOwWTaaadAyey56Tlx+bcE4apJ5yRcBu2zcKWmLrCndsP9gQ3wZ6R02P6nmrIuZy05jE3hT27oT+FPJqn/LExaisvrJ1URA936ydv2+dlhz3BwdgzGGHBMZVg2MVzyYyS1JDz7RoFadScpBHY0xddpU537jJx+6Iny9Bj5T3RY4cve7PVvBGSVqmNLrjusCc4GnsGLsf7z2HVPzzy+Bb1+vQwpB6ymT2N1bOUodWBK5+49ETPPLC66Mac3xddPW7qix4WPzKrM3etVWotb6+fA3AM9twaVStsE49gEn2r6LAngD23Y8/eq2oewETfKjrsCWDP5diTe+6HBvfcAewJAACwJwAAANgTAABgTwAAuDr2RB0ZLNrC7BqB22XPFfU9N5I3nkdeeCGB4YXZagZpZ8N4nFgCsOcK7LkTeeNpEiULCAx7GXAWkqq/q29rM8Oe4IDsuTd15OuWN75fUGDYVeKZGKpJl9rSZoY9weHYc7fqyNuzZxt5Ligw7Cvx2/s8Cw+N31TStJlhT3Aw9typOvI87Nk6cZ+kzbykwLAv8kRx5YkrNKo2M+wJboQ9d6COvK28cWMRlhUYrvQYW/mq2fKmNjPsCW6CPXehjrypvHHjiF9YYLjSlo18NeVbnIY2M+wJDsaeO1ZH3lDeWCaAbQWGVxBXNl5aE7WZYU9wRPbcuzry6vLGE7WZjYpNFBheRVx5orSzqs0Me4JDsufWQB35FqLDngD23I490SdGHRkA2FOe7XHP/ZjgnjuAPQEAAPYEAAAAewIAAOwJAACwJwAAwJ4AAAB7AgAAgD0BAGAJ/A9wxxZFJeVMpwAAAABJRU5ErkJggg=="},2061:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/vector-11-27b0884891ab00c87d90603997e1878c.png"},4050:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcUAAACBCAIAAAA+HTYdAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTg6MzM6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjAzOjMwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjAzOjMwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZkNDhjYTk5LTI1NzYt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"},7554:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAB0CAIAAACZnqXOAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MTk6MzErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjEwOjE4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjEwOjE4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQwMmRjMzhkLTJkODgtOGU0Mi05ZTliLWM4YjNhNmQ5OTRiMSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkMDJkYzM4ZC0yZDg4LThlNDItOWU5Yi1jOGIzYTZkOTk0YjEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkMDJkYzM4ZC0yZDg4LThlNDItOWU5Yi1jOGIzYTZkOTk0YjEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQwMmRjMzhkLTJkODgtOGU0Mi05ZTliLWM4YjNhNmQ5OTRiMSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0wN1QxNzoxOTozMSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pva+pd8AABB0SURBVHja7Z07ktU6FEXfSLohIyYG0s5oEgICyLpIqVfVVS9jIAyBUZAzqHevfS3rs490/L2fXruootsty5JsLR9J9vY/dwghhBboH5oAIYTAKEIIgVGEEAKjCCEERhFCCIFRhBACowghBEYRQgiMIoQQAqMIIQRGEUIIjCKEEBi9SL29/+/z638/hN/v//38+r/+30M9JdpVj0/PP76+22OnoHdffzw/PW54oGXF26GZD789N4vorsWE9rR2Lw/UPPoFNvJZMfrt4wC4z/efVsVoTswepg+elNcGlpmX70ntTuDqeBPzTHtQd4SgxqEOO87oeTO6vTxQqKhxuPXOYNIoocwz8p+BUVn39Cz1eWyCUbPlwajF0EDP+2/bRoUKo7cRn83qoKdr//hj7Yhd0q/6Yp+bZ9l/op17SFV3V113C4waibs+/mh19JXO4DuryRdjdH7dVT7bYLSVLRgd9P7Dq0Mk+P2tEUuOY/D774dkD93Gj/ffHobtx2Svvn0YEn+8f18fv+cYVSl1nmmR7MA5ZkHyqxGmRTf3wzURJcoSp+miyyjsYl5wqkjZpfuuhsjHpxBy1C/bCXmqfmA23VD9ZofWHStq1NNf+/4ZmjTkGzd/WpI821MPTwOm5OwN24ujH3LrbknH3x9rIa1sQeMKSYgT/SKKNG5K2lNcYLLuNkbL9pR5lhvLIcmQg9Hy7UY2z6ZIqfpRf2KrV0i/zTibIc9dMPrpCMRX397Yk5Wnn48YPRLtzRF8hz91/A1o64l2+lM18HRsjPPsfu4oP2beHboos+794YKOtkYXjRGxFRdPfJ11JzLkGZ32GgfLIsXHiDOaERrJcjvyzKuZYTQ5nsKot4s/DZtCjsmAPBzWDn7kCRnOQQyAovuLow9Vif6vcdR/hVSvunyXtLL6ArPOksRo0Z4yz/rGsj/UrpFaIxtnU6Ys+5F1hYhebJzNkOcuGO1G9DmSOraOsd4xzccjRjuKHXB2TB9jdAhmB9SugdFTngHofYj6JgpX3zgGQiFYOd6zsuhmwpBN8OX4a3LRVQdAokjJLbjemSdi1JtnUeKsms4iTdljSJ/uF/d7ow2zA0W/DocssiwLkt3A8v9bk83VGFFhtFqk5I/GBSbrns2NihtQP9xReeqNpyvrq4wprDC70cjVsyluNmk/kkfSvdg4myHP80Wj6WypH6OnlJtgtEvTb8woXzk/gaLlSOx0VvR5bgQAEUa9c0NlkbJo0TG75cLohDyL6teiUR9HzY5VGwJnUNQLXHZvPh3T6uHl0SdiNKmFOdhdjFE7UnXAS7SnzFNv1HcKlbe/ka2zqVK2azTOgxW92MZon+f55kazRac+xvRGow/rDOolRsPEqJjMrU6cmasUboyqScMpU+yySOnK7bT1IEcKR5hVwWgzmhAHEUeUIXsTDGK2xey0fXfSWaqjz8NoMYO4YTSqbnDx9EobOj1fyhl5uXGomXXG05b3NbI+mzqlt0ayv14ERk/si6H5QcyNfn/bxmhB5DUx2mXufxhrWMZNZ6bFTI2+bgpgxac/mdPxr1TqIkmmGjNyAqN5SjvPqXOj+VyonBv1dPFsOquMRmU51caQuQDSj3IxMfTb/OgzMZpcLEX5sgn3cJ8ti2SGW+UFJhu5BR050VnfmE5T1p5jczeyPps6ZatGoVCqv14IRgNJk2XxnolR6FfDaB4k5kvqYXIz2Tgs9OuUZTT6PU3ZCEjLbi9XGJOtes23XKmvLGPOLVLRJSsDoaL0Yudn1zOmIjaxHhu1MSrH5NkzjUPDfY2i0dpq77N5d1MzvslqQ7+vms4Zju7HqJqGNK+QaGT8GFpEFKk4m/YFJhu50cbPxdOpeZ7lxmLdSd2u82LWG9k4myplZdGs2jGfE16eH6MLlM6NbjyHm0/Xvr9Dy+SZ/vTdIPZ5gPAqnlS8ybrvffSFT8KOAqOt6VowejEgRQiMXjxG80E9DCXEQ2D0RjCKEEKXKzCKEEJgFCGEwChCCIHRFeW3WPaknLdCNcHmecXlk/Fxu/MsyDj9Riel3KnpfHmusqowpe6uMzomWmXFY4/LpFH99M30Xa6lF4rR5M3L5KV7v8WyJ+WVYfSsD0eC0fVvNgs9Ty/sCvE+vjblIbcl19IMB3Ft6LekVc+O0R3MlcHoOQ90ixid1Mf9R7sKjE7A4w5FneEg/vT0ZFmgzr4wLg6jfotlw7Y5fvWzT9lj9MOQPnOHCq+HlrvXMdp613B8q67mB9G68qTpkGU3K71y85SWabQw+jXcapUlcJ6rejHvsdp0C8Ma3+nQ3sOWs5N4JdKouzwd8nQbxskOjNpu306XYl2jspXsAzUtltPiOx3F/O1ZvTSaF8opQWyboC3A7BpdVzTqsViWmWSmzpXdox3DRuEk7RmtqfOijBIc15Ubo0kfKHzrE6/c0pi2EikUnkCm93DNuirutcUr1Z5iTMWo+3SY3sM1O+TCraL0jMtOR8W+3jBOnh+NOl2K3xk10l7jxqlRR/dZ4E6Iw+Xl3WqLpoN43ArSfUabyl7b3GhsreQxtTMxmrs0mWZOYTb2ZL6XvFNfxajp5SVsMZXB8woYFUb3hleutFHzYtT21zCutrgRlAOuw5R3Mkbdp0NbTOpGzj8aVXeVN21KK8Fp3oIrDOqrLsWyRvqivXN/jqludTjB2MrTnjJ3n4N4YiCl44qKxdPNRKM+jCauUcmgPt3908Pr0gsqead+OkaVQ2XyoYM2RZdh1PDKLR3gt8No0iknWHb6xrBWWvfp0N7DlZB/jN0Kh6t5GK0YJ8/G6BSX4rxG1kWrc9BzUqYNtjuym49Rp4O4ZbQYPyKRjaKmrDvdHEaD+u85h6F6NRqNd1mGUXkW5ZfRNo5GVZy1eTSaPeVifChnp2jU46KtQtQkoDP4vU40mkNpHkb9LsWqRhM+TdUsYdUGewuMuh3EsylhOetpfWfaU/7bxeho8Fwxun8wdhk8Ssy5Ueksa44GCjflaRgtnHrNQaj0yi2MaWtwmo9R74CvZjM8d27Ufzqk97Bq5Alzfm6MNoyTXRiVbt8ul2L7vmJdtDIcrT8FMaNG8zE63ZW8dn8wPjd7jRj1Wyw7bJtTa/2CwsoNuo9hUyv+6oAicZZtWNs6LqjakG106nWsLNuf3hVDQbmAb3gPG5bAlk+wKoBuumUr9d7TYTSIskNuWhe3vnvcWqmvId61uF0srNddivU6vcu92KxR1Qa7XaGJ7VnNoepKLvtY+zES5xwpL4NeltZ+1G7fxyRvSeKLb1s/BLnxyVqnRpf13OiFCIyCUVSfJ6gOfa8Io2vVaP23mMAoWv1SX/OdejC6xrnY/GX3nd6pX61GK79TD0YRQuhlC4wihBAYRQghMIoQQmD0wjXB+M6j8Vn4i1Fz3n9TB7kX8nTLBZ53BEZTJW/Er0m9KVbQbqlnRs5pB9l6ln1bI07Pu663Qeddnn5CYHQZRvsXinr3kF0+T3+N3X76K89b+xlv8nAV37dHYHQBRjMbUPUyaOHl7Dd41inLd0xTz71mjHLhrrob+hmLo5tOHMaHH1JHY7uawvnYaM/WiYqKk5r+VMuJ0HVFo50JU+2d+tSM2W/wbHs59zMJ0gJqVvS0p6tuuXlfP+MaR8XuuSeIqFDNqyU6vGxP6wTVjp59lUK1PELXgFEZIUqMujbaGNUR7psoXF0Bo3Lcu42rbi2AvDuDn7G0rDaP7rLjMZyPtVucPj+6PbudvqaGWPYNAqFriEYLK6Y9MNqliWJh/4i+1t32c9UtILK7n7HJ0UBRfXTzG1UCowrbXsrZ7ZmH1rWUCF3LoH40Ud4Xo5l13lKM7umqW/xpdz/jomCFZbXn6P5odPh1CkYr7fk43hZwI0C3gFEVmUZuyhtgtDvijAj0zpi6UzNs27rqFuzZ289YcjS1rNY1suop27N0Pq7G5nbIWZ6lMUsea0I3gNET+LoZ0vDppNFNeWKI6rKCHjC9KCA9q6tuycSd/IwrN4TSslofK95araZwPnZjVB09LeD4bbNpH4JGYBSV86HHWYXxo/aba12f4O2WRDzlZEEGgdEXquSTdn1kuiNGz+ATfNPlRAiMnkXpoH5HhopB/eWy6VrKiRAYRQghMIoQQmAUIYQQGEUIITCKEEJgFCGEwChCCCEwihBCYBQhhMAoQgiBUYQQAqM0AUIIgVGEEAKjCCEERhFCCIy69PP33z+/vuxc0MNBTwrHPm46/vLl15+/f3//PG46/tj/dB6JIu24+3mlCz+et2urD0JnxegWnBV5Lsbo+uUEo7rw5769IQRGdZ6hb45/OzdGRZF23P28qhUejCIwOvSEv/nAOtrYbUoSJWO5PGUyWHf0MB9Y+u4aBpIhX185D/v9/tX95c+vn6f/v+jCH7YcfioPtBWf0tZMqDT8YhUp2n3Y1jdm+MNx87Z1B6MIjPa0Szth1zl+D2Q79pN40jJDnpVyC4yG7h7K7C3nUJbo/36UWu4eHyir0VZBnrUtwqioe3TixnKeEHhqnOPWjesORhEYTXuBJFqcpI68eV1qSjSq2O8p5/B7/r/YXYJsu1i0NtUoi9SXvQ8yf6oKjjXr9tu47mAUgVELo9nYuIJRI+W2GA2/OctpoUTsvh9G76LV7ngupY3RAxzLyQuLkdvWHYwiMKoxWsY0FkbNlJtHo6eIzFdOhRJj910xWjSjOxo1SubE6Hp1B6MIjEbD42hiLJt2G6O8YsLMTLnNElNWCnc5bZQUu09ESTJvuWh8HzAaTYKWRUqAW5ZtEkaX1h2MIjCaDyx//+xXatOxcrfKmw6n4xG0nXKLJab8iQBvOY2Brdp9Kkryu8ckdIrJkLC5X1cfl5jKpyHEdv+gfo26g1EERi9D1/gk5Z01r7GJLhlVYBSBUTC6lKB/ty89GEUIjPomFa47KH1xqOKdegRGEUIIgVGEEAKjCCEERhFC6CVjdHx+cNuVghe1pNstv7BihtCLikZXh1zxGNPiIwhbuGvC6OrPdY0r5ayVIwRGfQUc8tv+efeNyLpVobf180MIjM7EaBn7WZ6+cVR0jMEMg2fLd/nO/9ponH4OkaOSWu7ULo/k7G39dHM5SWI6SWdOd1mTTmsQMIrQhWFUWQJrT9/M2iQmQRmNGpbAu2BUxbAt6+KWP7QdF5extzTHSsA53Y4AiiJ0sRgVlsCGb0Xc/es++asZ0M0a07fHvRVXui92SitPB0bjNPM/8MTcKEIXiVFlCVz7vsUYjY4s2Aijc7+saQSwLeviOBwtUtaCYg9Gk0/FLV59Ix5F6NIwWnZrnSSeGVUOn2titEPZPFzIA7ati6v+0LVKuDA6pFpKUQxCELq8Qb2M+RQH7e5bBEgVjLqmAk2G+oyTVZWa1sWBntofuhIalw2jI8YjXP/8ERahu6y5IYTWwGgxgC8/m1z7vkWxTi9NhRuWwB5qZMeJj+Q1To6rZLtTT/OHLvK02vPOePBVzvR6GiQ5EAxF6PzR6DqDyTPN0a36IOnO42NW2RF64RhNR5Nz138WFmDdh/F3xSijcYRePEbzwfYNIGEnjJ7ajUgUITCKEEJgFCGEEBhFCCEwihBCYBQhhMAoQgghMIoQQmAUIYTAKEIIgVGEEAKjCCGE5uh/fx42cQ4+0S8AAAAASUVORK5CYII="},41:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAACGCAIAAADBxB3cAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjA6MDUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjM0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjM0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZiNGQzY2VkLTBjZDYt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"},4480:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcQAAACHCAIAAAAHhr4+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjA6NDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA5OjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZhMjMwODMxLWFhZmMt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"},5216:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAACDCAIAAAB6PjdsAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjE6MTErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjIzNGI3OWZlLTU4NDIt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"},8859:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAABtCAIAAAC+8Pi1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjU6MzYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjAxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA4OjAxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmVlYjdiM2VmLTJiMzgt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"},802:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAABeCAIAAAA4612LAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6MjY6MzUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA3OjIwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA3OjIwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRiMzkxYzljLWFmOTAt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"},2366:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAB9CAIAAAC+kfQGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6Mzk6NTkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA2OjIyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA2OjIyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE0NDc0MjZkLTFjYTctMmI0Yy1iZTE4LTU2MjFmNTk1OTk3MiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxNDQ3NDI2ZC0xY2E3LTJiNGMtYmUxOC01NjIxZjU5NTk5NzIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxNDQ3NDI2ZC0xY2E3LTJiNGMtYmUxOC01NjIxZjU5NTk5NzIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjE0NDc0MjZkLTFjYTctMmI0Yy1iZTE4LTU2MjFmNTk1OTk3MiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0wN1QxNzozOTo1OSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pp9owI8AABJCSURBVHja7V07kty4EtRJZiRP9tqS3PE0cmTIGHkTchUbMRHr6SA6gk4h/x3qTZNNEkBlFQoAwSa7M2MjVs3BtwAkC7/kmzuCIAiiAW9oAoIgCNIoQRAEaZQgCII0ShAEQRolCIIgSKMEQRCkUYIgCNIoQRAEaZQgCIJYmUYfn19+Pn04/evD08+X58fVy/OaQYdU2wp0rnENCqxUl1Fb8Taw2Ouvl2wR3bVo7HWn6DKjbO47NDKxq4Z7U9sJO9Go0tOBfQIs5Yieq8WLY2dyey1QxcirGPYwo3MaainX6yjYdBXpV9AorHvcSmMaXWhUtTxpdOekuZuGe1PbBXvRqK/ypyE25T7QzOmHj4FRbDMWqmkPGlUCD13lUesvK3UU1XTNNFpfd5ROHxrNJUsa3avvuZeGe1NbibECs8cw12X0nRI3L3gIQyaWyA+WkAjPv/wsmsSOfw41yg5o3D6y7g4rJSUBL9xTiPi9G0afY4jcTwskT2dX9tFyaaHpojyWkkZtE/wARVoeRfYMvMwwT1F3fdhIe8I05cOwnuNfpxQUy+eN7OneQZav/5z/MAQdG9bsIeMzpTVRmg6DTH9Qovv7EuzzoEZK3bN9aepzoCvuqOHe1L4KoqnmTEQfnp7DWf8ynAQrBtwlB3GWRxGN2rNfg0aj/BGNeoe4rLtmJa160MxD0OAvYfHnxyD3qSrB/y0ehabTC5SWTmOkuLKhredpBM5Ko1FhT5im/fAU1W5Rr5GV1oQhz2Nu7gM/n7QeAkaH0ppamtLIS5qB4WX0DyV9Kdfn83WXfUkbHUr33UXDOWlU5hg/SYhJ2gU4eJYXlvPGE1vFS7bZFc+0tHnfP61/LsYUHlsJGQRnFPycshRJyoKcg0x/S/9vlDnvI6KubxYp+iN4gcUUm0wSUv8D2BOmiR+eh8DT84tuNKV3G+GN1gQvm3hzAeYER4fWmiBNXPd0JWshCHO/w9+XYJ/31z1rT6377qHhnDQqaVIZAYn/LeYYcioAN3py7mg0xNTptZaC5Y36eFRtH2sKnJAiLrzeKWYHAHcUmXshjULTrU+juqfqGAPAnjBN/NB+yYZp+42stSYKma/RsjyVjg6DRtM0jbov3uji/9qrU5m+lOvzaDaV7+twdKjddwcNt543en6L2u+2KYCDJt3eaOGmiYidfSmBIuHOK+ueJQY5u9TbfhxOOEmUex2NihXEjt6oaMYwrot0Rn4RaeKHU83y/o7fyLg1cUhvjbRVMD+NIiOHrodpZG9f8vT5OhqFJTG678UbrmltVMwRkiUdPNFf3mIqdxWujWo+lccbTddC4dqoZ4jDukMr5dh+ThwQ0k+xxqVbvpJGI9OJ8sWezMsyQkWRVHcrXLYzPKlc34ULnfZDZTILcncbGbcmDpmr0VwoZRnMSaOw7sqQ0qJ7+pKjz+eZSPQldXRkHKOLNlzJTn2UOdwOi/YXn4K3EzrMiVOo2anX19LKlwR0GoVz8uRMo1l3sGmI80o8ANHYwS7ovIMPcvfTqGU6sWUczIwfZ4uAIglfWtpOr3vexi/idKpxiBhsZsJdNdTEtpGV1kQhjU0zWSPxvIBGsUGQPbOrU5m+pBnER6OwLxmjQz/bc+mGqz43uvEBsf0eXbsxE1x73bfOveP569ze5XX1sIs2XPUtpp6l41ln4lawFY1W7QcQHWh0C8rf3Z16grgGGtUvUBOb0yhBEAQRgzRKEARBGiUIgiCNEgRBkEa3xz/3/3199++n+ff9v1/f/Tf+92CHJDZF1c4kBbPbikTB7Ouj0e+fJ4L7ev9lVRpNGXMk0wdPyKMRS2X3de/N+iSWy9JE6nQUzJZmp2A2adTDoTN73n/v6xUiGr0O/6xqgAZ3O7KqV0+OQ7sFacrxQ8FsJ79QMJs0GuHjp7evnuCPfxRfcpmD3/94DfYwPPx8//1hen4K9vb7pynw5/uP9vw9pVEUEqcZF0l3nFV9DcVNiyV0dQ1aILWrqOq6ipR0XfNew+NzcufcNxzy4ZNxQMFsB71QMPtwgtn9afTLiRDffn+vL1ae/32i0ROjvT8R3+ufBv6dqW1ktPOfTMfT8TBMc/j3wPJL4kPWosx49CPp4kRzwSuHjKV2haqut0iJlopjEl5Gi440LU3dOwpm31Ew+zoEs/vT6DCjTylp4NbF1zuF+Xyi0YHFXunsFD6k0cmZnah2DRo9pzkT+uiivg/c1feOidDsrCCpXf+UTdEzzip8WUWKXsH2YC6kUW+aosQUzDYXmymYfVDB7At5o/FqqZ9GzyG70OgQZnyYsLzRPkhDZtEG1QX9Mg5AQKPetSFZpMRbdKxuuWi0IE2kJ0rBbJtNKZh9QMHsC62NJptOo4/p9UYf1pnUQxqdF0bBYq65cKbuUrhpVJHadS+xwyLFO7dl+0GOEA43y6BRCmYb1qVg9t1xBLO32KkfuC8kzU9gbfTHP3kaFYy8Jo0OifsPY03buPHKNFip+anKagoelXrGRTuVuEiQU5UVOUCjaUg9zdK1UQpm31mdhYLZBxLM3ujc6Mik0bb4yImB62fRaOokplvq8+Jm9HDa6MchpTf6Iw6ZcUjlsM9KWSu6vLqeceGBD6tIYkgaEyFRehD5xXXGFPgmFMzGm+cUzD6uYPb+bzHFa6Od13DT5dqPd0QbVtKPpWD21df9yILZpFFzuZY0uhsiJQjS6O5pNJ3Uk0Pp4hGk0SuhUYIgiF2DNEoQBEEaJQiCII0SBEGQRteCX2LZE7Juh6pA5nnF7ZPluN1lNmSceqNFITcynS/NVXYVSuruatEl0DE+15lvtqLv+67Tl26URqObl9Gle7/EsifkwWj0oocjSaPrv2waNU931kO8x9dKDrm19KUKBXEs6Ndo1cvS6AbiyqTRS2Z0jTRaNMb9uR2CRgvocYOiViiIPz8/axKoLR1jXzTql1hWZJvDq59jyJFGP03hE3Wo+XqojG7TaO6u4XKrztKDyPU8KDqkyc1Crdw0pCYaDYR+FbVaJAmcpoou5j2apmt0a3zNgbWHNWUncCVSqTtsDtjcinCyg0Z1tW+nSjGukbSSnlFWYjkuvlNRzG9Ps2tkO8o5QCibgCXA9Bodyxv1SCzDRBJRZyN6EHF+CJSkPbM11C5IKMHRr9w0Go0BoVsfaeVKYVrDUxCaQKr2sCVdFY5acaXaU4xSGnU3h6o9bMkhC7UKqRmXNIchX68IJ9d7o06V4g9KjbDWuNI0KHefBG6BHw67d84WWQXx0ApQfQaLyh5tbTSUVvKI2qk0mqo0qWJO82rsWXwvulNv0qiq5QVkMZHA8wo0CoTuFa1cKKPmpVFdX0PpbaERkAKuQ5S3mEbdzYElJrGR049G2aryqkyp4ZymFlxhUm+qFMMa4U575/4cky11WCBs5bEnTN2nIB4JSGG/wpB4uhpv1EejkWpUNKmPo395eCe1oKI79eU0ihQqow8d5Fm0jUYVrVypAN+PRqNBWSDZ6ZvDamHdzYG1hw2Xf/HdhMJVHY0awsnVNFqiUpzWSOu0OAW8JqXKYLs9u3oadSqIa0KL4RGJZBZVuO90XTQ6Y/ye8zxVN73RMEobjcJWhF9G6+yNIj+ruzeanHJRPpSzkTfqUdFGLmrk0Cn8vY43mpJSHY36VYpRjQo+TZUtoSmD3YNG3QriyZIwXPXUvjPtZNIrpdFF4NkQun9QokwaJeraKFSWVWcDQk25jEaFUq86CYVauUKY1iKnehr1TvgsmeHatVF/c0DtYWTkgjU/N41mhJNdNArVvl0qxfp7Reu00B21T0FU1KieRstVya33g/K52SPSqF9i2SHbHEvrCxZGatCjDxtL8ZsTikhZNiNt6+hQ1pRtUep17Czrn94FU0G4ga9oDyuSwJpOMCoANl3bTr23ORSDIDnkrHRx7rvHuZ16i+Jdm9tiY91WKcb79C71YrVGpgx2vkKF9jRTMFXJ4RjLHyPxr5HyMuiOsPZRu22PSV4TwBffeh+C7NxY69RoX+dG9wPSKGmUMNYJzKnvgWh0rRqtf4uJNEqs3tXXvFNPGl2jLbpfdt/oTv1qNVr5Tj1plCAI4uZBGiUIgiCNEgRBkEYJgiBIo3tGgfCdB8tZ+N0gu+7fVUHuRk637LDdCdJojOhG/JqsVyIF7QY6M3JJOcjcWfa+Qpyeu67Xwc6bnH4iSKNtNDpeKBrVQzb5PP0Rh335lefeesZdDlfx+/YEabSBRhMZUHQZVGg5+wWecUh5xzTW3Mv6KDtX1e2oZwxyV5U4lA8/xIrGejWB8rFiz1xDBcWJRX/MchLEsbzRQYTJulMfizH7BZ51LedxJQFKQFV5T1uq6srH2+oZWzwKoqeaIKBCllZLkD20p9ZAVu7JVymQ5QniCDQKPURIo66HOo1iD/d94K6uQKNw3ttHVddyIO8uoGcMJavV3F1yPIryMVaLw+2D7TlEeooFsfQXBEEcwRsVUkxb0OgQJvCF/TN6a7htp6orSGRzPWOVR2cWxbmr36gCNIpo28tyuj1T19oKSRBHmdQvIsrb0mginddKo1uq6oo/ba5nLAomJKs9ufu90elnCY0a9nxcXgtUIyCugUaRZxqoKXeg0SHHCg/0Tlm6QytsfVV1BfdsrWcMeTSWrMY10uoJ7SmVj03fXHc5ZSstSfJYE3EFNHomvmGFdP500qKmXOiiuqSgJ5puckgvqqorOXEjPWPjhSAlq3Fe4VOzmkD52E2jKPe4gMu3zco+BE2QRgm5HnpaVVg+at8d6+oE99sS8ZSTGzIEafRGEX3SbvRMN6TRC+gEX3U5CYI0ehHEk/oNORRM6vfLTUcpJ0GQRgmCIEijBEEQpFGCIAiCNEoQBEEaJQiCII0SBEGQRgmCIAjSKEEQBGmUIAiCNEoQBEEaJQiCIEijBEEQW9Porz//+/v728alfM30jO3zvhUsNv7zi9YgiIvSaA+elWkug75+2A9p1JX12++/1bkHcRveDS2sZxjvVDjSKEHcBI3GA788wxOT/PldFXXIcop2SqepukNBfhXnX//yiIhS5E4aJYheNBp5UBNtBA+HR9LNmkZkGjJyixyj1qTmCt7+9WcucCvl19Bg40vnNc5aOQrWJI0SRB8aDaliHoXffv+ZRmNER5IYtJDr0GiD93txGq0iraHCv+vn9IvRgVdLGiWIHjQajyzIWmEQm9bqhilKc/Fwm1isjUbb5vRVb4Cx3oG1awpwXh21W5IgiN40mszhDRpVQq7EN/Vk2EijTUuU1bknRFfOewvzgj020ihBbEejkRtkeqNqyLXctuqh30KjA4e2uLLVqwGxMUorD5ZVwuikUYLoQaPBUBvdyplGow2kafAJblJDrrfFFKQRFLGGRn3RVQ51544Z3Bc9WapeKu+JHrvQYk2ANEoQXWg0OGj459d82Cc8Ovk7GnzpoUo9ZDWNRssEcpMkl6g4UxDvXeeih+cuK6IbywG+6OqxVV/0sPho/YU0ShAdaPTSKNqLaTzKecvRSaMEcfM0OvpZ1Txyy9FJowRx9TTKO/Wb2Zg0ShBXSKMEQRCkUYIgCNIoQRAEQRolCIK4AI2ucH39zpvPzexvNKidEgRxUG90dZKDh+qbczjKjjOg0T5fFuAWPEGQRsuKeGCyWJ9GD24Qgrh6GpVXEsebosHVUeEQjYc/FYHnMQcZ/c55bbRNzzgtqaZOrVdTUacWacpFEmyQRDck+rmVQQiC6EejieJIoH+/cMWixxZIm4RMgG7Kp9HdrNGqZwyvUiLN6UgCZK4dVqfWr2dK3xuKYykf/NjEIARB9KTR2NEZBmwSZPoRDn9bJx9GL5vANugZ52XzpiLlhazDkFqaDhoNw5TP+FcReCYIoheNos9bKjwYuKAxq3Sg0RY9Y0UAFGhOCxoVSlZTSEtU1EOjS6CK+XmzwDNBEL1pVI5JHEQTZluZRhv1jHEEqDkNvFFXyAoanUJVrXI2GoQgiL6TergHjHhQH71ixmvQqHdHpV7PGFcJak4nYv+WjrWxVS4Ng5cATmT492/6vM0gBEFsS6NiAi8/mxx8Ytn2RmM2S/b6W2m0Vc84rpKuTg0/N62qU4s0NXtq5Yermo0GIQjiEt5oJcAK3QV2OlbdYNl4etznVD5BEIehUfCppG39onX0jC9Go5yME8TN02g6qb8CStiIRtWPyRMEcWs0ShAEQRolCIIgSKMEQRCkUYIgCNIoQRAEaZQgCIIgjRIEQZBGCYIgSKMEQRAHx/8BRc/bn/H2QocAAAAASUVORK5CYII="},6241:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAAB/CAIAAADw7lslAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMDdUMTc6NTI6MjYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTA3VDIwOjA1OjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTA3VDIwOjA1OjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjlmZGJjMGIyLTFmNTUtZjY0MS05MWExLTgxNWY5OGQzOWZhZSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5ZmRiYzBiMi0xZjU1LWY2NDEtOTFhMS04MTVmOThkMzlmYWUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5ZmRiYzBiMi0xZjU1LWY2NDEtOTFhMS04MTVmOThkMzlmYWUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjlmZGJjMGIyLTFmNTUtZjY0MS05MWExLTgxNWY5OGQzOWZhZSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0wN1QxNzo1MjoyNiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PoNjrJEAABKgSURBVHja7V27ctw4ENSXrOzM8cW2U2WWkwscyJnKqeuqVHWZP8SfoK9wfh91WnJJApiewQDgc7e7ruq8FJ4DoDl4Ne9OBEEQRDnuaAKCIAiyJ0EQBNmTIAiC7EkQBEH2JAiCIMieBEEQZE+CIAiyJ0EQxBWw5+Pzy8+nj+d/fXz6+fL8OHsx3jJYINW2Al1qXIMCK9Vl1Fa8FSz29uslW0R3LRp73Tm6zCib+w6NTOyq4e4K+95C7Kl0cGCWAFM5oudq8eLYmdzeClQx4CpGO8zokoZayvn6BzZdRfoV7AnrHrdSn8Yi7Klanuy5c67cTcPdFfa8pdjTV+fzyBpy79jl/MNHvCi2GQvVdAn2VAJ3PeRR6yYz9Q/VdM3sWV93lM4y7JlLluy5V09zLw13V1j2vtyjfzBWofeUEqcueAhDJgbIj5GQ/y6//OSZxI5/djXKjmPcLLLuDislJQGv13OI+C0bRh9jiNzPqyBPF8f10XJgoemiPKaSRm0T/ABFmh5F9gx8yjBPUXd9tEh7wjTlw7Ce/V+HFBTL543s6d5Blm//HP/QBe0b1uwh/TOlNVGaDoMMf1Ci+/sS7POgRkrds31p6HOgK+6o4e4KiT+aT4788/HpOZzaT6NIkGFAWXLsZukTsac9xTXYM8ofsad3ZMu6a1bSqgfN3AUN/hIWf3wMch+qEvzfok9oOr1Aaek0IoorG9p6nDTgrDT2FPaEadoPz1HtFvUaWWlNGPIy1MY+8PNJ6yFgdCitqaUpjTylGRheRv9Y0pdyfT5fd9mXtNGhdN9dNNxd4cQqfpLwkTQHcOcsnyvncicmipdjs6uZaWnzDn5a/1yMITy2EjIIzij4OWQpkpQFuQQZ/pb+3yhz3iNEPd4sUvRH8N6KmTWZEqTeBrAnTBM/vPT8p+cX3WhK7zbCG60J3jHxxgHMCY4OrTVBmrju6XLVxAvmXoa/L8E+76971p5a991Dw92VeGt6x0+cbDGRkP4+3LvJOZ/RyFLn0FoKlu/po0+1Wax5bsKFuPB6Xxhf97h/yNwL2ROabn721P1SR9cH9oRp4of2uzVM229krTVRyHyNpjWodHQY7JmmadR98j0nb9degsr0pVyfR3OnfF+Ho0PtvjtouGbf8/LOtN9kQwAHO7p9z8J9EBE7+woCRcJ9VtY9ywdyCqk3eT+KcJIo9zr2FKuDC/qeohnDuC6u6WlFpIkfDjXLezd+I+PWxCG9NdKWuvzsiYwcehymkb19ydPn69gTlsTovps3XM26p5gIJMs1eDY/vbNUyipc99Q8KI/vma5zwnVPz8iGdYdWypH8mDjgoZ9i/Uq3fCV7RqYT5Yv9lpdpYIoiqc5VuCRn+E25LgsXMe2HyowV5O42Mm5NHDJXo7FQylqXkz1h3ZUhpUX39CVHn88TkOhL6ujI+EObNpxjzz3KE25sRTuFT8G7CB3CxCnU7Lnr62Tl836dPeHEOzmLaNYdbP/hvJL3vWjjYD9z3IsHufvZ0zKd2PwNpr+Po0VAkYTnLG2n1z1v4xdxqtQ4/Av2J+FGGWpi28hKa6KQxj6YrJF4XsCe2CDIntklqExf0gziY0/Yl4zRoZ/S2brhSs97rnywa79Hzm7MBNde97VzX/DcdG478rp62KYNV3rXaMlC8WgycStYiz2r1vqJ+dhzDYLf3T13grgG9tRvNxNrsSdBEAQRg+xJEARB9iQIgiB7EgRBkD3nxV/3//79/p/P4+/7f/5+/2//34MdklgVVZuN1KVuKxJ1qa+GPb9/GXjt7/uvs7JnSpQ9hz54Qh6NTyp7rXuX1adkXJYmkoWjLrU0O3WpyZ4GdY6kef99WR8Qsed1eGNV4zK4gZHVnXpyHLYtSFMOG+pSO2mFutRkzzM+fX735vf9+EvxHKeJ9v2Pt2AP3cMv998fhufnYO++fx4Cf7n/ZE/SU/ZEIXGacZF0N1mVulCcslipVpd6BYq2initq0hJjzWvITw+J/fAfaMgHz7p/tSldrAKdakPp0u9GHt+PfPgu+8f9IXIy7/P7Hkmsg9nvnv7U0e7I6P1RHb5k+lmOh6GaXb/7sh9SrzLWpQZD3qkEJzIH3hVh7GirRCv9RYpkTVxzLTL2NCRpiVde6Iu9Ym61NehS70Ye3bT9pSJOkqdPLtzmC9n9uzI643FzuFD9hxc14Fh52DPS5ojj/cO6YfAOf3gmO2MrglStPXPyxTZ4Ky0llWk6IVrj+FC9vSmKUpMXWpzIZm61AfVpV7X94xXQv3seQm5CHt2YfqHCbkbzYJUXCYtTl1JL/O6D9jTu+4ji5T4ho6VKxd7FqSJ9DupS22TKHWpD6hLve66Z7KP1HuUXt/zYZ6ZO2TPcdETLNSai2LqxoObPRVFW/eqOSxSvAdbtsXjCOFwqgz2pC61YV3qUp+Oo0u94J57R3khV34G654//sqzpyDiOdmzS9x/mmrYkI0Xm8EqzE9VxlLQp5QNLtpzxEWCVKqstgH2TEPqaZaue1KX+mR1FupSH0iXetnznj2BRhvcPRUGjp7FnqlLmG6OjwuX0cNhyx6HlL7njzhkxv2Uoz2rGK3I3+qywYUnNqwiiZFozHZE6UHkF9fZUOCJUJcab4NTl/q4utS7vWsUr3suB7iR9elEtGEmvVbqUl993Y+sS33z7AmXYsmeu+FPgiB77pU905k7qZMOHUH2PDZ7EgRB7BpkT4IgCLInQRAE2ZMgCILs6YFfydgTsm7TqUBNecYdkemY3DZ7LE59z6KQK5nOl+YsGwUldXe16BToGB+6zDdb0Zdx5+lLt8We0bXI6CK8X8nYE/Jg7LnpoUay5/zvmEaN0Z31EO/5s5JTai19qUKoGyvpNVp1E/ZcQcOY7LllRtfInkVD25/bIdizgBVXKGqFUPfz87MmOdrSMXbBnn4lY0UdObyX2Yfs2fPzED7RZxrvbsroNnvmLgJOV94saYZch4OyP5qqK5SkTUNq2sxAT1cRhUXKu2mq6Nbco2m6RifG1xxY4lfTVgL3FZW6w+aAza3oEzvYUxfVdooB4xpJK+kZZZWM4+I7Nb389jS7RrajXAKEUgZYhEuv0SF8T4+SMUwk0U42ogcRx4dAsNkzJUPNgTQLHN3JzZ5R1xeq8JEkrdR/NfwCocqjSvxa4lHhYBXXnD3FKGVPd3OoEr+W6rAQjpBibUlzGOLwij5xve/pFAP+qNQIS3orTYNy90nOFnjdsHvnbJEV6g6tAIVgsIjrQdY9Q3Ejj5qcyp6pTpIqpzSutF5U76J77iZ7qiJaQIYS6SjPwJ5ARl6RpIX6ZV721KUulE4WGgEJzTq0b4vZ090cWNIRGzn9AJOt2a7KghquaGrBGWbuphgwrBHutCf3p41sjcECaSmPPWHqPqHuSMIJuxOGyNLRfU8fe0a6TdHMPY7+9eG9VGOK7rmXsydShIy+HpAnzzb2VCRppb76cuwZjcUCiUzfRFUL624OLPFrOPiTpyY0purY09AnrmbPEjHgtEZap8Up4IUnVW3a7cfVs6dTqFtTOAwPOyRzpsKtpKtgzxH9B5DH+bjpe4ZR2tgTNh78uNjCvifyqhb3PZNjKspHZ1byPT1i1cghjdw3hbbn8T1TLqpjT78YMKpRwWeesiU01aaXYE+3UHey3AtXNLUPMzsJ9LrYc9JRNmTkH5Qog1yIuu4JBVxVl1+IFpexpxDEVWeaUJJW6L9anFTPnt5ZnaXmW7vu6W8OKPGLjFywnudmz4w+sYs9oai2SwxYf51onRY6n/Z5hooa1bNnufi39VpQPtR6IPb0Kxk71JFj4XpBvkh0ufdYY6F7c9YQCbhmFGQd/cial02CuI49Yv1btWC+B7fiFYlfRXlXk+NFBcCma9tz9zaHYhCkOpxVCM59KDi3524xu+90QbpFbosB4x13l0iwWiNTbTpfoUJ7mimY4t9wjOUPhPjXP3lTc3vMfURu3eON1wTw0bSlDy8u3Fjz1Ghf5z33A7In2ZPAi5J1+7D7aqy5ajT/XSOyJzFXD5/znjvZc462WPwC+kr33Ger0cz33MmeBEEQtwqyJ0EQBNmTIAiC7EkQBEH23AoFinMeTEfXd4PsUv6i0m03cjxlh+1OkD07RLfU5yS7EsVlN9Chjy3lF3NHz5cVvvRcRL0OUl7l+BJB9qxiz/7aTy/kscpn3I842suvIS8tG7zI6Sh+B54ge5azZyK7iW5qCslkv44yDikvgMZid1mPZOfitQvKBoPcVVEM5WsKsXCwXk0gMKzYM9dQQXFi2R2znARxCN+zk0Gy7rnHmsd+HWVdMrlfLoAiTFW+0pritfLxurLBFn2C6Kk8B6iQJZsSZA/tqTWQlXvyqQdkeYLYMXtCfxCyp+uhzp7Yn/0QOKczsCec3C4jXmu5i6cNZIOhMrSau0sQRxEYxjJtuH2wPbtIT7Eklf5eIIgd+55CDGkN9uzCBJ6vf9pujbL1xGsFd6wuG6zS50ieOHf1e0+APRFbe8lNt2fqSFshCWLnM/dJq3hd9kw061rZc03xWvGn1WWDRcGEMrQnd7/vOfwsYU/Dno/T24AKAcSB2RP5oYFo8QLs2eVY4W+elGU5tHq2rHitoJy1ZYMhfcbK0LhGWj2hPaXAsOmJ6w6mbKUpSZ5LIo7Lnhe+61Y/x88QTaLFhQ6pS3F5YOcm93NT8VpJhSvJBhvvAakMjfMKn5rVBALDbvZEuccFnD4PVvblZILsectI1jrPSwfTx98Xx7xyvMvtcnjKyT0Wgux5W4i+Ctf7oSuy5wZyvFddToIge66JeOa+InWCmft+Keko5SQIsidBEATZkyAIguxJEARBkD0JgiDIngRBEGRPgiAIsidBEATZkyAIgiB7EgRBkD0JgiDIngRBEGRPgiAIsidBEARB9iQIgiB7EgRB7JQ9f73+9+f3t5UL95bpBevnTazbwq+/aA3iVtlzCXqVaU6jrX68dWnUlfXb7z/VuQdxG14JLXQzh/H6WpSXPKl9nP35j2RPguy5LHvGI648wzOBvP6uitplOUQ7p9NU3a4gv4rzb6O9MW5N7mMir6917KlHInsSV8iekccw9P7gYfdIOlXDUEhDRk6QY7iYjFxB179exwK3Mn0t/zS8a97izJVjHV1d7PaL7EkQOfYMGWIcMt9+vw6jIGIhOaa0kPOwZ4Ovuzl7VrFFV+Hf9RP3yeh1PuxoNbInQWTYM+7ScMiEQewxVTc+UJqTP9tEXm3s2TZxr6Wf/6KXWU0BLiuflQuul2gNxVdajuxJ3Ah7Kuv/YEyZOwXNNFPPgY3s2bT8WJ17wjDlhDMRbsW2WdgSrSvc0n5kT+Im2DNyekzfUw05l5NWPeZa2LMb+i3kUT3lj41RWnmwdlIQPdytb962l2UnexJXxp7BCAuOqQTDLp5LCkpSQ863axSkUXKSBrCnL7pKne7cMXH7oifL0FPlPdFjh0+82UreCEmrlEYHrjvZk7g29gxcjtdf46p/eOTxd9Tr08OQeshq9jRWz1KGVgcuPnHpiS48sLLoxpzfF109buqLHhY/Mqszd61VSi1vr58TxHWw59YoWmFrPILJ6FtFJ3sSZM/t2LP3qqoHMKNvFZ3sSZA9l2NP3nO/avCeO0H2JAiCIHsSBEEQZE+CIAiyJ0EQxCHYc4Yr5S7c1JZrg7ooQRDH8j1n5zZ4Br4thzl0f7djz2V0+0VGLdLOBEFcI3vOovu7MaHOzJ5ABHpOaWeCIOrYU/ow/cgM7nUCl/DsCCk6yn0OMvrJd6dzBt3fsKSaCLReTUUEWqQpV0KwQZI3QPTTZ5CMCPQRXzEEcXz2TMQ/AnX5iSImIbRAZSQkAHR7PY3uJotm3V/kiyFp50gPY6wdFoHW/TvJ71CeSvGmvRIBJ7InQeyMPePPQ3TjPgky/AiHqK1CD6PXOY+Vwpl5faLJR7bm22FILU0He4Zh6qf1WiE4cSeILdgTfRhSob/AD4zH8ezs2aT7qzliQNpZsKfQkhpCWs6dhz2nQA0fM4Ls2SjtTBBEC3vKsYeDaIpoM7Nnm+6vkiGUdga+pytkBXsOoVq+BCfZs1namSCI+pk79F0Q/ekEIka1wZ6OZb5m3V9UJSjtnEjpW3LRhosnDYOn2GdO/SM+pVa/7knqJIjV2FPM0uV3hoNvEtu+Z0xiya59G3ueZtD9leK9SNoZfp9ZFYEWaWr2PClHMeH6pMcgQATalHYmCGIZ37Nh3ph8xWyD8TrrDsnKd6KWOURPEMTe2RN8dmjdzYp5hHs3Y0+eKiKIW2XPdK54BUywEns2fHSdIIirYE+CIAiyJ0EQBEH2JAiCIHsSBEGQPQmCIMieBEEQZE+CIAiC7EkQBEH2JAiC2Aj/A0eMR7gw7IWCAAAAAElFTkSuQmCC"}}]); \ No newline at end of file diff --git a/assets/js/cb962766.2d69a424.js b/assets/js/cb962766.2d69a424.js new file mode 100644 index 00000000..2f81dea1 --- /dev/null +++ b/assets/js/cb962766.2d69a424.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6691],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>c});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),o=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},s=function(e){var n=o(e.components);return a.createElement(p.Provider,{value:n},e.children)},m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),d=o(t),c=r,k=d["".concat(p,".").concat(c)]||d[c]||m[c]||i;return t?a.createElement(k,l(l({ref:n},s),{},{components:t})):a.createElement(k,l({ref:n},s))}));function c(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,l=new Array(i);l[0]=d;var u={};for(var p in n)hasOwnProperty.call(n,p)&&(u[p]=n[p]);u.originalType=e,u.mdxType="string"==typeof e?e:r,l[1]=u;for(var o=2;o{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>o});var a=t(7462),r=(t(7294),t(3905));const i={sidebar_position:47,title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",sidebar_label:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)"},l=void 0,u={unversionedId:"basic/trait-function",id:"basic/trait-function",title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",description:"Chapter ini merupakan topik lanjutan dari chapter sebelumnya, di sini kita akan bahas beberapa jenis trait yang digunakan di closure.",source:"@site/docs/basic/trait-function.md",sourceDirName:"basic",slug:"/basic/trait-function",permalink:"/basic/trait-function",draft:!1,tags:[],version:"current",sidebarPosition:47,frontMatter:{sidebar_position:47,title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",sidebar_label:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)"},sidebar:"tutorialSidebar",previous:{title:"A.46. Closures",permalink:"/basic/closures"},next:{title:"A.48. Trait \u279c Iterator",permalink:"/basic/trait-iterator"}},p={},o=[{value:"A.47.1. Trait Fn",id:"a471-trait-fn",level:2},{value:"A.47.2. Trait FnMut",id:"a472-trait-fnmut",level:2},{value:"A.47.3. Trait FnOnce",id:"a473-trait-fnonce",level:2},{value:"A.47.4. Relasi antara trait function dengan function",id:"a474-relasi-antara-trait-function-dengan-function",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:o};function m(e){let{components:n,...i}=e;return(0,r.kt)("wrapper",(0,a.Z)({},s,i,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Chapter ini merupakan topik lanjutan dari chapter sebelumnya, di sini kita akan bahas beberapa jenis trait yang digunakan di closure."),(0,r.kt)("p",null,"Rust memiliki 3 buah trait yang otomatis ter-implement pada closure, yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut"),", dan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce"),". Ketiga trait ini juga otomatis ter-implement pada fungsi yang didefinisikan menggunakan keyword ",(0,r.kt)("inlineCode",{parentName:"p"},"fn"),"."),(0,r.kt)("h2",{id:"a471-trait-fn"},"A.47.1. Trait ",(0,r.kt)("inlineCode",{parentName:"h2"},"Fn")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," sudah kita terapkan beberapa kali saat praktik pembuatan closure di chapter sebelumnya. Fn adalah trait (",(0,r.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/ops/trait.Fn.html"},"std::ops::Fn"),"), yang dipakai oleh Rust untuk menandai bahwa suatu closure bisa dipanggil berkali-kali dengan catatan di dalam closure tersebut tidak ada operasi mutable terhadap variabel yang scope-nya berada di luar block closure."),(0,r.kt)("p",null,"Contoh penerapan trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," bisa dilihat pada kode berikut. Trait tersebut secara otomatis ter-implement pada closure ",(0,r.kt)("inlineCode",{parentName:"p"},"pow"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let pow_number = |n: i32| n.pow(2);\n\nprintln!("pow_number(2): {}", pow_number(2));\nprintln!("pow_number(3): {}", pow_number(3));\nprintln!("pow_number(4): {}", pow_number(4));\n')),(0,r.kt)("p",null,"Contoh penerapan trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," lainnya pada fungsi yang memiliki parameter closure:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result = do_something_with_number_v1(13, |d: i32| d * 2);\n println!("result: {result}");\n}\n\nfn do_something_with_number_v1(n: i32, f: F) -> i32\nwhere\n F: Fn(i32) -> i32, // <----- Fn digunakan\n{\n // Statement `f(n)` bisa dipanggil berkali-kali\n return f(n);\n}\n')),(0,r.kt)("h2",{id:"a472-trait-fnmut"},"A.47.2. Trait ",(0,r.kt)("inlineCode",{parentName:"h2"},"FnMut")),(0,r.kt)("p",null,"Trait ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," (",(0,r.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/ops/trait.FnMut.html"},"std::ops::FnMut"),") merupakan trait yang menjadikan suatu closure bisa diakses berkali-kali dan bisa me-mutate atau mengubah data suatu variabel yang berada di luar scope block closure. Trait ini juga otomatis ter-implement pada closure yang di dalamnya ada kode pengaksesan variabel yang berada di luar scope block closure."),(0,r.kt)("p",null,"Contoh penerapannya silakan lihat closure ",(0,r.kt)("inlineCode",{parentName:"p"},"square_x")," berikut. Closure tersebut di-dalamnya mengubah nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," yang dideklarasikan di luar blcok closure, oleh karenanya trait ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," otomatis ter-implement."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let mut x = 5;\n{\n let mut square_x = || x *= x;\n square_x();\n}\nprintln!("result: {}", x);\n')),(0,r.kt)("p",null,"Contoh lain penerapan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," pada fungsi yang memiliki parameter closure:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut number = 1;\n do_something_with_number_v2(14, |x| number += x);\n println!("number: {number}");\n}\n\nfn do_something_with_number_v2(n: i32, mut f: F)\nwhere\n F: FnMut(i32), // <----- FnMut digunakan\n{\n // Statement `f(n)` berisi kode yang mengubah isi variavel `number` (mutable).\n // `f(n)` bisa dipanggil berkali-kali\n f(n);\n}\n')),(0,r.kt)("p",null,"Parameter ke-2 fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something_with_number_v2")," adalah closure yang me-mutate nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),", berarti terjadi mutable borrow karena variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," berada di luar block closure. Karena alasan tersebut maka closure harus dideklarasikan menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," (bukan ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),")."),(0,r.kt)("p",null,"Jika dipaksa deklarasi menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", hasilnya pasti error."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Closure",src:t(2212).Z,width:"673",height:"274"})),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," merupakan supertrait dari ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", artinya closure dengan trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," juga bisa digunakan sebagai argument pemanggilan fungsi di mana parameter fungsi tersebut bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai supertrait dibahas pada chpater ",(0,r.kt)("a",{parentName:"p",href:"#/wip/supertrait"},"Supertrait"))),(0,r.kt)("h2",{id:"a473-trait-fnonce"},"A.47.3. Trait ",(0,r.kt)("inlineCode",{parentName:"h2"},"FnOnce")),(0,r.kt)("p",null,"Trait ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," (",(0,r.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/ops/trait.FnOnce.html"},"std::ops::FnOnce"),") adalah trait yang menjadikan suatu closure hanya boleh di akses sekali saja, dan closure tersebut bisa berisi operasi mutable ataupun tidak."),(0,r.kt)("p",null,"Contoh penerapan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," pada fungsi yang memiliki parameter closure."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut number = 1;\n do_something_with_number_v3(14, |x| number += x);\n println!("number: {number}");\n}\n\nfn do_something_with_number_v3(n: i32, f: F)\nwhere\n F: FnOnce(i32), // <----- FnOnce digunakan\n{\n f(n);\n}\n')),(0,r.kt)("p",null,"Jika closure dengan tipe ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," dipaksa diakses dua kali, pasti muncul error. Contohnya bisa dilihat pada parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," berikut."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Closure",src:t(1385).Z,width:"506",height:"395"})),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai supertrait dibahas pada chpater ",(0,r.kt)("a",{parentName:"p",href:"#/wip/supertrait"},"Supertrait"))),(0,r.kt)("h2",{id:"a474-relasi-antara-trait-function-dengan-function"},"A.47.4. Relasi antara trait function dengan function"),(0,r.kt)("p",null,"Trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut"),", dan juga ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," tidak hanya ter-implement pada closure, tapi juga ter-implement pada fungsi juga (secara otomatis)."),(0,r.kt)("p",null,"Contohnya bisa dilihat pada contoh berikut. Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something_with_number_v1")," dipanggil 3 kali."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Pemanggilan pertama, argument ",(0,r.kt)("inlineCode",{parentName:"li"},"f")," diisi dengan closure ",(0,r.kt)("inlineCode",{parentName:"li"},"|d: i32| d * 2")),(0,r.kt)("li",{parentName:"ul"},"Pemanggilan kedua, argument ",(0,r.kt)("inlineCode",{parentName:"li"},"f")," diisi dengan fungsi ",(0,r.kt)("inlineCode",{parentName:"li"},"double")),(0,r.kt)("li",{parentName:"ul"},"Pemanggilan ketiga, argument ",(0,r.kt)("inlineCode",{parentName:"li"},"f")," diisi dengan fungsi ",(0,r.kt)("inlineCode",{parentName:"li"},"pow_number"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result = do_something_with_number_v1(13, |d: i32| d * 2);\n println!("result: {result}");\n \n let result = do_something_with_number_v1(13, double);\n println!("result: {result}");\n \n let result = do_something_with_number_v1(13, pow_number);\n println!("result: {result}");\n}\n\nfn do_something_with_number_v1(n: i32, f: F) -> i32\nwhere\n F: Fn(i32) -> i32,\n{\n return f(n);\n}\n\nfn double(d: i32) -> i32 {\n d * 2\n}\n\nfn pow_number(d: i32) -> i32 {\n d.pow(2)\n}\n')),(0,r.kt)("p",null,"Dari contoh di atas terbukti bahwa fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"double")," dan juga ",(0,r.kt)("inlineCode",{parentName:"p"},"pow_number")," memenuhi kriteria tipe ",(0,r.kt)("inlineCode",{parentName:"p"},"F")," yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn(i32) -> i32"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Closure",src:t(2795).Z,width:"450",height:"143"})),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/trait_function"},"github.com/novalagung/dasarpemrogramanrust-example/../trait_function")),(0,r.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/basic/closures"},"Closures"))),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch13-01-closures.html"},"https://doc.rust-lang.org/book/ch13-01-closures.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html"},"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.Fn.html"},"https://doc.rust-lang.org/std/ops/trait.Fn.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.FnMut.html"},"https://doc.rust-lang.org/std/ops/trait.FnMut.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.FnOnce.html"},"https://doc.rust-lang.org/std/ops/trait.FnOnce.html"))))}m.isMDXComponent=!0},2212:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/trait-function-1-69d13024d5321866a37aa3bb1f72a1b2.png"},1385:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/trait-function-2-5f9002b90d061f7ad1815a678e71f312.png"},2795:(e,n,t)=>{t.d(n,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAACPCAIAAADmy0wUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTI6Mjk6NDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjA3OjQyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjA3OjQyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFiMDc5ZWUxLWZiODMt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"}}]); \ No newline at end of file diff --git a/assets/js/cb962766.fe11400b.js b/assets/js/cb962766.fe11400b.js deleted file mode 100644 index 90aaa437..00000000 --- a/assets/js/cb962766.fe11400b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6691],{3905:(e,n,t)=>{t.d(n,{Zo:()=>s,kt:()=>c});var a=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);n&&(a=a.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,a)}return t}function l(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var p=a.createContext({}),o=function(e){var n=a.useContext(p),t=n;return e&&(t="function"==typeof e?e(n):l(l({},n),e)),t},s=function(e){var n=o(e.components);return a.createElement(p.Provider,{value:n},e.children)},m={inlineCode:"code",wrapper:function(e){var n=e.children;return a.createElement(a.Fragment,{},n)}},d=a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,i=e.originalType,p=e.parentName,s=u(e,["components","mdxType","originalType","parentName"]),d=o(t),c=r,k=d["".concat(p,".").concat(c)]||d[c]||m[c]||i;return t?a.createElement(k,l(l({ref:n},s),{},{components:t})):a.createElement(k,l({ref:n},s))}));function c(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var i=t.length,l=new Array(i);l[0]=d;var u={};for(var p in n)hasOwnProperty.call(n,p)&&(u[p]=n[p]);u.originalType=e,u.mdxType="string"==typeof e?e:r,l[1]=u;for(var o=2;o{t.r(n),t.d(n,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>u,toc:()=>o});var a=t(7462),r=(t(7294),t(3905));const i={sidebar_position:47,title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",sidebar_label:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)"},l=void 0,u={unversionedId:"basic/trait-function",id:"basic/trait-function",title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",description:"Chapter ini merupakan topik lanjutan dari chapter sebelumnya, di sini kita akan bahas beberapa jenis trait yang digunakan di closure.",source:"@site/docs/basic/trait-function.md",sourceDirName:"basic",slug:"/basic/trait-function",permalink:"/basic/trait-function",draft:!1,tags:[],version:"current",sidebarPosition:47,frontMatter:{sidebar_position:47,title:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)",sidebar_label:"A.47. Trait \u279c Function (Fn, FnMut, FnOnce)"},sidebar:"tutorialSidebar",previous:{title:"A.46. Closures",permalink:"/basic/closures"},next:{title:"A.48. Trait \u279c Iterator",permalink:"/basic/trait-iterator"}},p={},o=[{value:"A.47.1. Trait Fn",id:"a471-trait-fn",level:2},{value:"A.47.2. Trait FnMut",id:"a472-trait-fnmut",level:2},{value:"A.47.3. Trait FnOnce",id:"a473-trait-fnonce",level:2},{value:"A.47.4. Relasi antara trait function dengan function",id:"a474-relasi-antara-trait-function-dengan-function",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:o};function m(e){let{components:n,...i}=e;return(0,r.kt)("wrapper",(0,a.Z)({},s,i,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Chapter ini merupakan topik lanjutan dari chapter sebelumnya, di sini kita akan bahas beberapa jenis trait yang digunakan di closure."),(0,r.kt)("p",null,"Rust memiliki 3 buah trait yang otomatis ter-implement pada closure, yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut"),", dan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce"),". Ketiga trait ini juga otomatis ter-implement pada fungsi yang didefinisikan menggunakan keyword ",(0,r.kt)("inlineCode",{parentName:"p"},"fn"),"."),(0,r.kt)("h2",{id:"a471-trait-fn"},"A.47.1. Trait ",(0,r.kt)("inlineCode",{parentName:"h2"},"Fn")),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," sudah kita terapkan beberapa kali saat praktik pembuatan closure di chapter sebelumnya. Fn adalah trait (",(0,r.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/ops/trait.Fn.html"},"std::ops::Fn"),"), yang dipakai oleh Rust untuk menandai bahwa suatu closure bisa dipanggil berkali-kali dengan catatan di dalam closure tersebut tidak ada operasi mutable terhadap variabel yang scope-nya berada di luar block closure."),(0,r.kt)("p",null,"Contoh penerapan trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," bisa dilihat pada kode berikut. Trait tersebut secara otomatis ter-implement pada closure ",(0,r.kt)("inlineCode",{parentName:"p"},"pow"),"."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let pow_number = |n: i32| n.pow(2);\n\nprintln!("pow_number(2): {}", pow_number(2));\nprintln!("pow_number(3): {}", pow_number(3));\nprintln!("pow_number(4): {}", pow_number(4));\n')),(0,r.kt)("p",null,"Contoh penerapan trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," lainnya pada fungsi yang memiliki parameter closure:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result = do_something_with_number_v1(13, |d: i32| d * 2);\n println!("result: {result}");\n}\n\nfn do_something_with_number_v1(n: i32, f: F) -> i32\nwhere\n F: Fn(i32) -> i32, // <----- Fn digunakan\n{\n // Statement `f(n)` bisa dipanggil berkali-kali\n return f(n);\n}\n')),(0,r.kt)("h2",{id:"a472-trait-fnmut"},"A.47.2. Trait ",(0,r.kt)("inlineCode",{parentName:"h2"},"FnMut")),(0,r.kt)("p",null,"Trait ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," (",(0,r.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/ops/trait.FnMut.html"},"std::ops::FnMut"),") merupakan trait yang menjadikan suatu closure bisa diakses berkali-kali dan bisa me-mutate atau mengubah data suatu variabel yang berada di luar scope block closure. Trait ini juga otomatis ter-implement pada closure yang di dalamnya ada kode pengaksesan variabel yang berada di luar scope block closure."),(0,r.kt)("p",null,"Contoh penerapannya silakan lihat closure ",(0,r.kt)("inlineCode",{parentName:"p"},"square_x")," berikut. Closure tersebut di-dalamnya mengubah nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"x")," yang dideklarasikan di luar blcok closure, oleh karenanya trait ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," otomatis ter-implement."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'let mut x = 5;\n{\n let mut square_x = || x *= x;\n square_x();\n}\nprintln!("result: {}", x);\n')),(0,r.kt)("p",null,"Contoh lain penerapan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," pada fungsi yang memiliki parameter closure:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut number = 1;\n do_something_with_number_v2(14, |x| number += x);\n println!("number: {number}");\n}\n\nfn do_something_with_number_v2(n: i32, mut f: F)\nwhere\n F: FnMut(i32), // <----- FnMut digunakan\n{\n // Statement `f(n)` berisi kode yang mengubah isi variavel `number` (mutable).\n // `f(n)` bisa dipanggil berkali-kali\n f(n);\n}\n')),(0,r.kt)("p",null,"Parameter ke-2 fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something_with_number_v2")," adalah closure yang me-mutate nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"number"),", berarti terjadi mutable borrow karena variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"number")," berada di luar block closure. Karena alasan tersebut maka closure harus dideklarasikan menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," (bukan ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),")."),(0,r.kt)("p",null,"Jika dipaksa deklarasi menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", hasilnya pasti error."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Closure",src:t(2212).Z,width:"673",height:"274"})),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"FnMut")," merupakan supertrait dari ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", artinya closure dengan trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn")," juga bisa digunakan sebagai argument pemanggilan fungsi dimana parameter fungsi tersebut bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai supertrait dibahas pada chpater ",(0,r.kt)("a",{parentName:"p",href:"#/wip/supertrait"},"Supertrait"))),(0,r.kt)("h2",{id:"a473-trait-fnonce"},"A.47.3. Trait ",(0,r.kt)("inlineCode",{parentName:"h2"},"FnOnce")),(0,r.kt)("p",null,"Trait ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," (",(0,r.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/ops/trait.FnOnce.html"},"std::ops::FnOnce"),") adalah trait yang menjadikan suatu closure hanya boleh di akses sekali saja, dan closure tersebut bisa berisi operasi mutable ataupun tidak."),(0,r.kt)("p",null,"Contoh penerapan ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," pada fungsi yang memiliki parameter closure."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut number = 1;\n do_something_with_number_v3(14, |x| number += x);\n println!("number: {number}");\n}\n\nfn do_something_with_number_v3(n: i32, f: F)\nwhere\n F: FnOnce(i32), // <----- FnOnce digunakan\n{\n f(n);\n}\n')),(0,r.kt)("p",null,"Jika closure dengan tipe ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," dipaksa diakses dua kali, pasti muncul error. Contohnya bisa dilihat pada parameter ",(0,r.kt)("inlineCode",{parentName:"p"},"f")," berikut."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Closure",src:t(1385).Z,width:"506",height:"395"})),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai supertrait dibahas pada chpater ",(0,r.kt)("a",{parentName:"p",href:"#/wip/supertrait"},"Supertrait"))),(0,r.kt)("h2",{id:"a474-relasi-antara-trait-function-dengan-function"},"A.47.4. Relasi antara trait function dengan function"),(0,r.kt)("p",null,"Trait ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"FnMut"),", dan juga ",(0,r.kt)("inlineCode",{parentName:"p"},"FnOnce")," tidak hanya ter-implement pada closure, tapi juga ter-implement pada fungsi juga (secara otomatis)."),(0,r.kt)("p",null,"Contohnya bisa dilihat pada contoh berikut. Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_something_with_number_v1")," dipanggil 3 kali."),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Pemanggilan pertama, argument ",(0,r.kt)("inlineCode",{parentName:"li"},"f")," diisi dengan closure ",(0,r.kt)("inlineCode",{parentName:"li"},"|d: i32| d * 2")),(0,r.kt)("li",{parentName:"ul"},"Pemanggilan kedua, argument ",(0,r.kt)("inlineCode",{parentName:"li"},"f")," diisi dengan fungsi ",(0,r.kt)("inlineCode",{parentName:"li"},"double")),(0,r.kt)("li",{parentName:"ul"},"Pemanggilan ketiga, argument ",(0,r.kt)("inlineCode",{parentName:"li"},"f")," diisi dengan fungsi ",(0,r.kt)("inlineCode",{parentName:"li"},"pow_number"))),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result = do_something_with_number_v1(13, |d: i32| d * 2);\n println!("result: {result}");\n \n let result = do_something_with_number_v1(13, double);\n println!("result: {result}");\n \n let result = do_something_with_number_v1(13, pow_number);\n println!("result: {result}");\n}\n\nfn do_something_with_number_v1(n: i32, f: F) -> i32\nwhere\n F: Fn(i32) -> i32,\n{\n return f(n);\n}\n\nfn double(d: i32) -> i32 {\n d * 2\n}\n\nfn pow_number(d: i32) -> i32 {\n d.pow(2)\n}\n')),(0,r.kt)("p",null,"Dari contoh di atas terbukti bahwa fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"double")," dan juga ",(0,r.kt)("inlineCode",{parentName:"p"},"pow_number")," memenuhi kriteria tipe ",(0,r.kt)("inlineCode",{parentName:"p"},"F")," yaitu ",(0,r.kt)("inlineCode",{parentName:"p"},"Fn(i32) -> i32"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Closure",src:t(2795).Z,width:"450",height:"143"})),(0,r.kt)("hr",null),(0,r.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,r.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,r.kt)("pre",null,(0,r.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/trait_function"},"github.com/novalagung/dasarpemrogramanrust-example/../trait_function")),(0,r.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/basic/function"},"Function")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/basic/closures"},"Closures"))),(0,r.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch13-01-closures.html"},"https://doc.rust-lang.org/book/ch13-01-closures.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html"},"https://doc.rust-lang.org/beta/rust-by-example/fn/closures.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.Fn.html"},"https://doc.rust-lang.org/std/ops/trait.Fn.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.FnMut.html"},"https://doc.rust-lang.org/std/ops/trait.FnMut.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/ops/trait.FnOnce.html"},"https://doc.rust-lang.org/std/ops/trait.FnOnce.html"))))}m.isMDXComponent=!0},2212:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/trait-function-1-69d13024d5321866a37aa3bb1f72a1b2.png"},1385:(e,n,t)=>{t.d(n,{Z:()=>a});const a=t.p+"assets/images/trait-function-2-5f9002b90d061f7ad1815a678e71f312.png"},2795:(e,n,t)=>{t.d(n,{Z:()=>a});const a="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAACPCAIAAADmy0wUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTI6Mjk6NDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjA3OjQyKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjA3OjQyKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFiMDc5ZWUxLWZiODMt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"}}]); \ No newline at end of file diff --git a/assets/js/d8837387.31f2a62c.js b/assets/js/d8837387.31f2a62c.js new file mode 100644 index 00000000..674fa912 --- /dev/null +++ b/assets/js/d8837387.31f2a62c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4622],{3905:(a,t,A)=>{A.d(t,{Zo:()=>g,kt:()=>b});var e=A(7294);function i(a,t,A){return t in a?Object.defineProperty(a,t,{value:A,enumerable:!0,configurable:!0,writable:!0}):a[t]=A,a}function n(a,t){var A=Object.keys(a);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(a);t&&(e=e.filter((function(t){return Object.getOwnPropertyDescriptor(a,t).enumerable}))),A.push.apply(A,e)}return A}function l(a){for(var t=1;t=0||(i[A]=a[A]);return i}(a,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);for(e=0;e=0||Object.prototype.propertyIsEnumerable.call(a,A)&&(i[A]=a[A])}return i}var p=e.createContext({}),d=function(a){var t=e.useContext(p),A=t;return a&&(A="function"==typeof a?a(t):l(l({},t),a)),A},g=function(a){var t=d(a.components);return e.createElement(p.Provider,{value:t},a.children)},m={inlineCode:"code",wrapper:function(a){var t=a.children;return e.createElement(e.Fragment,{},t)}},k=e.forwardRef((function(a,t){var A=a.components,i=a.mdxType,n=a.originalType,p=a.parentName,g=r(a,["components","mdxType","originalType","parentName"]),k=d(A),b=i,c=k["".concat(p,".").concat(b)]||k[b]||m[b]||n;return A?e.createElement(c,l(l({ref:t},g),{},{components:A})):e.createElement(c,l({ref:t},g))}));function b(a,t){var A=arguments,i=t&&t.mdxType;if("string"==typeof a||i){var n=A.length,l=new Array(n);l[0]=k;var r={};for(var p in t)hasOwnProperty.call(t,p)&&(r[p]=t[p]);r.originalType=a,r.mdxType="string"==typeof a?a:i,l[1]=r;for(var d=2;d{A.r(t),A.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var e=A(7462),i=(A(7294),A(3905));const n={sidebar_position:6,title:"A.6. Tipe Data \u279c String Literal (&str)",sidebar_label:"A.6. Tipe Data \u279c String Literal (&str)"},l=void 0,r={unversionedId:"basic/tipe-data-string-literal",id:"basic/tipe-data-string-literal",title:"A.6. Tipe Data \u279c String Literal (&str)",description:"String adalah tipe data penting dalam pemrograman manapun. Biasanya tiap bahasa punya cara berbeda dalam meng-handle tipe ini. Di bahasa Rust, ada dua jenis tipe data string:",source:"@site/docs/basic/tipe-data-string-literal.md",sourceDirName:"basic",slug:"/basic/tipe-data-string-literal",permalink:"/basic/tipe-data-string-literal",draft:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6,title:"A.6. Tipe Data \u279c String Literal (&str)",sidebar_label:"A.6. Tipe Data \u279c String Literal (&str)"},sidebar:"tutorialSidebar",previous:{title:"A.5. Tipe Data \u279c Primitive Scalar",permalink:"/basic/tipe-data-primitive-scalar"},next:{title:"A.7. Konstanta",permalink:"/basic/konstanta"}},p={},d=[{value:"A.6.1. String literal atau &str",id:"a61-string-literal-atau-str",level:2},{value:"A.6.2. Escape karakter menggunakan ",id:"a62-escape-karakter-menggunakan-",level:2},{value:"A.6.3. Multiline string literal",id:"a63-multiline-string-literal",level:2},{value:"A.6.4. Raw string",id:"a64-raw-string",level:2},{value:"A.6.5. Pembahasan lanjutan tentang string",id:"a65-pembahasan-lanjutan-tentang-string",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],g={toc:d};function m(a){let{components:t,...n}=a;return(0,i.kt)("wrapper",(0,e.Z)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"String adalah tipe data penting dalam pemrograman manapun. Biasanya tiap bahasa punya cara berbeda dalam meng-handle tipe ini. Di bahasa Rust, ada dua jenis tipe data string:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Tipe string literal (kadang disebut dengan string slice, atau ",(0,i.kt)("inlineCode",{parentName:"li"},"&str"),"). Tipe data ini ada pada nilai yang dideklarasikan dengan diapit tanda petik dua (string literal), contohnya ",(0,i.kt)("inlineCode",{parentName:"li"},'"Hello, world!"'),"."),(0,i.kt)("li",{parentName:"ul"},"Tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," yang merupakan tipe data custom atau ",(0,i.kt)("em",{parentName:"li"},"custom types")," yang merupakan sebuah struct. Lebih jelasnya akan kita bahas pada chapter terpisah.")),(0,i.kt)("p",null,"Chapter ini hanya fokus pada string literal, dengan level pembahasan yang tidak terlalu advance."),(0,i.kt)("h2",{id:"a61-string-literal-atau-str"},"A.6.1. String literal atau ",(0,i.kt)("inlineCode",{parentName:"h2"},"&str")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Kita tidak akan bahas terlalu low-level untuk topik ini, karena memang masih di chapter awal-awal.")),(0,i.kt)("p",null,"Rust adalah bahasa yang ",(0,i.kt)("em",{parentName:"p"},"statically typed"),", tipe data harus diketahui saat kompilasi. Setiap pendefinisian variabel, entah itu dengan di-specify tipe datanya (contoh: ",(0,i.kt)("inlineCode",{parentName:"p"},"let x: i32 = 5"),") atau menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"type inference")," (contoh: ",(0,i.kt)("inlineCode",{parentName:"p"},"let x = 5"),"), tipe datanya akan diketahui di awal saat kompilasi program."),(0,i.kt)("p",null,"Begitu juga pada tipe string. Sebagai contoh, statement ",(0,i.kt)("inlineCode",{parentName:"p"},'let y = "hello"'),", variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," di sini memiliki tipe data, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Apa itu tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"? Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"str")," merupakan salah satu tipe primitif yang ada di Rust. Penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," menandakan bahwa tipe tersebut adalah ",(0,i.kt)("strong",{parentName:"p"},"pointer ",(0,i.kt)("inlineCode",{parentName:"strong"},"str")),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Untuk pembahasan lebih detail mengenai tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," pada tipe data akan dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Untuk kawan-kawan yang menggunakan VSCode dengan ekstensi ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer"),", tipe data variabel bisa terlihat saat definisi."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(7031).Z,width:"299",height:"146"})),(0,i.kt)("p",null,"Ok, sampai sini yang paling penting adalah dipahami dulu bahwa string literal tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),". Jadi selanjutnya kalau melihat tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," jangan bingung, itu berarti string."),(0,i.kt)("h2",{id:"a62-escape-karakter-menggunakan-"},"A.6.2. Escape karakter menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"\\")),(0,i.kt)("p",null,"Tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"\\")," digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"escape")," beberapa karakter string."),(0,i.kt)("p",null,"Silakan perhatikan contoh berikut. Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"var2")," isinya adalah string yang di dalamnya ada beberapa karakter yang di escape, yaitu tanda ",(0,i.kt)("inlineCode",{parentName:"p"},'"')," dan baris baru atau newline."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var2 = "hello \\\n \\"rust\\" \\\n and \\\n \\"world\\"";\nprintln!("{}", var2);\n')),(0,i.kt)("p",null,"Coba jalankan kode di atas."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(6028).Z,width:"445",height:"115"})),(0,i.kt)("p",null,"Karena semua baris baru pada contoh di atas di-escape, jadinya string akan tetap 1 baris. Tanda ",(0,i.kt)("inlineCode",{parentName:"p"},'"')," juga tetap muncul karena di-escape."),(0,i.kt)("h2",{id:"a63-multiline-string-literal"},"A.6.3. Multiline string literal"),(0,i.kt)("p",null,"Penulisan string banyak baris atau ",(0,i.kt)("em",{parentName:"p"},"multiline string")," adalah sama seperti penulisan string biasa, yaitu langsung tulis saja string dengan diapit tanda ",(0,i.kt)("inlineCode",{parentName:"p"},'"'),", tambahkan baris baru di dalam string tersebut sesuai kebutuhan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var3 = "baris satu\nbaris dua\nbaris tiga";\nprintln!("{}", var3);\n')),(0,i.kt)("p",null,"Hasilnya adalah sesuai dengan string yang sudah didefinisikan."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(1664).Z,width:"452",height:"129"})),(0,i.kt)("p",null,"Perlu diketahui bahwa karakter spasi, baris baru, dan lainnya adalah ",(0,i.kt)("strong",{parentName:"p"},"tidak dihiraukan"),", jadi jika kawan-kawan menuliskan string multiline seperti ini ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var4 = "baris satu\n baris dua\n baris tiga";\nprintln!("{}", var4);\n')),(0,i.kt)("p",null,"... maka hasilnya juga sesuai dengan yang ditulis, yaitu ada 4 karakter spasi di baris ke-2 dan ke-3."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(8353).Z,width:"449",height:"130"})),(0,i.kt)("h2",{id:"a64-raw-string"},"A.6.4. Raw string"),(0,i.kt)("p",null,"Raw string adalah istilah untuk string yang tidak meng-",(0,i.kt)("em",{parentName:"p"},"escape")," karakter apapun. Di Rust, string literal bisa didefinisikan dengan menuliskan string diapit ",(0,i.kt)("inlineCode",{parentName:"p"},'r#"')," dan ",(0,i.kt)("inlineCode",{parentName:"p"},'"#'),". Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var5 = r#"\n {\n "name": "tim drake",\n "gender": "male"\n }\n"#;\nprintln!("{}", var5);\n')),(0,i.kt)("p",null,"Kode di atas hasilnya adalah ekuivalen dengan kode di bawah ini, yang mana string didefinisikan dengan meng-escape karakter ",(0,i.kt)("inlineCode",{parentName:"p"},'"')," menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"\\"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var6 = "\n {\n \\"name\\": \\"cassandra cain\\",\n \\"gender\\": \\"female\\"\n }\n";\nprintln!("{}", var6);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"raw string literal",src:A(8532).Z,width:"430",height:"260"})),(0,i.kt)("h2",{id:"a65-pembahasan-lanjutan-tentang-string"},"A.6.5. Pembahasan lanjutan tentang string"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"String adalah salah satu topik yang sangat luas cakupan pembahasannya"),", tidak cukup jika dirangkum dalam 1 chapter. Selain itu, bisa bikin makin bingung jika dibahas sekarang."),(0,i.kt)("p",null,"Penulis anjurkan untuk mempelajari chapter-chapter berikutnya secara urut terlebih dahulu."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tipe_data_string_literal"},"github.com/novalagung/dasarpemrogramanrust-example/../tipe_data_string_literal")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pointer-references"},"Pointer & References")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/tokens.html#raw-string-literals"},"https://doc.rust-lang.org/reference/tokens.html#raw-string-literals")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/str/index.html"},"https://doc.rust-lang.org/std/str/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/strings.html"},"https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/strings.html"))))}m.isMDXComponent=!0},7031:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAACSCAIAAACSdHvqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjlUMTk6MDM6MjUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjMxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjMxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmY4ZjdiOTRlLWFjMzQtNmM0Zi1iMTU0LTBjZmJkZGYwMzRkMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0M2EwYjVjNC02M2E4LWU2NDUtODI3ZC0zYTg1NDk0OGVkNGQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0M2EwYjVjNC02M2E4LWU2NDUtODI3ZC0zYTg1NDk0OGVkNGQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQzYTBiNWM0LTYzYTgtZTY0NS04MjdkLTNhODU0OTQ4ZWQ0ZCIgc3RFdnQ6d2hlbj0iMjAyMi0wNy0yOVQxOTowMzoyNSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpmOGY3Yjk0ZS1hYzM0LTZjNGYtYjE1NC0wY2ZiZGRmMDM0ZDAiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MjQ6MzErMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5ijIn7AAAQw0lEQVR42u2dX2wU1R7HCyj/kcofRbCbElo0UFPTpiBKgpC4YpHbNmBjkUtLe7spLJV7q6S7dQstm7b+ITbkxiC20PT2NvyJicFGAy/wIEQJoeEBgdS+3Tef5M0nueecmTlzZmdmd3a7szt/vp/Mw+zs7OzO7vns73fOnHOmIAAAyB8F+AoAgIEAwEAAAAwEAAYCAGAgADAQAAADAYCBeWHd2uJisuBnAjAwx5SUbNjVXHMoFuqMhTqiBw61Ve+qKi7B7wVgYAbs/OjfX3XvXW919+LKHdtbe9qPx5ta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"},6028:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAABzCAIAAACD2UtjAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6Mjk6NDQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjA2OjA0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjA2OjA0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY3OTNiMDZkLTA2ZjQtM2Q0ZS04MDUyLTAzYjAxM2ZmYzBjMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo2NzkzYjA2ZC0wNmY0LTNkNGUtODA1Mi0wM2IwMTNmZmMwYzIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2NzkzYjA2ZC0wNmY0LTNkNGUtODA1Mi0wM2IwMTNmZmMwYzIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjY3OTNiMDZkLTA2ZjQtM2Q0ZS04MDUyLTAzYjAxM2ZmYzBjMiIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xMFQxNToyOTo0NCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqAm8sUAABJsSURBVHja7V27ctw4ENSXSHbm+GLbqTLLiQMHcqZy6roqVV2mD9En+Cuc+6Nul1ySAKZnMEMSXO6qu67qvBSIxwBoDl6Nm1uCIAgighuagCAIgrxJEARB3iQIgiBvEgRBkDcJgiDImwRBEAR5kyAIgrxJEARB3iQIgiBvEgRBkDcJgiDImwRBEAR5kyAI4ky8+fD0/Ovx4/FfHx9/PT89rJ6NQwINYl2WoVOJ5yBgpXkJLcveBhY7/HquZtFdioWt7vi6TKia+g6NTOyk4m6Cra4RbypNGxgkwZSP7LmavfztSmqHDM3oajP6OUzoFIeay/VaBjbdjPhn8CYse15LfRxNeFO1PHlz5yy5g4q7Cba5VrzpK+2xTw2pd7xy/OGjXPS2+RYqaQveVAJ3beNBayArtQzVdIt5c37ZUTxteLMWLXlzr97l+SvuJpjrPsejTzBmvveOCkcueQhDFkWv946U+U6//LRZvJ3/7EpU7cG4QmTZHVYqcgI+qccQ+Zc1fX18Q6R+nPN4PDmrD5bTCk2XpTHlNKub5AfI0vQos2fiR6ZpirLr/UTaE8YpH6bl7P86xKBYvm5kT/NOkjz8c/xDF7SvWLOF9M+U2kRxOgwy/EF53d+WYJsHJVLKXm1LQ5sDTXEXFXcTJPts9Dgyz8fHp3QgP/UfQYMJWcleWyVOxJv2gNbgzSx9xJvePi3LrllJKx40cxc0+Uua/fExSH0oSvJ/izih6fQMlbnTKCgvbGrrcaCAk9J4U9gTxmk/PL5q16jXyEptwpAnLhnbwK9HrYWA3qHUphanNPIUZ2J4+frHSFuqtfl62WVb0nqH0nzPXHE3wWFU/qRgImkI4MJZflbNwS6Mk0+7Vmcty9zW3fmy/LU3hvDYSsggOKHk55CkiFJm5BRk+Fv5fyPPdS8QtXUzS9kfwRcr59RiGFB6GMCeME788NTmH5+edaMprdsIb9Qm+LrkCwQwJdg7tNoEceKyl5NTEyOYaxb+tgTbvL/sVXtqzfe8FXcT8dD0Jl+41GLYIL17uDpTczizPqWOmLUYLH/TR5xqhVij2oIFceb1VjB+4nHLkKkHeROabn3e1H1RR6MH9oRx4of2VzWN229krTZRyHqJphmnsncYvFnGaZR98jcnD9eecKq0pVqbR+OleluHvUNtvmetuMX+5uk7aX+9hgAOXnT7m8GVDvF29bMDsoRbqyx7lQnkgFGv7L7/4ChR6vN4U8wCNvQ3RTWm77pYpicUESd+OJSs7tH4jYxrE4f0lkib2PLzJjJy6muYRva2JU+bn8ebMCdG8z1jxc2Z3xRufzEtg8fu03dKJavg/KbmNXn8zXI+E85vevo0LDu0Uo3ex8gBA/0S81S65WfyZmY6kb/cV3meuqTIkupQpVNvhq9U62lwstJ+qIxPQepuI+PaxCFrJRozpcxsOXkTll3pUtrrnrbkaPN16hFtSe0dFU/oTBXnWE/PUoOLVtkq4GPy/UGbKnEMc9bT9fmw+Chf5004zC72FpplB0t7OK3iGy9qN1mrHNfZQep+3rRMJxZ2k8Huw2gRkCXhLUvb6WWv2/hZ7BI1NvOCFUi4FIaq2DayUpsopLHSJUskngd4ExsE2bM64VRpS5pBfLwJ25LRO/QdOOeruOj+zY03au13C9kbM8G1l33r1Bvug64tOF5XCztTxUXPC7XMDjcZE28FW/HmrDl9Yg3e3ILUd3c+nSCugTf1s8lEe94kCIIgBpA3CYIgyJsEQRDkTYIgCPLmEvxz99+39/9+Hn/f/fvt/X/9f/d2yGbwyU3OjXrfGw1WLrsip9TWyI7ULwqzGg21unfDmz++DIz27e7rqrxZUmTPnveekA0a5Dl5s0V7isTZpOzaqbigEEx7DtCJ13eI12O6UJxINo9a3dLsy7S6W/JmR5ojXd79aOv3Id68Bu9v97zZzO9z9MK98WayXRIf6SyCPjq2LQfiLFmTWt01+8yNvxlvfvr87uDr/fxH8RanYfXdz0Ow++7hl7sf98PzY7B3Pz4Pgb/cfbKH5CVvopA4zjxLqmusqaiikZ1bldbjYugirLqwK5RrrSZkicVCpdtI2eF5P2/Hkgm5yp7LO9Vlev0cAAVE8i5pHuV4eCpOzvu6eT180fup1e2gzRla3c148+uRAd/9+KBPOJ7+feTNI4V9ODLd4U8d4Y5c1lPY6U+ma+l4mMbZ/buj9SnyLmmRZ9dHSSqduVRpHb3SFmGFWdJC+p0E2H2k0m2t7LmghlDPjTok8iHOpzCyV6Y34DtlDASUBdIkZzg/sISOOC0531tqdd+updXdjDe7QXrJQR2ZTt7cMcyXI292tHXgr2P4lDcHd3Xg1jV48xTnyOC9E/ohcUjX4U2PKu1HB2fYIqzV8YVNAX6xWEOTy/g1/MDquQ14ExvZK9MbGXPmDoi8vMLuvUHe9MYpMk6tbnOQNVure1t/M5/x9PPmKWQT3uzC9A8LWl+RNxVV2hhv6iKslYFHVZvPIRbr5nnIm1g9d33eVIzslekNzdWlot3SrfXF4uLNQJxI2ZRa3TZ9ztLq3nZ+s1gp6r1Ir795v844HfLmOLkJJmRX8jf98+ZBEVbkc824uLkiFruMN7F6bhveDMhNalbyGU3MxxWs5Oi80flNjyNl8Ca1ug3r7oM3T2SXsuRnML/58586bwoKXpM3u8j9e6R8V8q6VWlrXoNHhFVkqSrXWi+ZLOYi3oyvTzt5E+or66LpxkRo3N+c1n/zNRBIosqsGmhOZUg9zuj8JrW6zWmqkFZ32/2bPXVmi9c9CSbOncWbpRtYLnyPE5TZw2E5HoeU/ubPPGTF5SyWa6FMr1uVtjp4roiw4mV6PaQ53DLFYqviu9V7Znyr6XV7qjLY+tXEXpleKyG9nhS7gQkE9ToboQGuzD7UyQAsoFOrG/WsZVrduz0vlM9vtgNcqvq0MNLtVMIuA1evnrszW69gXGp1m3jzvAmnXMmbq/cNqudeGnMS5E3nZMIqpHkbOe2CsD6lbJaQMwdPe8jSlX+oyJxvkjcJgiDImwRBEORNgiAI8iZBEARxMbzp1xj2hJy3rBTQOV5x5n1aIjnPXL5fQHMdqc3Nhe9W2d4QKburRqdAl7EYVq+20K20W6hQXw9vZocaswPsfo1hT8gL482zbpUjb67/dVmoRLmzFhJRFfBmdElbcusxooAR8YZ98eZ9+3TIm+dM6Bp5M9Sp/aldBG8G+HCDrLqFnBMlzySgJjZ/ebzp1xhWdIvTU5V9yJ43Pw/hCy2l8eSlfN3mzdphsukkliYW62lqmqRQTQ84axhZyIDosiIBq0gUw82X0B1wnzENdFRfdWBJXU2NB5wrjMgzw+qWdeTlzZA0tSLPDM+4GmdzPTdIKGrEt24VKL89zabhZvTsqLv2bfD7oDvyNz0awzCSQtXYeD15cXwIpJQ9A7BUkUAI5SJR2xV4U+oBp81mPIaDFWRvnWJOpgSsWpZkaktVDvYJhvq7g7s6oEEsVdrMnJgQQHUYsuGijpb6m1B0GcozwxJpEtqwalDqFdED7zVINbnrii184tAe3owOSc48v5kKEXk031TeLDWNVOmjcUb1pE2XnU83eVNVtQJihUDUdg3eBALjQsbHUPTy8qYukaDrtGX+amEQjwBtmDfd1YHlUOP6yh65vPpoo7TgCuP0jPRzhTWlRKqEtqbeUuTQPikbECPy2BPGHhGHLiyTfd6yIVKAOPftb/p4M9NYysbp+etf799L5aTsfHqcNzU1Yilq24g3Rc/WlLfb8WbWCwNCir5hqRbWXR2wh87QV57Pm9YVHHN5E61uqJpVRYl0Ce2K4B6aepjtu83nzRni0DhM9hejRFfKmyP6a4fH0bfpb6avLONNtUrEJVON/U3kSTX3N4vNJw7hzIb+pnpPory2JKyvvI6/WbLQPN7EosvaKPsZXqHmdRXtHJpqxC14MygObV/iqV03Xc3/dfHmpHBsSLvfK68MAh/q/CZUUVU/ZkLUNsabQjBVHVem4w9xLYvoYFXR5RBvesdw0HQL5zf91QEldZGRA/N2bt7EdRTjTac0tX5HpNcDg3av7lWYUaL5vBkRh67cfIzN4Jpb3wNv+jWGHbrFuZi8oF0kh9x7qbn4vDlGyFRU9ZViQxfWPQqbBFMd67+6cC8Y3WkyvYg3g3LCKAPYdMvW073VoRgEqdJWVHrrl8TW1tMrN8I51tV1aeqqv6kpCmNpbbVEphpxvUBBe5oxmOLQQnNrGGcoYtGBLZ08Z3l+rL3ljeqfK1luCyHLxpW1Ton2tX9zDyBvkjcJPPm4ib5y48paq0TrnxcibxLL2/aa59PJm2vURfOD4xudT1+tRCufTydvEgRBvCWQNwmCIMibBEEQ5E2CIAjy5jYI6MJ5MG1C3w2qk/VNBdaCOwEaStXufvvLymVHkkLNjexIvYXV9rjYtAPezE6Xr0lzES3kWJOR25rPJo9Y20TeVphSSX2xQPLG348NyLpJ2bVjgvJUZgurb7RvY5PtYBfLm/3RnV56Y5Nr0y/R2YkfH24t6Itj2N772z1vNqOUeQfSLog3OU6v82Yhi4nOWQoxY7/CMQ4pj2/mknS+Act+ZWUbCvrK1AMCyapUrfsWhGoxFfUfo44cCVk60LCKI2VXjOxjLpmQq+y5hqlon6qVfLwpEsoPjSeHkf31Tt5E/mYnWWSdT8/ViP0Kx7qYcT85AAWTZvkdW8rKysfbCvqCTLmElxR9Za3seOgrigkt76+jkGMl44RVXCs7Unf2DU4d4lN6PqG2tMi8YSUPb+LaHKVOiisvfPVO3pTzm7kPCHnT9VDnTezDfkgc0hV4E7bjNrKylot4ewZB3xhvCnk3tex2XDBgIQw1gxntGTbMR1LfrfbLY+RVeRMb2ci86t5WeFOtze7dx7x+fPVO3hT+phAu2oI3uzCJt+sfpFu1vJ2srGjCmwv6yg40kzcPqetl9/Kmcl2hs47MZZ0yO5A3ffmNG3lF3lSMjDOvW2mG8lGpRqVdMrn7K4J3Nk6fVIS35c1CWW4pb24pKwuJY1NBX5mx+f6mf61Bdauxz+SsI0dVW2P/ZbxZMfKqvOlyn20r+XjTaMkP08fh0taYdsabyPdM5IQb8GaX4gwfs2we55OVFa1+a0FfvDpUFUjG+sr+XSewmNjy/joKVbUs5iLejHOHkzfhlR/wvhPrkgxhJU20WnUqZaxTzna52+hiePPEdN0s53gd0CQnHHRCXVrIAy8vcjnPKisrm/FGgr6Vua+awrGjjLbbhYoJLe+vo/poU9xG6ZqK8cn0ulfTQzLSt9pWiiIhdY64tJKeEFDzFwnlct7JdtPQTdHkzfOimNM8ThRMl603x7pCue1m0z35DKdOvbuWjYEgbzZEdi9b73tuyJtnEMrdTz7Jm5fZGAjyphinb0iaYJy+337SIJ/+0y4I65tqs4S8Rt5DlgjyJkEQBHmTIAiCvEkQBEHeJAiCIG8SBEGQNwmCIAjyJkEQBHmTIAiCvEkQBEHeJAiCIG8SBEEQPt78/vrn7+8XVyzHoD2SF+DDAF5+//375/V7H8+8KHaR0CH6Y+wbpl61/JSlzYxMEORN/wvhWBrTGWCxq+PNquXJmwRxpbw5vlkhnsUs1iYhL282S93Fm43LThBvkzePDkk+5JtGgUW39PHmGOHfGR21791jDrqIsxSSH0k+u0fp77kTCEkcE/Ec/mVaKVhQwWApt5UxIoNolp+fJYIgArw59K/jv/t/HftuQkxp93PwZvrKnKHhiTlGvvzzqvGm5m0t8au+v/4eXh0LUrVSOEXId5rppEG+K/EsyRJBEHPG6cOPQ4/L+6LeUcHDtO/OGsMP03HT6xZvosjXoowhIZR6Xq5wioONhxeP/9dMJw3yYtYfeZMgNudNOdaN8mbVQY2NYS1+GIe16SuLKKMofiPe7If+h/eOOH2rNNMZkZM3CWI/vKkyXdjfLH6uzZvQSV1AGdC3a8CbvcP58rubN/390tGoZjryJkHsf5xuTUo65jdT6imnR5fwZrKrRmYvS2hOqpLme8dT480kZDr9GeLN124u9fD6wecUI/JsItXFm0uzRBDEfN68RcuyYvQOl69PryeLwvH9SZgmxqT+vL6k/I4TUvcDRIbpB17T/c20lCd/8Xs4nWmpKV08L3OufUiA5RdliSAIF28SBEEQ5E2CIAjyJkEQBHmTIAiCvEkQBEHeJAiCIG8SBEEQ5E2CIAjyJkEQBHmTIAiCvEkQBEHeJAiCIMibBEEQ5E2CIAjyJkEQBHmTIAji4vE/suSRC2XSqAIAAAAASUVORK5CYII="},1664:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcQAAACBCAIAAADR310jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6MzI6MjgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjEyOjQ5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjEyOjQ5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJiZmNmNTRiLTlmMjct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"},8353:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAACCCAIAAACxYuTJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6MzQ6NTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjEzOjQ0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjEzOjQ0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcwNWQ4NmUxLWEyMWYt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"},8532:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa4AAAEECAIAAAD/EEdFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHQmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6NDM6NTMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk3YWI4YTMyLTVmMGMtOWM0NC1hNDhkLTYzYTRjODVlMGIwMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxYjljOTRkZC1lOGZkLTUzNDYtYWE2OS1mNjcxNzI1YjBjNjkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxYjljOTRkZC1lOGZkLTUzNDYtYWE2OS1mNjcxNzI1YjBjNjkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjFiOWM5NGRkLWU4ZmQtNTM0Ni1hYTY5LWY2NzE3MjViMGM2OTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFiOWM5NGRkLWU4ZmQtNTM0Ni1hYTY5LWY2NzE3MjViMGM2OSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xMFQxNTo0Mzo1MyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphNjgzYWY4My01M2E3LWRhNDgtOTAyYS1jYTYxZDcyNTgzOGIiIHN0RXZ0OndoZW49IjIwMjItMTAtMTBUMTY6MTE6NTArMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTdhYjhhMzItNWYwYy05YzQ0LWE0OGQtNjNhNGM4NWUwYjAyIiBzdEV2dDp3aGVuPSIyMDIyLTEyLTA1VDE4OjI0OjA4KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+PI5AOQAAFaJJREFUeNrtnb1ynEgURv0ko3XmeGOvU2XWJhsokDOVU9dWqWozPYgeQU+h3A+1AwzQP/d23wYamOGc2iprRww0DRzd5ufj0wkA4PB8ogsAAFAhAAAqBABAhQAAqBAAABUCAKBCAABUCACACgEAUCEAACoEANidCv+8+++fz/9+G/7/7t9/Pv/X/XefnrIaD88vLy+/nr7WmXWdGe903b8+/XrpeH5YrZMNS78qJu008/a0pueMfTZtQbs6EMpV+ON7L6l/7v5eVIWh9Toh3lumrLCPbanCGrtIyTyrrLt0YAkLqnR4FBzWuksNczB2XdE8u8n7mbZLGMgs6vzFeAprF5f0mbigYUWVxS23rb1OGdpcNP9PEzw4GPDuR93qTFLhLdRou1dhterMcGDtTYXNQXb5YvNjqm3tpE+OtRaYZyhC78udaJJfV/4ALa5CZeLWkA+KJpfa1l+1Lq+mwr++/XGuyH7+qdR043j27ud5svv2w+93P+77z5vJ/vjxrZ/4+91f6bFwqEJpSnmefpPUAtb50+z9QZGGVN1fveGPz/AL+593b2n9FnI+bD/SmhRPaVtQ82Vtnt2OMvy2W07Juvv1iaVZThfFCzKtez+x2PhEL+UPa1cx/f8GR9nXlOYenoctmO6JgnlKB7TUTm+LBKsZ+0A2RNx1XZ8l9/mgJeFsL73ul4ymA6GZW/tnpfn/h1RpKfagsi95e4HzP82PJSr8u5HaHz++6CfvLj83Kmys9KWR1/lXrUMHPXVWuvwqWQAaPnTn2f7cmnqcebvoqM2mPx3+weMV+sPu5+yHmV3a3WOHJX59eu6/4X09bpI2pf1PuXhEePYP9lZ53ccJxzVqf58tH8SGxR/K7Yw6WWx8opcMFY4nlcv0bmvcRU4oUcQ1NMwz7JBAheGO85IvAqU9Xuo6eZ/XezKa7zCp8xvrgdCvivNvyoWiKfUGha07/1CiwnZ0HGql9eNYczXTfG9U2JrorKRmeleFfVHZ63IJFV7mOUi5KxW/OGXjMioc/6/9TveX68FSjgvf/pqYJF3Yp49qzUuyYn65e6C2tuIOFI7TsiORqSqUOznReLUIzdnaLxP6xYzFZ/qALFShdZ5RwwMVGptU8o1++mivHQcZclfqfd4v0n4gOBva+zc3FAoK6LwK+89mV4X+2UO7Ci9TVlFhO033YWDqBVV4GT29mMaI2h4QzCGhQmXK9Dnk5G5hV7eoQueIMJlwqgqVTs4O8oJeMp33GiYaRnRB1WaYi0mFBfMMzZesCm1drxooNZwMxCbv79oAdFim/UAoVKG3FupxtJQKxXOFwYWUrtazVoX3ywyQRRUOJwqFk5sLVYX208ryHqBWNlJllK6B1KMoMeiep0LvTKHl5PQMFZqK3HQv2TotOrcViMZwPJaeK7SUOwkV2k5O+AsRlih2XbaEE675qHZr95KCA2GaCqOL7XVUePGXK75vwrnCn3/mVRhZdUkVtjO33+ij7bu6DoYtZ9wP4xNr4x7gXRhQB5zqlPY1i1dzlgrLr8gaVRi1U+5kTYVaLxnb21/x9C8RiF5UzlAJu1M4pT7P0nOF4blB8VyhdIJSklrUdW6fie2UPhxmHiylnbbgQJioQm9vEfcl59zni3uqp/i+ws6G3uXazmtOCZZSYVishZd6h5N93of9BWh5yrgq/OlPmSkMgwuU0Z+z6MPc5bDkqPX5YSg63AU/CVcqpIva4ZTJcY43WThP+ez5L+t1N/P143x/Rhes9SvIL/KBFn/zyR3Im88tSDYZ5yCM3EM1Sj0iSFOZp/XSttbrugrF8a1864LcdcKlXnlZwgWn+HpI/kCwqzBYneQ+755TfBh6pJ3Dmk+b+OcK6yFeyflr5kxn3KJ7kwjjz30/QXPlfb1A5652Z+nun6YSuUUViqcvUeHiu3v5GSvYVoZwMBWGA+T5HjyVPCshsbwlVluQsQXPe2jSjf/tQYa3okIAAFQIAIAKAQBQIQDAQVVoj1m1TDntqktB1OuCJ6bHKwjbnOq2Bw4uE024eqrYIhf0S9bdtEXHia7jWlF+s/kPgK+yL12xCr2n3LyHlO0xq5Ypr0yFm97ChQqX/4MxM7lvZ3tIyZPj1obO2ZcmZNm+iGm2k/eKpVR4X3+bosItF3SLKiw6Tu1LuwoVFihuhaZOyLJ9ftaeN5rY2FoqtMesKtGt7mN23ZSdCr/10wepNsOjePHX0yrMPV00Ppqj5WVa9h4t3CUXiTo+qRpOWZA7q6RgKimt4k2B4h9t80OHBTupbXPIqaJaLorwoFlJQq24ueNtZFVhUTqvklArPvSYeFjTEnWvBLKezHk89v5M7hrZHeUygWxo91N9jdavCi0xq+JMgmDXxNedLw4fCmmylpGP+yB5lBUq5XouoMI4EtXdE4aHOOQQzZMxVieZgqmui3OaSA1PtQUs2lVo3hxih6SCOb3ulI9xYXMkwpCjbTS3KhRzZ8WEWnGNtBRhcdNIS8882G4dtuYSfzN9kc2ydXshuWKlA4flzxW6kTCWQC1VhWG6jBpCM5ydvAR/ec8gJ1WoRgYJ4W5CrucSKhRik6NAlURcklWF+pPtegiWV1UGHWLJ4CxWoXlzyPGR5RGzliyy/Jgg7MEFBsiex/34KmWN1BRhLXQjaGH60cmCWBhLf4pzt2XZjr+L9mLptQMFLly9KrSp0Eu78QbI/tf/vv8cZ9h4zyCXq1ALZI1zPSupMDpYtTzheir0DqyC4DnbeFCb1rw5xINuQsTsdBWm3hUwVYVS7qyaHhSskZ4inEkzk8b86Yj1Kio0ZtlmosZO0vsNrPdx7FWFA927Rodhb7IqdL8yT4XilhDfWVO5KpTqnepVYXAHhSFosGJVqL5JLX6/QnHE7DJVYSiWaSqUc2e1UeCL+EYma0GXbmEykLWGCs1ZtuJT7kJ5K71jNtv+3atwDHlNBFbfK1/pcxnUc4VikKRaWUe5nmUqjDIj1QGde7ojeiVEdMxkc2eLVGgdPIldN/NcoX1ziKmiUicXnAMzq1DeRmUqNKbz6m+RO51sA1yx37NX5yes0XQVlufj6usgFrym89SVVGiPWTVEt/oR2ZFJpUTY4b31TqR2sjj3giT1a6OJaEzz8GfMjDRc8dSzS4VhlZZUKqmwMFFVaoDcdfOuIFs3h9IhUjBnJqg0/2bI3BXkzAumDFeS9XTebFWoharK6cLqGiUDWfMrVNifyTkk83HFY8xbuvwqWcP24MG7Kix9KxZpiQv13BrBf5U31jJrtK/7CvcAKkSFt74l1o6Yrbyxllqj5Z82QYWQOL+7zG6ECpfYFtUfDl7pGeTF1mjhZ5BRIQAAKgQAQIUAAKgQAAAVrk5B6JaF8X7n3ZA9l101varw2nfFtM7d38Ox8LpL4S7VO9mw9Bq9tsdrMXVU6D1BvKS5SuJgy/aC+A7azeLkcvcr1w3yU5Y+OyN25T8JK/i3yrprz43Fj+nV6PWV7lTY5Wuza6qwe/CjS0xY5fXH11iSlD8iWjvTVJ7D+jXa7lVYzRLTHme6IhUeaIDsqjCIEZQevIvyXO0hr/KU8fN8ft6XbaSw32TNipmm8dILMmLVtE57XHtuNZUclsQ2MiwoFYUrbuKSdVc62SajeEGmdfczH6P9U+0lmwqjBbnPEHtPpxbG9B+hKmzDY1LPIPuBrPaQVz3PtRuVi9E1k6qDNZM144/XzTQVGmWKwFEiZrV1l8ec0WqKPW/fRkXlTzxPcRPn1l0KuLWNCg0xQHo7xXjdqPGJXrKoUN6aQ0JFkM1v2+4HOVfoV2qiCk0f6iqUK80vTtm4gArFXbNOsmaqkDttkGlapsIoO0td9/S8Hp4zwXnGbVR0tkpWTByelfs/SycvqkK5kxONV4vQjArVrdl+98nfPrbtfoyqMIqQWUOF7TROTWofHWeuZqyUrBntlatnmsbHxEQVnpeur7tVhVLP27dR8qpH2BxRhbb2lnfygipUOlmPN5V7aUIGTZgLJJ0U2fRFuPsZII9BquuqMIjtmqvCNZM1RResmmkaN2x6VWg/Fa8Wv3JlY9xGhk2dGnTPU2GmkxdVoanITfeSTYWJPflh9P21XYKpr0KpQnQSVSuosF3ihEow3OLbJWtGO/LamabyxZNsRqwcMWu/dUJcTbnn7duoaFPHqzlLheU6MKpQfDeB+GKGVJp/1Etabq9a+sVzHVu2y1tmtlThRV7tGcPhVSRjomphqWiKg+1VO6sw3DRZM94zV8o0NV3M1ENeDeuYLo6k1RR73r6N8sO86H11pnMgtqRS8/XjoiTdk3bzQLAg9Xxr2Ev6goTw1GhBfqKxcxtk0ethb1KF2xKcH2xG6ONLk6uzbFZovZPNlnYWL50wsZo7A6DCMrzXPHUV4ooq3CArdD/tRIXXuTPArcYx+APkFT0oDJD3u+tXaKf9WYmX/LvLFl/FLbZJ0Ml7aBIcSIUAAKgQAAAVAgCgQgAAVAgAgAoBAFAhAAAqBABAhQAAqBAAABUCAKBCAABUCACACgEAUCEAACoEAECFAACoEAAAFQIAoEIAAFQIALAjFT6+ffw+8/H2SK8CwEFV2IgQCwLAwVX4+o4JAQAVokIAQIWoEABQYXOq8P2V7gSAo6rwXA9y3RgAqAqpCgEAFfa1IZUhAKBCVAgAqBAVAgAq5GQhAKDCE88gAwAqBABAhQAAqBAAABUCAKDCKjSP8zVXYNqLMTUvTc9cUNnXl3lIsfzGpZI0ydV6HgAV3rwKFVuhQgBUeCo9eNvjsPa92zMXpHy9aqvrqnC1ngdAhVOldT4028KqYShYLjc0jjc1nid5f2s//Hh7vfz7GEyZL3faBZVXRc4yvGWNnw/zVNuZn/Gwoucfhl/0M446xFNh14HdtEUdAoAKd1Mo9gf3eGw/vr33/ug/7CXm/Nt/fDngLVXSRBWmCzfvoRylnWpr+i8O013+LAyqbT8VOmT8oR/9hvPk1TSACq9KhV4pGHnq8mGvCvffrgZ7nTHIrKLCqJ1ym/y19VT44Xov7JH+s850b++/g0H8eh0CgAorqzAYkWoqjAeuN6FC4Qtxh4wfOZOv2yEAqLCqCqXCSFXheufDtlOhWClexr/eRWECNABuTIXO+S69Kiy+OWTWuULt3NtEFTqr6Z4x1VQYdojTHMeUhR3ymL2wA4AKtxsguxdB3/SqcLjYYh4OzlJhdHE2Go6m2qk2p/tidyldqz2FDvHMHF59MnfIaFYAVAjH5fWdqhBQIRzdgngQUCEAACoEAECFAACoEAAAFQIAoMKNqJyaN+WJ21VDXkOEYJuNug4AFaLCzVQ4ChEVAhxIhZUDRKfMtU7I6/IqJHsV4HZUqBc8UZRKnD9qCHn9HTyI5k2oRKImWzWh/LJEzPoui1RI9irA8VQYZBJ0P0r5o3LIq5p+GsWXipGoVVQoRbdK2auyCsleBTigCl2VubHMYf6oHNwg51zJ8aXZSNRlR+mJOIZg4dFKkL0KcDgVOqVgUP/5g+YCFSrxpStZRVOhkL0qqZDsVYDjDpCF9xfFJVuRCoWKb0MVpkvS/DsNAODGVahbT32lh/c/YvqpfMNJoQpnnCtUVBhlr4p9wN0yAIevCuVLwI7ghOJJSj9NvFRzExX6o3Yve/W3MGouyl4FgNurCrlkCgBHVKF7AZnBIQAwQOaWYgA4rgoBAFAhAAAqBABAhQAAu1bh5d427mwBAKpC0gAAABWGOSkAAKgQAAAVAgAcVIVkRgEAKuxtyBNxAHDwATKXkAEAFVIPAgAqRIUAgApRIQCgQk4VAsChVdi/X4OaEAAYIAMAoEIAAFQIAIAKAQBQIQAAKgQAQIUAAKgQAAAVAgCgQgAAVAgAgAoBAFAhAAAqBABAhQAAqBAAABUCAKBCAABUCACACgEAUCEAACoEAECFAACoEAAAFQIAoEIAAFQIAIAKAQBQIQAAKgQAQIUAAKgQAAAVAgCgQgAAVAgAgAoBAFAhAAAqBABAhTYe3z5+n/l4e6RXAeCgKmxEiAUB4OAqfH3HhACAClEhAKBCVAgAqLA5Vfj+SncCwFFVeK4HuW4MAFSFVIUAgAr72pDKEABQISoEAFSICgEAFXKyEABQ4YlnkAEAFQIAoEIAAFQIAIAKAQBQYRWax/maKzDtxZial6ZnLmi1dk5duS0uY9mexdx31wEqRIWoEBUCKtwJw32KtY/mmQtarZ3XpMJb6DpAhbvlfOicj5i24mgY6ojLDY3jTY3nSd7f2g8/3l4v/z4GU+arkHZBk4uVoZljeRS1M/hQXKPEalo6xOmS8w/DL/pJxSbNWqPxo7HrtHYCoMKpVUR/zI2vUnl8e+8P4v7DXmLOv/3Hl8PQ8iaWGSrsh35+66N2Ks/oKB/GX5c7xFnNsd66eKj93Pm+0KSZayStgtxOAFQ4c0B1ykikF4D7b1crvq4xdMwf7UPjxdNk2XNn/delDvH7xVPhhysuaaHqMgvWSFNhesMBoMLZKvSGg79VFQaTVXxE0C3LoqI2GvgO40a3OcKHwtfLVCisrtKkmWuECgEVrq9CqdxRVbjOISguKVuWSUPQ8UPx6zNVmG3S9DVChYAKN1ChcwJQrwqL79mYfq5QWpLUzvwgdPhQ/HqmQ9xTdJoKk02avkazVOi2GwAVGgfI7lXhN70qHM7Zm8fHs64gu0uKlt23Mxhhel4JR53a1wXFOJdqu2u32gBZmueia5RSdnZRlI6ACuHYiCcLAFAhHMqCeBBQIQAAKgQAQIUAAKgQAAAVAgCgQp/KYXZTHkGul2w4hr4scOlUyobZppMBUCEqtH9decJ3vhBRIcDVq7ByrueUuVYKea3zUK5proSnAuxdhXoZE2XLxIGsBZmmYp6rEnSabNWskNfgy1GTLGG0vssiFRbF1gKgwp2L0EkaGJ+4DQNZCzNNozxXMeh0cRXGsWFDiRY2SQmjNYenlsbWAqDCazChH9kSBrKWpFfJea72+KqFV6uvAMM1UgMm1DIwWt11YmsBUGF1nFIwqP/8QXOBCpU811VdEahQXCNNhcbw1PViawFQ4TrSiN90JJRsRSoUKr6tVSjFpMqvKLCFpxKXCnA7KtStl35RRzLTVL6NpFCFy142UWJSFRXaw1ORIcANVoXyJWBHcMZM08SrMjdSodQkZYBsDk89FcbWAqDCa6kKuRAKAEdUoV89MeQDAAbI3CgMAEdVIQAAKgQAQIUAAKgQAGDXKrzcscadLQBAVcgz/gCACsP0EwAAVAgAgAoBAA6qQpKgAAAV9jbkiTgAOPgAmUvIAIAKqQcBABWiQgBAhagQAFAhpwoB4NAq7N+aQU0IAAyQAQBQIQAAKgQAQIUAAKgQAAAVAgCgQgAAVAgAgAoBAFAhAAAqBABAhQAAqBAAABUCANwG/wPCySSNXW5ZPQAAAABJRU5ErkJggg=="}}]); \ No newline at end of file diff --git a/assets/js/d8837387.e6bc9bd5.js b/assets/js/d8837387.e6bc9bd5.js deleted file mode 100644 index a30bbcfa..00000000 --- a/assets/js/d8837387.e6bc9bd5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4622],{3905:(a,t,A)=>{A.d(t,{Zo:()=>g,kt:()=>b});var e=A(7294);function i(a,t,A){return t in a?Object.defineProperty(a,t,{value:A,enumerable:!0,configurable:!0,writable:!0}):a[t]=A,a}function n(a,t){var A=Object.keys(a);if(Object.getOwnPropertySymbols){var e=Object.getOwnPropertySymbols(a);t&&(e=e.filter((function(t){return Object.getOwnPropertyDescriptor(a,t).enumerable}))),A.push.apply(A,e)}return A}function l(a){for(var t=1;t=0||(i[A]=a[A]);return i}(a,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);for(e=0;e=0||Object.prototype.propertyIsEnumerable.call(a,A)&&(i[A]=a[A])}return i}var p=e.createContext({}),d=function(a){var t=e.useContext(p),A=t;return a&&(A="function"==typeof a?a(t):l(l({},t),a)),A},g=function(a){var t=d(a.components);return e.createElement(p.Provider,{value:t},a.children)},m={inlineCode:"code",wrapper:function(a){var t=a.children;return e.createElement(e.Fragment,{},t)}},k=e.forwardRef((function(a,t){var A=a.components,i=a.mdxType,n=a.originalType,p=a.parentName,g=r(a,["components","mdxType","originalType","parentName"]),k=d(A),b=i,c=k["".concat(p,".").concat(b)]||k[b]||m[b]||n;return A?e.createElement(c,l(l({ref:t},g),{},{components:A})):e.createElement(c,l({ref:t},g))}));function b(a,t){var A=arguments,i=t&&t.mdxType;if("string"==typeof a||i){var n=A.length,l=new Array(n);l[0]=k;var r={};for(var p in t)hasOwnProperty.call(t,p)&&(r[p]=t[p]);r.originalType=a,r.mdxType="string"==typeof a?a:i,l[1]=r;for(var d=2;d{A.r(t),A.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>n,metadata:()=>r,toc:()=>d});var e=A(7462),i=(A(7294),A(3905));const n={sidebar_position:6,title:"A.6. Tipe Data \u279c String Literal (&str)",sidebar_label:"A.6. Tipe Data \u279c String Literal (&str)"},l=void 0,r={unversionedId:"basic/tipe-data-string-literal",id:"basic/tipe-data-string-literal",title:"A.6. Tipe Data \u279c String Literal (&str)",description:"String adalah tipe data penting dalam pemrograman manapun. Biasanya tiap bahasa punya cara berbeda dalam meng-handle tipe ini. Di bahasa Rust, ada dua jenis tipe data string:",source:"@site/docs/basic/tipe-data-string-literal.md",sourceDirName:"basic",slug:"/basic/tipe-data-string-literal",permalink:"/basic/tipe-data-string-literal",draft:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{sidebar_position:6,title:"A.6. Tipe Data \u279c String Literal (&str)",sidebar_label:"A.6. Tipe Data \u279c String Literal (&str)"},sidebar:"tutorialSidebar",previous:{title:"A.5. Tipe Data \u279c Primitive Scalar",permalink:"/basic/tipe-data-primitive-scalar"},next:{title:"A.7. Konstanta",permalink:"/basic/konstanta"}},p={},d=[{value:"A.6.1. String literal atau &str",id:"a61-string-literal-atau-str",level:2},{value:"A.6.2. Escape karakter menggunakan ",id:"a62-escape-karakter-menggunakan-",level:2},{value:"A.6.3. Multiline string literal",id:"a63-multiline-string-literal",level:2},{value:"A.6.4. Raw string",id:"a64-raw-string",level:2},{value:"A.6.5. Pembahasan lanjutan tentang string",id:"a65-pembahasan-lanjutan-tentang-string",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],g={toc:d};function m(a){let{components:t,...n}=a;return(0,i.kt)("wrapper",(0,e.Z)({},g,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"String adalah tipe data penting dalam pemrograman manapun. Biasanya tiap bahasa punya cara berbeda dalam meng-handle tipe ini. Di bahasa Rust, ada dua jenis tipe data string:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Tipe string literal (kadang disebut dengan string slice, atau ",(0,i.kt)("inlineCode",{parentName:"li"},"&str"),"). Tipe data ini ada pada nilai yang dideklarasikan dengan diapit tanda petik dua (string literal), contohnya ",(0,i.kt)("inlineCode",{parentName:"li"},'"Hello, world!"'),"."),(0,i.kt)("li",{parentName:"ul"},"Tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," yang merupakan tipe data custom atau ",(0,i.kt)("em",{parentName:"li"},"custom types")," yang merupakan sebuah struct. Lebih jelasnya akan kita bahas pada chapter terpisah.")),(0,i.kt)("p",null,"Chapter ini hanya fokus pada string literal, dengan level pembahasan yang tidak terlalu advance."),(0,i.kt)("h2",{id:"a61-string-literal-atau-str"},"A.6.1. String literal atau ",(0,i.kt)("inlineCode",{parentName:"h2"},"&str")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Kita tidak akan bahas terlalu low-level untuk topik ini, karena memang masih di chapter awal-awal.")),(0,i.kt)("p",null,"Rust adalah bahasa yang ",(0,i.kt)("em",{parentName:"p"},"statically typed"),", tipe data harus diketahui saat kompilasi. Setiap pendefinisian variabel, entah itu dengan di-specify tipe datanya (contoh: ",(0,i.kt)("inlineCode",{parentName:"p"},"let x: i32 = 5"),") atau menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"type inference")," (contoh: ",(0,i.kt)("inlineCode",{parentName:"p"},"let x = 5"),"), tipe datanya akan diketahui di awal saat kompilasi program."),(0,i.kt)("p",null,"Begitu juga pada tipe string. Sebagai contoh, statement ",(0,i.kt)("inlineCode",{parentName:"p"},'let y = "hello"'),", variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"y")," di sini memiliki tipe data, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"."),(0,i.kt)("p",null,"Apa itu tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),"? Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"str")," merupakan salah satu tipe primitif yang ada di Rust. Penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," menandakan bahwa tipe tersebut adalah ",(0,i.kt)("strong",{parentName:"p"},"pointer ",(0,i.kt)("inlineCode",{parentName:"strong"},"str")),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Untuk pembahasan lebih detail mengenai tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"&")," pada tipe data akan dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Untuk kawan-kawan yang menggunakan VSCode dengan ekstensi ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer"),", tipe data variabel bisa terlihat saat definisi."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(7031).Z,width:"299",height:"146"})),(0,i.kt)("p",null,"Ok, sampai sini yang paling penting adalah dipahami dulu bahwa string literal tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"&str"),". Jadi selanjutnya kalau melihat tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," jangan bingung, itu berarti string."),(0,i.kt)("h2",{id:"a62-escape-karakter-menggunakan-"},"A.6.2. Escape karakter menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"\\")),(0,i.kt)("p",null,"Tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"\\")," digunakan untuk ",(0,i.kt)("em",{parentName:"p"},"escape")," beberapa karakter string."),(0,i.kt)("p",null,"Silakan perhatikan contoh berikut. Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"var2")," isinya adalah string yang di dalamnya ada beberapa karakter yang di escape, yaitu tanda ",(0,i.kt)("inlineCode",{parentName:"p"},'"')," dan baris baru atau newline."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var2 = "hello \\\n \\"rust\\" \\\n and \\\n \\"world\\"";\nprintln!("{}", var2);\n')),(0,i.kt)("p",null,"Coba jalankan kode di atas."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(6028).Z,width:"445",height:"115"})),(0,i.kt)("p",null,"Karena semua baris baru pada contoh di atas di-escape, jadinya string akan tetap 1 baris. Tanda ",(0,i.kt)("inlineCode",{parentName:"p"},'"')," juga tetap muncul karena di-escape."),(0,i.kt)("h2",{id:"a63-multiline-string-literal"},"A.6.3. Multiline string literal"),(0,i.kt)("p",null,"Penulisan string banyak baris atau ",(0,i.kt)("em",{parentName:"p"},"multiline string")," adalah sama seperti penulisan string biasa, yaitu langsung tulis saja string dengan diapit tanda ",(0,i.kt)("inlineCode",{parentName:"p"},'"'),", tambahkan baris baru di dalam string tersebut sesuai kebutuhan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var3 = "baris satu\nbaris dua\nbaris tiga";\nprintln!("{}", var3);\n')),(0,i.kt)("p",null,"Hasilnya adalah sesuai dengan string yang sudah didefinisikan."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(1664).Z,width:"452",height:"129"})),(0,i.kt)("p",null,"Perlu diketahui bahwa karakter spasi, baris baru, dan lainnya adalah ",(0,i.kt)("strong",{parentName:"p"},"tidak dihiraukan"),", jadi jika kawan-kawan menuliskan string multiline seperti ini ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var4 = "baris satu\n baris dua\n baris tiga";\nprintln!("{}", var4);\n')),(0,i.kt)("p",null,"... maka hasilnya juga sesuai dengan yang ditulis, yaitu ada 4 karakter spasi di baris ke-2 dan ke-3."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"rust string literal",src:A(8353).Z,width:"449",height:"130"})),(0,i.kt)("h2",{id:"a64-raw-string"},"A.6.4. Raw string"),(0,i.kt)("p",null,"Raw string adalah istilah untuk string yang tidak meng-",(0,i.kt)("em",{parentName:"p"},"escape")," karakter apapun. Di Rust, string literal bisa didefinisikan dengan menuliskan string diapit ",(0,i.kt)("inlineCode",{parentName:"p"},'r#"')," dan ",(0,i.kt)("inlineCode",{parentName:"p"},'"#'),". Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var5 = r#"\n {\n "name": "tim drake",\n "gender": "male"\n }\n"#;\nprintln!("{}", var5);\n')),(0,i.kt)("p",null,"Kode di atas hasilnya adalah ekuivalen dengan kode dibawah ini, yang dimana string didefinisikan dengan meng-escape karakter ",(0,i.kt)("inlineCode",{parentName:"p"},'"')," menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"\\"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let var6 = "\n {\n \\"name\\": \\"cassandra cain\\",\n \\"gender\\": \\"female\\"\n }\n";\nprintln!("{}", var6);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"raw string literal",src:A(8532).Z,width:"430",height:"260"})),(0,i.kt)("h2",{id:"a65-pembahasan-lanjutan-tentang-string"},"A.6.5. Pembahasan lanjutan tentang string"),(0,i.kt)("p",null,(0,i.kt)("strong",{parentName:"p"},"String adalah salah satu topik yang sangat luas cakupan pembahasannya"),", tidak cukup jika dirangkum dalam 1 chapter. Selain itu, bisa bikin makin bingung jika dibahas sekarang."),(0,i.kt)("p",null,"Penulis anjurkan untuk mempelajari chapter-chapter berikutnya secara urut terlebih dahulu."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/tipe_data_string_literal"},"github.com/novalagung/dasarpemrogramanrust-example/../tipe_data_string_literal")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pointer-references"},"Pointer & References")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/string-slice-vs-string-literal"},"String Literal (&str) vs. String Custom Type")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/tipe-data-custom-type-string-slice"},"Tipe Data \u279c String Custom Type"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/tokens.html#raw-string-literals"},"https://doc.rust-lang.org/reference/tokens.html#raw-string-literals")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/str/index.html"},"https://doc.rust-lang.org/std/str/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/strings.html"},"https://web.mit.edu/rust-lang_v1.25/arch/amd64_ubuntu1404/share/doc/rust/html/book/first-edition/strings.html"))))}m.isMDXComponent=!0},7031:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASsAAACSCAIAAACSdHvqAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAF5WlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjlUMTk6MDM6MjUrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjMxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjMxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmY4ZjdiOTRlLWFjMzQtNmM0Zi1iMTU0LTBjZmJkZGYwMzRkMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0M2EwYjVjNC02M2E4LWU2NDUtODI3ZC0zYTg1NDk0OGVkNGQiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0M2EwYjVjNC02M2E4LWU2NDUtODI3ZC0zYTg1NDk0OGVkNGQiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjQzYTBiNWM0LTYzYTgtZTY0NS04MjdkLTNhODU0OTQ4ZWQ0ZCIgc3RFdnQ6d2hlbj0iMjAyMi0wNy0yOVQxOTowMzoyNSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpmOGY3Yjk0ZS1hYzM0LTZjNGYtYjE1NC0wY2ZiZGRmMDM0ZDAiIHN0RXZ0OndoZW49IjIwMjItMTItMDVUMTg6MjQ6MzErMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5ijIn7AAAQw0lEQVR42u2dX2wU1R7HCyj/kcofRbCbElo0UFPTpiBKgpC4YpHbNmBjkUtLe7spLJV7q6S7dQstm7b+ITbkxiC20PT2NvyJicFGAy/wIEQJoeEBgdS+3Tef5M0nueecmTlzZmdmd3a7szt/vp/Mw+zs7OzO7vns73fOnHOmIAAAyB8F+AoAgIEAwEAAAAwEAAYCAGAgADAQAAADAYCBeWHd2uJisuBnAjAwx5SUbNjVXHMoFuqMhTqiBw61Ve+qKi7B7wVgYAbs/OjfX3XvXW919+LKHdtbe9qPx5ta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"},6028:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAABzCAIAAACD2UtjAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6Mjk6NDQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjA2OjA0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjA2OjA0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjY3OTNiMDZkLTA2ZjQt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"},1664:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcQAAACBCAIAAADR310jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6MzI6MjgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjEyOjQ5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjEyOjQ5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmJiZmNmNTRiLTlmMjct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"},8353:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAACCCAIAAACxYuTJAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6MzQ6NTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEwVDE2OjEzOjQ0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEwVDE2OjEzOjQ0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcwNWQ4NmUxLWEyMWYtNmY0OC05NWFlLWI4NjI4MTE1YjUyNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MDVkODZlMS1hMjFmLTZmNDgtOTVhZS1iODYyODExNWI1MjciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo3MDVkODZlMS1hMjFmLTZmNDgtOTVhZS1iODYyODExNWI1MjciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjcwNWQ4NmUxLWEyMWYtNmY0OC05NWFlLWI4NjI4MTE1YjUyNyIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xMFQxNTozNDo1MCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqxyrDUAAA/uSURBVHja7Z09ctw4EEb3JJKdOXYsO1VmOXHgQMpUTl1bparNfBAdwadQrkOthhyS+OkGGhyAxIzeq61aawYEQAD8pgESH/+5AgCAtfxDEwAAoKEAAGgoAAAaCgCAhgIAABoKAICGAgCgoQAAaCgAAKChAADvU0M/X//34+O/X+e/r//98fG/8b/bdMpm3D0+PT39vr9pk3WbjDs995v7308jj3ebNbKh9LNi1aA5baQdWs7YZusK6vBCeKtSew19+Dap24/r71U1NJTLUUlvLSkbDM49NbTF2CrJs8m5S1ekUFCj66pAD3QRNuRgbLqiPMfkU6ZDCTOZot4OjFNYm7ikzcSC5hNViqvX116jzHVekX97DR0EdJbO64e28aCkoZcQFXavoc3iQcMV2ZuGHq7O44GHf6bqNiS9d+SuQp6hgnoHjwqVPFz55aquoUriQVrvFH2t1dc3WpP3p6Ffvn54iwF/fVaiyGXqff3rLdnt8OG364fb6fNDsg8PX6fE366/pKftoYZKKeU8/SqpIbMTDHg/YdLsb/ydnX/u5i/sAYVX2tS1zofDR1qV4pS2gg4Ha3mOI2z+diyn5Nz9iMhSLaeJ4oJM5z4lFiufaKW8HrjaNP0ZXJ43KX28e5x7MN0SBXlKSiDV0+uR4DRjIZGlJW66sc2SYz6oSZjtsdX9INV0IRxyG36PDn/fpYJZsQWVseSNAucPL3lLDf1+UMMPD5/0Bcrjvw8aepCzTwfVe/tqEN9Z10Y5O36VDDkNH7p5Dv8eJH7JfCg6qrPpx8q/6rw5yTxunQGcuRbcoT6XeHP/OB3hHR5XSUtpDx7ES8n72QiGuXzuS8LljIbvswGLWLH4Q7meUSOLlU+0kiGm8tTomN6tjVvkiqBIPENDnmGDBBoaDpynfNgpjXip6eQxr7dklO+c1PnGeiFMp+L8PyWiosTqFQpr51appYYOE/lQjwZhXaK8Q5pvBw0dJOxNyw7pXQ2dwthJZ2to6DHPWc3H4PSTE6jW0dDlr+GY8bfyzjJzEI6+SSRJz0HScqAJmqxNv92hq52tOPLCKWV20rRWQ+VGTlReDXtzMu8HJlMxS7ibvpILNdSaZ1TxQEONVSo5YkofjdplWiM3pd7mU5H2C8HpaO//uclXELLnNTSq0uZxqL9CatfQY8omGjqkGT8MJL6ihh4nek+m6aw2dIIcEhqqpEwvsCfHk13zRQ11LiWThK7VUKWRs/PRoJVMa3tzonnyGcSJhlxMGlqQZyiZyTjU1vSqdKVmvoEiyuNdmyvPZdovhEIN9c5CvY5211BxPTS4yzRGl9Y49LbOXF7U0HkxVFjArRSH2tfc5aGjxlJSLJaOutTLL7E+cJqGequhlpX7EzTUFFanW8nWaNH6XaBQhgu5dD3UEmAlNNS2juIXIpQoNl02aBRuiKmyOIySggthnYZGjzB0pqFH4XMV86uwHvrrc15DIzmuqaFD5vbnrrRBr+vI3OXGARwvHi5Dx1vUVufGakr7mcWneZKGlt/nNmpoVE+5kTUN1VrJWN/pPrJ//0QUVGUVThhOYUo9z9L10HD9U1wPlRZhJTWMms5tM7Ge0odz5kEpQ9qCC2GlhnqjRRxLzvruU7AqNRbe/PnQUUa9m+CjIDpBX0pDw/AwvIE+L2h6H0639eWUcRz6y0+ZCUWD277RD2j0Ye4mY3KC/Xg3hzluwffCbRzpUYEwZXJK5iUL85RvLfy23s0035XPt2f0GIB+X/5JvkLjI+/dNQfzMogkQ0sOwiJDqKlSiwhqq+RpfWBAa3VdQ8WpuPxAiNx0wg10uSzhblx8syh/Idg1NDid5Jh3103v5hbxq9TzPiV/PbTxum24RPvlxExPeEb7IhGmyn3vvTrztq7QuJs9Idz9Prw0aKiyRIuGVr9OylflYF8VBTR0xYJDFQG9KtllI1FfXjYryFiDxx6qdOE/Wqjou9dQAAA0FAAADQUAADQUAOBiNdTul2xJue6WVIFnc8VV++X2yj73AewGoHWsQjc366vymETJuZt6dEl0HjfS8t3mmxVsMpbeo4Z6Gyu9DfV2v2RLyjPT0F0fxUND6//SnOik2dkIKXE5sFb0lLFk9ZB0H/6INgnXUfC9NPS2fTlo6J4FXaKGFl3g9tLOQkMLtHGDqhaaUkdnYHa/PicNtfslKx7M7s7OMeWooV+n9IHn07z7Mz48raG5DW3LbjDN+NYy7DTro5y38bKrOkxZYCCt2Nkqdsviw51imGDe51pw0dq6Q7YH1lyDhL2NJVbTYnfHfWTV0CKbbcVqWtxnm9gfbHlLhuKsfGV2q7K3Z3JomNXd2Zkvu1/rZ3RGcajFL1nMJHBoThzuHDh/KNhCWyZprltCZPorGfRW0NDY29gdCfP2H9kN98poOpW0s1XPxVkKU12QbYan9kvD3B1ig+QcdqPdVFmr6YQdetRHp8ahooG0aDUtnpFmBy52jVR6xoTB+tqnnHV3pi1sRtfqNab6iJ/VeqhrmGTxqVM1NPReUi2a5hXYo5+et18+qaGqE5dgtigY9NbQUME4PbIbSriQWTVUt2/QveW8ODZoEIuZbrGGmrtDtnMt94q2WPzlZyFhC1aYy3s/AL4rnHJGqh245iwT1DC9W7fANMnSnmLuJabUYmwpaOgqEe0+DrVpqOcF5c3l/cO/336MHZ68/fLlGqo5K8cGvY00NLrKNUfxdhrqXZEFRpC2qauW1twd4tW6wit6vYamXjOyVkMlA2nVWys4I90OPGMSKC1PpF+y0ERDC42u1V/E2Ha3/OmYS9HQmfFVzPMMPRmHuoecpqFiF4ov2Goch0oRVvM4NHigxWD82TAOVd8XGb+apdgruk4cGirSOg2VDaS1mfiT+Po4awiZrmHSWbmFhpYbXYt56iPMfJ/qMjV0cWtOWNbfKodM5iPqeqjoCKtOAiKD3lVrNYv5qzr3dNfaotfQRBdb1kC6SEOt8zyx6U5cD7V3h2gPLDVywTqfWUPlPirTUKPNtv6uzKsr21xcbPfsMw8rzmi9hpYbXau/Xac8xtWZhtr9kg0ezL5JfiTBkrXzGL36pvrJeYTnCKvfcU543Jpnaov5q+E+sm5CLMwANcthSUMLrZGlCshNd9I9JXN3KA0iOexmHIfzL87N3ZfPvA0vv66XsNnOxqGaO7JsE66eUdJZOX9Che2ZzMFudK2+VHualKwzD2OvZxfUfqQO99JKLbeFEWfjzqpzRn09H9oVaCgaCuqEbxOv6MadVeuM6u9TQkOh7jivuV8eDa3RF803sm+0X77aGVXeL4+GAgC8e9BQAAA0FAAADQUAQEO7osDLzsLywHs3ZBf6m5rCFT5R0NB2t/tHaiqfu7oPfBNvY730Fq3W9Y2qPjTU2+1eU/JKfJ3Lhk/8CPVu9o65B9bbGmsqpZ9s9rzxb8kGwt3k3KX+EwpqND43ev5jk0fMLkJDxy1Doy3IJq+VP8cgqHw7c2tzYjmH7aPC7jW0mbys2wh3RhrKXL5MQwNbT2mvZ2TMbHdrllPGW0h9Gz3bpKZfi9yG5sRx6QVmz6rtrvVND/nTVFyKEn1kKCjlaS12ccm5K41sU7G4INO5+x6s0fhUW8mmoVFB7n53b0O0vd/R0FwcOlgrpfbL+87Kdrdm3Zh5XEAQjZ1WxSNbWuTGH29rTixUymQQpXhFa+cuT4+j0xRb3t5HRQFXnKfYxblzl5yqbRNYg0mWXk/RJzuqfKKVLBoq9+ZswxK81sPW72hoej3Ujw1FDTV9qGuoHNt+cgLVChoqjuk2Frmp0PFqB3PiMg2NLOnUc0/nJSYMDKxWqGR6RU7WptiTLveXpZGraqjcyInKq2FvRkPV3hyOvff7x9bvaGgyDo0MlrbQ0CGNEwXbJ/KpHt/OIjcazpubE8cX00oNfStdP3erhkotb++jVDwVVUfUUFt9yxu5ooYqjSxXXm+lFQ5NoamStH6z63vCL2Auvzgib6uhgRveqRq6pUWuKCKbmhPHFVsfh9rvU6jhthxLGfvI0NWp9YHTNDTTyFU11BRWp1vJpqGJkXy3/FCc7f2p/jRUikkda+QGGjqUuCL2DIfKfha50RWwtTmxfGcpa/Yse0Xbn2QRT1NueXsfFXW1+D6J9RpariNGDZXfYSm90yX1IpColTQDbjXYjHNdatb3E0znpKFH1RtWRefXHy3WyIXBqcnXedLok0LRXS1y4yG9kTlxZq0s59ZsOMd0OCadptjy9j7Kz0ijt3KalmtslsPmu/JFlthX2iMZQUHqmnLYSnpBgpN8VJBvTe48zlr09mw0tB+CNdDDYsLyMvrm1DX9bbcSb6lncek8X9hyMAAauhHeO+nGmHRDDd3B9LefeqKh5zkYAA0N8OfyGwqoMJfv95ppUE/7LhuJ+k21WUHWRu6hSoCGAgCgoQAAaCgAABoKAABoKAAAGgoAgIYCAKChAABoKAAAoKEAAGgoAMB5aujP55fXv39OLOLP39fX15fnnzQ2AKCh3WroWzEINQBcnoZuBBoKAH1q6BBIHpjl9PD5kUm3RgmbvxiTLuk8JXYOz0i0mDIs3U3kpPV+AM7p1wAALklDZ5k8SOkgQz+f/04B3yHB+PVRaI8JXtyYMNAvu5yJKcXSpTgUDQWArubys4hKKQ5fvrjitqQUNNSmZ9mUbs5oKAD0raHzX8HkedJQbTky1q95dSC7gimklEpHQwHgHOLQl2ct4izSUFchbTeC5pRqvIuGAkDPGjovPjpT+jEkXK+hwcJppiaJ0qW8nA/GaBYNBYDtNfQ1vAPvfvr3ORWHRjfMp9vlr6bb8nJKsfToG/+xgJfnP8ShALC5hgIAABoKAICGAgCgoQAAaCgAAKChAABoKAAAGrqejnxOseADQEPRUDQUANDQPUBDAdDQM9XQTryiF2NoyfFEqBIAoKH7a+iOXtGuseoUh8oaqhlIAwAa2s1cfmOvaMEg8KfFeQ87PgA0tEsN3dgrukhDFQNpAEBDe4pDt/SKLtDQRBAMAGhoFxq6vVf0UpCzLis6QKsG0gCAhu6soft5RTtz/r9/3g475i85QOsG0gCAhgIAoKEAAICGAgCgoQAAaCgAABoKAABoKAAAGurQkX9o+zwBAA29OA1Vtj+hoQBo6HvR0FMFGKkEQEPPWkP38WCONoq+hts6vUPnSrrVwpgZAA3dW0N39GBOxKFBJoE9yfRPjJkB0NB+5vIbezAXaKhbM1kuMcQDQEP31tCNPZgLNNQLPhcJxZgZAA3tKw7d0oO5dC4vrNBizAyAhvaiodt7MKdS5F+rhDEzABrag4bu6cEclvZHyTN7Vx5jZgA0FGxLDtyEB0BDoQT/gYGi+/4AgIZCMJdHQAHQUAAANBQAANBQAAA0FAAADQUAQEMBAAANBQBAQwEA0FAAADQUAAANpQkAANBQAAA0FAAADQUAeCf8DzIhP4a2rvfKAAAAAElFTkSuQmCC"},8532:(a,t,A)=>{A.d(t,{Z:()=>e});const e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAa4AAAEECAIAAAD/EEdFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAHQmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTBUMTU6NDM6NTMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjI0OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk3YWI4YTMyLTVmMGMtOWM0NC1hNDhkLTYzYTRjODVlMGIwMiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxYjljOTRkZC1lOGZkLTUzNDYtYWE2OS1mNjcxNzI1YjBjNjkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxYjljOTRkZC1lOGZkLTUzNDYtYWE2OS1mNjcxNzI1YjBjNjkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjFiOWM5NGRkLWU4ZmQtNTM0Ni1hYTY5LWY2NzE3MjViMGM2OTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjFiOWM5NGRkLWU4ZmQtNTM0Ni1hYTY5LWY2NzE3MjViMGM2OSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xMFQxNTo0Mzo1MyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDphNjgzYWY4My01M2E3LWRhNDgtOTAyYS1jYTYxZDcyNTgzOGIiIHN0RXZ0OndoZW49IjIwMjItMTAtMTBUMTY6MTE6NTArMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OTdhYjhhMzItNWYwYy05YzQ0LWE0OGQtNjNhNGM4NWUwYjAyIiBzdEV2dDp3aGVuPSIyMDIyLTEyLTA1VDE4OjI0OjA4KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuNSAo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"}}]); \ No newline at end of file diff --git a/assets/js/dadaca00.64b4e275.js b/assets/js/dadaca00.64b4e275.js new file mode 100644 index 00000000..a4082ca1 --- /dev/null +++ b/assets/js/dadaca00.64b4e275.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8051],{3905:(a,e,n)=>{n.d(e,{Zo:()=>k,kt:()=>A});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var p=t.createContext({}),m=function(a){var e=t.useContext(p),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},k=function(a){var e=m(a.components);return t.createElement(p.Provider,{value:e},a.children)},u={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},s=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,k=d(a,["components","mdxType","originalType","parentName"]),s=m(n),A=i,o=s["".concat(p,".").concat(A)]||s[A]||u[A]||r;return n?t.createElement(o,l(l({ref:e},k),{},{components:n})):t.createElement(o,l({ref:e},k))}));function A(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=s;var d={};for(var p in e)hasOwnProperty.call(e,p)&&(d[p]=e[p]);d.originalType=a,d.mdxType="string"==typeof a?a:i,l[1]=d;for(var m=2;m{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:13,title:"A.13. Tipe Data \u279c Array",sidebar_label:"A.13. Array",description:"Belajar array pada rust. Contoh penerapan array, iterasi array, dan operasi lainnya pada array",keywords:["rust","belajar rust","array rust","slice rust"]},l=void 0,d={unversionedId:"basic/array",id:"basic/array",title:"A.13. Tipe Data \u279c Array",description:"Belajar array pada rust. Contoh penerapan array, iterasi array, dan operasi lainnya pada array",source:"@site/docs/basic/array.md",sourceDirName:"basic",slug:"/basic/array",permalink:"/basic/array",draft:!1,tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13,title:"A.13. Tipe Data \u279c Array",sidebar_label:"A.13. Array",description:"Belajar array pada rust. Contoh penerapan array, iterasi array, dan operasi lainnya pada array",keywords:["rust","belajar rust","array rust","slice rust"]},sidebar:"tutorialSidebar",previous:{title:"A.12. Perulangan \u279c for in",permalink:"/basic/perulangan-for-in"},next:{title:"A.14. Slice (Basic)",permalink:"/basic/slice"}},p={},m=[{value:"A.13.1. Pengenalan array",id:"a131-pengenalan-array",level:2},{value:"\u25c9 Deklarasi variabel array (type inference)",id:"-deklarasi-variabel-array-type-inference",level:3},{value:"\u25c9 Pengaksesan elemen array",id:"-pengaksesan-elemen-array",level:3},{value:"\u25c9 Mengubah isi elemen array",id:"-mengubah-isi-elemen-array",level:3},{value:"\u25c9 Formatted print {:?}",id:"-formatted-print-",level:3},{value:"\u25c9 Formatted print {namaVariabel:?}",id:"-formatted-print-namavariabel",level:3},{value:"A.13.2. Notasi penulisan tipe data array",id:"a132-notasi-penulisan-tipe-data-array",level:2},{value:"A.13.3. Macam-macam deklarasi array",id:"a133-macam-macam-deklarasi-array",level:2},{value:"\u25c9 Deklarasi array dengan metode type inference",id:"-deklarasi-array-dengan-metode-type-inference",level:3},{value:"\u25c9 Deklarasi array dengan metode manifest typing disertai predefined value",id:"-deklarasi-array-dengan-metode-manifest-typing-disertai-predefined-value",level:3},{value:"\u25c9 Deklarasi array dengan notasi penulisan [T; N]",id:"-deklarasi-array-dengan-notasi-penulisan-t-n",level:3},{value:"A.13.4. Melihat size array menggunakan method len",id:"a134-melihat-size-array-menggunakan-method-len",level:2},{value:"A.13.5. Iterasi array menggunakan for in",id:"a135-iterasi-array-menggunakan-for-in",level:2},{value:"A.13.6. Iterasi array menggunakan while dan loop",id:"a136-iterasi-array-menggunakan-while-dan-loop",level:2},{value:"A.13.7. Iterasi array menggunakan for in dan tuple",id:"a137-iterasi-array-menggunakan-for-in-dan-tuple",level:2},{value:"A.13.8. Append elemen ke array",id:"a138-append-elemen-ke-array",level:2},{value:"A.13.9. Nested array",id:"a139-nested-array",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],k={toc:m};function u(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},k,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter awal kita sudah mempelajari tipe data primitif jenis scalar. Selain ",(0,i.kt)("em",{parentName:"p"},"scalar types")," ada juga tipe data primitif lainnya yaitu ",(0,i.kt)("strong",{parentName:"p"},"compound types"),". Compound types sendiri adalah jenis tipe data kolektif yang isinya banyak data. Kesemua data tersebut memiliki tipe data yang sama dan di-group menjadi satu."),(0,i.kt)("p",null,"Array adalah salah satu tipe data compound yang tersedia di Rust, dan pada chapter ini kita akan mempelajarinya."),(0,i.kt)("h2",{id:"a131-pengenalan-array"},"A.13.1. Pengenalan array"),(0,i.kt)("p",null,"Menurut dokumentasi official Rust, array adalah:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"An array is a collection of objects of the same type T, stored in contiguous memory."),(0,i.kt)("p",{parentName:"blockquote"},"A fixed-size array, denoted ","[T; N]",", for the element type, T, and the non-negative compile-time constant size, N.")),(0,i.kt)("p",null,"Array (atau ",(0,i.kt)("em",{parentName:"p"},"fixed size array"),") adalah kumpulan data dengan tipe sejenis, disimpan dalam 1 variabel. Array memiliki kapasitas yang nilainya ditentukan saat deklarasi/alokasi. Jumlah data dalam array pasti tidak boleh lebih dari kapasitas yang sudah ditentukan di awal. Data dalam array biasa disebut dengan ",(0,i.kt)("em",{parentName:"p"},"element")," atau item."),(0,i.kt)("p",null,"Ada beberapa notasi deklarasi array yang bisa dipakai, kesemuanya akan dibahas pada chapter ini."),(0,i.kt)("p",null,"Ok, Sekarang kita mulai praktik dengan bermain-main terlebih dahulu dengan tipe data array ini. Silakan pelajari dan praktikkan contoh berikut, sebuah program yang isinya menampilkan data array."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut numbers = [24, 12, 32, 7];\nprintln!("array {:?}", numbers);\n\nlet data0 = numbers[0];\nprintln!("elemen array ke 0 {data0}");\n\nlet data1 = numbers[1];\nprintln!("elemen array ke 1 {data1}");\n\nnumbers[1] = 16;\nnumbers[3] = 8;\nprintln!("array {numbers:?}");\n')),(0,i.kt)("p",null,"Coba jalankan aplikasi, muncul dua baris output di console."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array",src:n(3421).Z,width:"448",height:"164"})),(0,i.kt)("p",null,"Selanjutnya mari kita bahas dengan detail contoh di atas."),(0,i.kt)("h3",{id:"-deklarasi-variabel-array-type-inference"},"\u25c9 Deklarasi variabel array (",(0,i.kt)("em",{parentName:"h3"},"type inference"),")"),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," dideklarasikan sebagai array ",(0,i.kt)("em",{parentName:"p"},"mutable")," dengan metode deklarasi type inference, yang tipe datanya didapat langsung dari nilai."),(0,i.kt)("p",null,"Value dari ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[24, 12, 32, 7]"),", yang mana artinya sebuah array dengan size 4, bertipe numerik, dengan isi ",(0,i.kt)("inlineCode",{parentName:"p"},"24"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"32"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"7"),"."),(0,i.kt)("p",null,"Sintaks ",(0,i.kt)("inlineCode",{parentName:"p"},"[24, 12, 32, 7]")," adalah salah satu cara menulis literal array. Tulis saja data yang diinginkan dengan separator ",(0,i.kt)("inlineCode",{parentName:"p"},",")," dan diapit tanda kurung siku ",(0,i.kt)("inlineCode",{parentName:"p"},"[ ]"),"."),(0,i.kt)("p",null,"Contoh lain deklarasi array:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut alphabets = ["a", "b", "c", "d"];\nlet booleans = [true, false];\nlet floatingNumbers = [32.0000078, 3.14, 0.5];\n')),(0,i.kt)("p",null,"O iya, penulisan literal array juga bisa dituliskan dalam multi-baris, contohnya seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut alphabets = [\n "a",\n "b",\n "c",\n "d"\n];\nlet booleans = [\n true,\n false\n];\n')),(0,i.kt)("h3",{id:"-pengaksesan-elemen-array"},"\u25c9 Pengaksesan elemen array"),(0,i.kt)("p",null,"Pengaksesan elemen array dilakukan dengan menuliskan nama variabel array kemudian diikuti kurung siku yang mengapit angka indeks elemen yang diinginkan."),(0,i.kt)("p",null,"Indeks array dimulai dari 0. Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," size-nya adalah 4 elemen, berarti elemen array ada pada indeks ke 0, 1, 2, 3."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data0 = numbers[0];\nprintln!("elemen array ke 0 {data0}");\n\nlet data1 = numbers[1];\nprintln!("elemen array ke 1 {data1}");\n')),(0,i.kt)("p",null,"Array hanya bisa diakses elemennya sesuai size saat deklarasi. Sebagai contoh, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," yang size nya 4, jika dipaksa mengakses elemen indeks ke-7 maka akan menghasilkan error."),(0,i.kt)("h3",{id:"-mengubah-isi-elemen-array"},"\u25c9 Mengubah isi elemen array"),(0,i.kt)("p",null,"Array bisa diubah isi elemen-nya jika variabel tersebut adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"mutable"),". Pada contoh yang sudah dibuat, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," dideklarasikan mutable dengan tipe data elemen adalah numerik. Dengan ini kita bisa mengubah value elemen array dengan value baru bertipe data sama."),(0,i.kt)("p",null,"Bisa dilihat pada contoh yang sudah dipraktikkan, elemen indeks ke-1 diubah nilainya menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"16"),", dan elemen indeks ke-3 value-nya menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"8")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"numbers[1] = 16;\nnumbers[3] = 8;\n")),(0,i.kt)("p",null,"Array hanya bisa diubah elemen-nya sesuai size saat deklarasi. Sebagai contoh, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," yang size nya 4, jika dipaksa mengakses dan/atau mengubah elemen indeks ke-7 maka akan menghasilkan error."),(0,i.kt)("p",null,"Selain itu, operasi assignment atau pengubahan nilai pada elemen array hanya bisa dilakukan dengan tipe data yang sama. Pada contoh di atas ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," adalah array bertipe numerik, karenanya tidak akan bisa diubah nilai elemen-nya dengan tipe lain, dan jika dipaksa akan menghasilkan error."),(0,i.kt)("h3",{id:"-formatted-print-"},"\u25c9 Formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{:?}")),(0,i.kt)("p",null,"Formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}")," berguna untuk memformat macam-macam tipe data ke bentuk string, yang salah satunya adalah tipe data array. Dengan menggunakan formatted print ini kita bisa menampilkan nilai elemen array dalam bentuk string."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("array {:?}", numbers);\n')),(0,i.kt)("h3",{id:"-formatted-print-namavariabel"},"\u25c9 Formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{namaVariabel:?}")),(0,i.kt)("p",null,"Formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{namaVariabel:?}")," kegunaannya sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),", dengan perbedaan: pada penggunaan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{namaVariabel:?}")," tidak perlu menuliskan variabel yang ingin di-format sebagai argumen. Cukup ganti ",(0,i.kt)("inlineCode",{parentName:"p"},"namaVariabel")," dengan nama variabel yang ingin di-format."),(0,i.kt)("p",null,"Silakan lihat contoh berikut. Keduanya adalah ekuivalen, menghasilkan nilai yang sama."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("array {:?}", numbers);\nprintln!("array {numbers:?}");\n')),(0,i.kt)("h2",{id:"a132-notasi-penulisan-tipe-data-array"},"A.13.2. Notasi penulisan tipe data array"),(0,i.kt)("p",null,"Pada contoh program yang sudah dipraktikkan, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"number")," tipe datanya adalah array numerik, terlihat saat deklarasinya ",(0,i.kt)("em",{parentName:"p"},"predefined value")," diisi dengan literal elemen array bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," di sini adalah milik elemen array, sedang array ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," itu sendiri tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[i32; 4]"),", yang artinya adalah ",(0,i.kt)("strong",{parentName:"p"},"sebuah array dengan elemen bertipe ",(0,i.kt)("inlineCode",{parentName:"strong"},"i32")," dengan size ",(0,i.kt)("inlineCode",{parentName:"strong"},"4")),"."),(0,i.kt)("p",null,"Jika kawan-kawan menggunakan ekstensi VSCode ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer"),", akan terlihat informasi tipe data array-nya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array",src:n(2957).Z,width:"445",height:"336"})),(0,i.kt)("h2",{id:"a133-macam-macam-deklarasi-array"},"A.13.3. Macam-macam deklarasi array"),(0,i.kt)("p",null,"Array lebih mudah dideklarasikan dengan metode ",(0,i.kt)("em",{parentName:"p"},"type inference"),". Namun tak menutup kemungkinan ada kebutuhan di mana array harus dideklarasikan dengan menuliskan tipe datanya secara eksplisit. Berikut adalah macam-macam cara mendeklarasikan array."),(0,i.kt)("h3",{id:"-deklarasi-array-dengan-metode-type-inference"},"\u25c9 Deklarasi array dengan metode ",(0,i.kt)("em",{parentName:"h3"},"type inference")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let angka_integer = [24, 12, 32, 7];\nprintln!("{angka_integer:?}");\n// output: [24, 12, 32, 7]\n\nlet angka_float = [24.2, 12.5, 32.00002, 7.2];\nprintln!("{angka_float:?}");\n// output: [24.2, 12.5, 32.00002, 7.2]\n')),(0,i.kt)("h3",{id:"-deklarasi-array-dengan-metode-manifest-typing-disertai-predefined-value"},"\u25c9 Deklarasi array dengan metode ",(0,i.kt)("em",{parentName:"h3"},"manifest typing")," disertai ",(0,i.kt)("em",{parentName:"h3"},"predefined value")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_boolean: [bool; 2] = [false, true];\nprintln!("{data_boolean:?}");\n// output: [false, true]\n\nlet angka_unsigned_integer: [u32; 3] = [24, 0, 12];\nprintln!("{angka_unsigned_integer:?}");\n// output: [24, 0, 12]\n')),(0,i.kt)("h3",{id:"-deklarasi-array-dengan-notasi-penulisan-t-n"},"\u25c9 Deklarasi array dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"h3"},"[T; N]")),(0,i.kt)("p",null,"Pada contoh berikut, ",(0,i.kt)("inlineCode",{parentName:"p"},"data_numerik1")," dideklarasikan bertipe array dengan tipe data data elemen adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", mempunyai size ",(0,i.kt)("inlineCode",{parentName:"p"},"10"),", dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value")," untuk setiap elemen array adalah angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_numerik1: [i32; 10] = [0; 10];\nprintln!("{data_numerik1:?}");\n// output: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n')),(0,i.kt)("p",null,"Pada contoh ke-dua ini, ",(0,i.kt)("inlineCode",{parentName:"p"},"data_numerik2")," dideklarasikan dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value")," adalah array yang size-nya ",(0,i.kt)("inlineCode",{parentName:"p"},"5")," dan nilai default tiap elemen adalah angka ",(0,i.kt)("inlineCode",{parentName:"p"},"4"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_numerik2 = [4; 5];\nprintln!("{data_numerik2:?}");\n// output: [4, 4, 4, 4, 4]\n')),(0,i.kt)("p",null,"Tambahan penjelasan mengenai notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"[T; N]"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Jika digunakan pada penulisan tipe data array saat deklarasi, ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," adalah tipe data elemen, dan ",(0,i.kt)("inlineCode",{parentName:"li"},"N")," adalah lebar/size array. Contoh: ",(0,i.kt)("inlineCode",{parentName:"li"},"let data_numerik1: [i32; 10]"),"."),(0,i.kt)("li",{parentName:"ul"},"Jika digunakan pada penulisan ",(0,i.kt)("em",{parentName:"li"},"predefined value"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," adalah nilai setiap elemen array, dan ",(0,i.kt)("inlineCode",{parentName:"li"},"N")," adalah lebar/size array. Contoh: ",(0,i.kt)("inlineCode",{parentName:"li"},"[4; 2]"),", yang artinya semua elemen array diisi dengan angka ",(0,i.kt)("inlineCode",{parentName:"li"},"4"),".")),(0,i.kt)("h2",{id:"a134-melihat-size-array-menggunakan-method-len"},"A.13.4. Melihat size array menggunakan method ",(0,i.kt)("inlineCode",{parentName:"h2"},"len")),(0,i.kt)("p",null,"Array secara ",(0,i.kt)("em",{parentName:"p"},"default")," properti tipe data ",(0,i.kt)("strong",{parentName:"p"},"slice"),", yang salah satunya adalah method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"len")," yang berguna untuk melihat size dari sebuah array. Cara penggunaannya cukup dengan menuliskan ",(0,i.kt)("inlineCode",{parentName:"p"},".len()")," setelah variabel array. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names = ["jason", "grayon", "drake", "damian"];\nlet length = names.len();\nprintln!("array size is {}", length);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array for in",src:n(7674).Z,width:"449",height:"113"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai slice dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/slice"},"Slice"))),(0,i.kt)("h2",{id:"a135-iterasi-array-menggunakan-for-in"},"A.13.5. Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")),(0,i.kt)("p",null,"Pada contoh berikut, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"names")," adalah array bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"[&str; 4]"),", dideklarasikan dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value"),". Elemen array tersebut kemudian diiterasi menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," untuk di-print ke layar console value setiap elemennya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\nfor name in names {\n println!("{name}");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array for in",src:n(2977).Z,width:"445",height:"149"})),(0,i.kt)("p",null,"Bisa juga dengan memanfaatkan ",(0,i.kt)("em",{parentName:"p"},"range syntax")," dalam perulangan array. Benefitnya adalah pengaksesan indeks array lebih mudah."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\nfor i in 0..names.len() {\n println!("array index ke-{}: {}", i, names[i]);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array for in",src:n(4097).Z,width:"447",height:"148"})),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"names.len()")," mengembalikan informasi size sebuah array, nilainya bisa dimanfaatkan dalam perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," untuk iterasi indeks ke-0 hingga terakhir."),(0,i.kt)("h2",{id:"a136-iterasi-array-menggunakan-while-dan-loop"},"A.13.6. Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"while")," dan ",(0,i.kt)("inlineCode",{parentName:"h2"},"loop")),(0,i.kt)("p",null,"Contoh iterasi array menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"while"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\n\nlet mut i = 0;\nwhile i < names.len() {\n println!("array index ke-{}: {}", i, names[i]);\n i += 1;\n}\n')),(0,i.kt)("p",null,"Contoh iterasi array menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"loop"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\n\nlet mut i = 0;\nloop {\n if i >= names.len() {\n break;\n }\n\n println!("array index ke-{}: {}", i, names[i]);\n i += 1;\n}\n')),(0,i.kt)("p",null,"Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"loop")," umumnya kurang praktis jika dibandingkan dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),". Tapi pastinya ada case di mana ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," dan/atau ",(0,i.kt)("inlineCode",{parentName:"p"},"loop")," akan dibutuhkan."),(0,i.kt)("h2",{id:"a137-iterasi-array-menggunakan-for-in-dan-tuple"},"A.13.7. Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")," dan ",(0,i.kt)("em",{parentName:"h2"},"tuple")),(0,i.kt)("p",null,"Mengiterasi value sekaligus ",(0,i.kt)("em",{parentName:"p"},"counter")," perulangan sebenarnya bisa juga dilakukan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", contohnya seperti yang sudah kita praktikkan di atas yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"for i in 0..names.len()"),"."),(0,i.kt)("p",null,"Ada juga bentuk lain pemanfaatan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," untuk mengiterasi sebuah array. Caranya dengan menggunakan teknik tuple untuk menampung data ",(0,i.kt)("em",{parentName:"p"},"counter")," sekaligus value tiap elemen. Lebih jelasnya silakan lihat dan praktikkan contoh berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\n\nfor (i, name) in names.iter().enumerate() {\n println!("array index ke-{i}: {name}");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array enumerate",src:n(4097).Z,width:"447",height:"148"})),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"names")," yang notabene bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"[&str; 4]")," perlu dikonversi ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," terlebih dahulu caranya lewat pemanggilan method ",(0,i.kt)("inlineCode",{parentName:"p"},".iter()"),". Kemudian dari tipe tersebut perlu dikonversi lagi ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Enumerate")," dengan cara memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},".enumerate()"),"."),(0,i.kt)("p",null,"Setelah mendapatkan objek bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Enumerate"),", keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," digunakan untuk menampung tiap elemen array dalam bentuk ",(0,i.kt)("em",{parentName:"p"},"tuple")," ",(0,i.kt)("inlineCode",{parentName:"p"},"(i, name)"),". Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," di situ berisi counter iterasi, dan ",(0,i.kt)("inlineCode",{parentName:"p"},"name")," adalah value-nya."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai ",(0,i.kt)("inlineCode",{parentName:"li"},"Enumerate")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai tuple dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/tuple"},"Tuple")))),(0,i.kt)("h2",{id:"a138-append-elemen-ke-array"},"A.13.8. Append elemen ke array"),(0,i.kt)("p",null,"Operasi menambahkan sebuah elemen ke array yang hasilnya melebihi kapasitas ... adalah tidak bisa. Karena array memiliki size fixed, tidak dinamis. Solusinya adalah menggunakan tipe data Vector. Nantinya array perlu dikonversi ke bentu Vector terlebih dahulu kemudian di-append, lebih jelasnya kita bahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector"),"."),(0,i.kt)("h2",{id:"a139-nested-array"},"A.13.9. Nested array"),(0,i.kt)("p",null,"Data nested array bisa dibuat dengan level kedalaman tanpa batas, tetapi harus mengikuti aturan tipe data array yaitu: fixed size dan elemen bertipe data sejenis."),(0,i.kt)("p",null,"Pada contoh berikut variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_arr")," didefinisikan sebagai sebuah array bersarang atau nested dengan kedalaman 2 level."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_arr = [\n ["salad", "fried rice"],\n ["apple", "coconut"],\n ["spinach", "jalapeno"],\n];\nfor sub_arr in data_arr {\n for el in sub_arr {\n print!("{el}, ");\n }\n println!();\n}\n\n// salad, fried rice,\n// apple, coconut,\n// spinach, jalapeno,\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_arr")," pada contoh di atas bertipe data",(0,i.kt)("inlineCode",{parentName:"p"},"[[&str; 2]; 3]"),", yang artinya adalah sebuah array dengan size 3, dengan isi elemen adalah juga array dengan size 2. Selalu ingat bahwa size array adalah fixed."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/array"},"github.com/novalagung/dasarpemrogramanrust-example/../array")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice"},"Slice (Basic)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/vector"},"Tipe Data \u279c Vector")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.array.html"},"https://doc.rust-lang.org/std/primitive.array.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.slice.html"},"https://doc.rust-lang.org/std/primitive.slice.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/index.html"},"https://doc.rust-lang.org/std/iter/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/struct.Enumerate.html"},"https://doc.rust-lang.org/std/iter/struct.Enumerate.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/trait.Iterator.html"},"https://doc.rust-lang.org/std/iter/trait.Iterator.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/trait/iter.html"},"https://doc.rust-lang.org/rust-by-example/trait/iter.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"))))}u.isMDXComponent=!0},3421:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/array-1-919358da6705a5ced706fbcd108be794.png"},2957:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/array-2-bc70d4683afb247a4d30a6551aabec0a.png"},7674:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAABxCAIAAAAiZI9+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjM6MDg6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQ2OjE2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQ2OjE2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ3NjdjMzI4LWM2NDYtNmU0MC05NDI0LTQ1MjQ1NmJjMzgxYyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphM2I0ZTQzNS1lYmYxLWI5NGYtYjMwYi0xYzI3M2Q1MzE3ODkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphM2I0ZTQzNS1lYmYxLWI5NGYtYjMwYi0xYzI3M2Q1MzE3ODkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOmEzYjRlNDM1LWViZjEtYjk0Zi1iMzBiLTFjMjczZDUzMTc4OTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmEzYjRlNDM1LWViZjEtYjk0Zi1iMzBiLTFjMjczZDUzMTc4OSIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNlQyMzowODoyOSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpkNzY3YzMyOC1jNjQ2LTZlNDAtOTQyNC00NTI0NTZiYzM4MWMiIHN0RXZ0OndoZW49IjIwMjItMDktMjdUMTY6NDY6MTYrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7FX4zkAAAbcUlEQVR4nO2dT2wbx73HfyRLWY4chioVik9V1tqqj7ECufW6Kvz4fKCRC+uDLgsDCwjIQTffdfbJZ91z88GAAQIGgcAoDD3kGeFBZfWe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"},4097:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAACUCAIAAACMbbBkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjM6MTk6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQyOjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQyOjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFiOGM0NzBjLTc0NDAt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"},2977:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAACVCAIAAABDxLP8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MTI6NTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2ZDI0NzYwLThhOTYt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"}}]); \ No newline at end of file diff --git a/assets/js/dadaca00.d3047a10.js b/assets/js/dadaca00.d3047a10.js deleted file mode 100644 index ae2682be..00000000 --- a/assets/js/dadaca00.d3047a10.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8051],{3905:(a,e,n)=>{n.d(e,{Zo:()=>k,kt:()=>A});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var p=t.createContext({}),m=function(a){var e=t.useContext(p),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},k=function(a){var e=m(a.components);return t.createElement(p.Provider,{value:e},a.children)},u={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},s=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,p=a.parentName,k=d(a,["components","mdxType","originalType","parentName"]),s=m(n),A=i,o=s["".concat(p,".").concat(A)]||s[A]||u[A]||r;return n?t.createElement(o,l(l({ref:e},k),{},{components:n})):t.createElement(o,l({ref:e},k))}));function A(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=s;var d={};for(var p in e)hasOwnProperty.call(e,p)&&(d[p]=e[p]);d.originalType=a,d.mdxType="string"==typeof a?a:i,l[1]=d;for(var m=2;m{n.r(e),n.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>m});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:13,title:"A.13. Tipe Data \u279c Array",sidebar_label:"A.13. Array",description:"Belajar array pada rust. Contoh penerapan array, iterasi array, dan operasi lainnya pada array",keywords:["rust","belajar rust","array rust","slice rust"]},l=void 0,d={unversionedId:"basic/array",id:"basic/array",title:"A.13. Tipe Data \u279c Array",description:"Belajar array pada rust. Contoh penerapan array, iterasi array, dan operasi lainnya pada array",source:"@site/docs/basic/array.md",sourceDirName:"basic",slug:"/basic/array",permalink:"/basic/array",draft:!1,tags:[],version:"current",sidebarPosition:13,frontMatter:{sidebar_position:13,title:"A.13. Tipe Data \u279c Array",sidebar_label:"A.13. Array",description:"Belajar array pada rust. Contoh penerapan array, iterasi array, dan operasi lainnya pada array",keywords:["rust","belajar rust","array rust","slice rust"]},sidebar:"tutorialSidebar",previous:{title:"A.12. Perulangan \u279c for in",permalink:"/basic/perulangan-for-in"},next:{title:"A.14. Slice (Basic)",permalink:"/basic/slice"}},p={},m=[{value:"A.13.1. Pengenalan array",id:"a131-pengenalan-array",level:2},{value:"\u25c9 Deklarasi variabel array (type inference)",id:"-deklarasi-variabel-array-type-inference",level:3},{value:"\u25c9 Pengaksesan elemen array",id:"-pengaksesan-elemen-array",level:3},{value:"\u25c9 Mengubah isi elemen array",id:"-mengubah-isi-elemen-array",level:3},{value:"\u25c9 Formatted print {:?}",id:"-formatted-print-",level:3},{value:"\u25c9 Formatted print {namaVariabel:?}",id:"-formatted-print-namavariabel",level:3},{value:"A.13.2. Notasi penulisan tipe data array",id:"a132-notasi-penulisan-tipe-data-array",level:2},{value:"A.13.3. Macam-macam deklarasi array",id:"a133-macam-macam-deklarasi-array",level:2},{value:"\u25c9 Deklarasi array dengan metode type inference",id:"-deklarasi-array-dengan-metode-type-inference",level:3},{value:"\u25c9 Deklarasi array dengan metode manifest typing disertai predefined value",id:"-deklarasi-array-dengan-metode-manifest-typing-disertai-predefined-value",level:3},{value:"\u25c9 Deklarasi array dengan notasi penulisan [T; N]",id:"-deklarasi-array-dengan-notasi-penulisan-t-n",level:3},{value:"A.13.4. Melihat size array menggunakan method len",id:"a134-melihat-size-array-menggunakan-method-len",level:2},{value:"A.13.5. Iterasi array menggunakan for in",id:"a135-iterasi-array-menggunakan-for-in",level:2},{value:"A.13.6. Iterasi array menggunakan while dan loop",id:"a136-iterasi-array-menggunakan-while-dan-loop",level:2},{value:"A.13.7. Iterasi array menggunakan for in dan tuple",id:"a137-iterasi-array-menggunakan-for-in-dan-tuple",level:2},{value:"A.13.8. Append elemen ke array",id:"a138-append-elemen-ke-array",level:2},{value:"A.13.9. Nested array",id:"a139-nested-array",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],k={toc:m};function u(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},k,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter awal kita sudah mempelajari tipe data primitif jenis scalas. Selain ",(0,i.kt)("em",{parentName:"p"},"scalar types")," ada juga tipe data primitif lainnya yaitu ",(0,i.kt)("strong",{parentName:"p"},"compound types"),". Compound types sendiri adalah jenis tipe data kolektif yang isinya banyak data. Kesemua data tersebut memiliki tipe data yang sama dan di-group menjadi satu."),(0,i.kt)("p",null,"Array adalah salah satu tipe data compound yang tersedia di Rust, dan pada chapter ini kita akan mempelajarinya."),(0,i.kt)("h2",{id:"a131-pengenalan-array"},"A.13.1. Pengenalan array"),(0,i.kt)("p",null,"Menurut dokumentasi official Rust, array adalah:"),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"An array is a collection of objects of the same type T, stored in contiguous memory."),(0,i.kt)("p",{parentName:"blockquote"},"A fixed-size array, denoted ","[T; N]",", for the element type, T, and the non-negative compile-time constant size, N.")),(0,i.kt)("p",null,"Array (atau ",(0,i.kt)("em",{parentName:"p"},"fixed size array"),") adalah kumpulan data dengan tipe sejenis, disimpan dalam 1 variabel. Array memiliki kapasitas yang nilainya ditentukan saat deklarasi/alokasi. Jumlah data dalam array pasti tidak boleh lebih dari kapasitas yang sudah ditentukan di awal. Data dalam array biasa disebut dengan ",(0,i.kt)("em",{parentName:"p"},"element")," atau item."),(0,i.kt)("p",null,"Ada beberapa notasi deklarasi array yang bisa dipakai, kesemuanya akan dibahas pada chapter ini."),(0,i.kt)("p",null,"Ok, Sekarang kita mulai praktik dengan bermain-main terlebih dahulu dengan tipe data array ini. Silakan pelajari dan praktikkan contoh berikut, sebuah program yang isinya menampilkan data array."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut numbers = [24, 12, 32, 7];\nprintln!("array {:?}", numbers);\n\nlet data0 = numbers[0];\nprintln!("elemen array ke 0 {data0}");\n\nlet data1 = numbers[1];\nprintln!("elemen array ke 1 {data1}");\n\nnumbers[1] = 16;\nnumbers[3] = 8;\nprintln!("array {numbers:?}");\n')),(0,i.kt)("p",null,"Coba jalankan aplikasi, muncul dua baris output di console."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array",src:n(3421).Z,width:"448",height:"164"})),(0,i.kt)("p",null,"Selanjutnya mari kita bahas dengan detail contoh di atas."),(0,i.kt)("h3",{id:"-deklarasi-variabel-array-type-inference"},"\u25c9 Deklarasi variabel array (",(0,i.kt)("em",{parentName:"h3"},"type inference"),")"),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," dideklarasikan sebagai array ",(0,i.kt)("em",{parentName:"p"},"mutable")," dengan metode deklarasi type inference, yang tipe datanya didapat langsung dari nilai."),(0,i.kt)("p",null,"Value dari ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[24, 12, 32, 7]"),", yang dimana artinya sebuah array dengan size 4, bertipe numerik, dengan isi ",(0,i.kt)("inlineCode",{parentName:"p"},"24"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"12"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"32"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"7"),"."),(0,i.kt)("p",null,"Sintaks ",(0,i.kt)("inlineCode",{parentName:"p"},"[24, 12, 32, 7]")," adalah salah satu cara menulis literal array. Tulis saja data yang diinginkan dengan separator ",(0,i.kt)("inlineCode",{parentName:"p"},",")," dan diapit tanda kurung siku ",(0,i.kt)("inlineCode",{parentName:"p"},"[ ]"),"."),(0,i.kt)("p",null,"Contoh lain deklarasi array:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut alphabets = ["a", "b", "c", "d"];\nlet booleans = [true, false];\nlet floatingNumbers = [32.0000078, 3.14, 0.5];\n')),(0,i.kt)("p",null,"O iya, penulisan literal array juga bisa dituliskan dalam multi-baris, contohnya seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut alphabets = [\n "a",\n "b",\n "c",\n "d"\n];\nlet booleans = [\n true,\n false\n];\n')),(0,i.kt)("h3",{id:"-pengaksesan-elemen-array"},"\u25c9 Pengaksesan elemen array"),(0,i.kt)("p",null,"Pengaksesan elemen array dilakukan dengan menuliskan nama variabel array kemudian diikuti kurung siku yang mengapit angka indeks elemen yang diinginkan."),(0,i.kt)("p",null,"Indeks array dimulai dari 0. Pada contoh di atas, ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," size-nya adalah 4 elemen, berarti elemen array ada pada indeks ke 0, 1, 2, 3."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data0 = numbers[0];\nprintln!("elemen array ke 0 {data0}");\n\nlet data1 = numbers[1];\nprintln!("elemen array ke 1 {data1}");\n')),(0,i.kt)("p",null,"Array hanya bisa diakses elemennya sesuai size saat deklarasi. Sebagai contoh, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," yang size nya 4, jika dipaksa mengakses elemen indeks ke-7 maka akan menghasilkan error."),(0,i.kt)("h3",{id:"-mengubah-isi-elemen-array"},"\u25c9 Mengubah isi elemen array"),(0,i.kt)("p",null,"Array bisa diubah isi elemen-nya jika variabel tersebut adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"mutable"),". Pada contoh yang sudah dibuat, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," dideklarasikan mutable dengan tipe data elemen adalah numerik. Dengan ini kita bisa mengubah value elemen array dengan value baru bertipe data sama."),(0,i.kt)("p",null,"Bisa dilihat pada contoh yang sudah dipraktikkan, elemen indeks ke-1 diubah nilainya menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"16"),", dan elemen indeks ke-3 value-nya menjadi ",(0,i.kt)("inlineCode",{parentName:"p"},"8")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"numbers[1] = 16;\nnumbers[3] = 8;\n")),(0,i.kt)("p",null,"Array hanya bisa diubah elemen-nya sesuai size saat deklarasi. Sebagai contoh, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," yang size nya 4, jika dipaksa mengakses dan/atau mengubah elemen indeks ke-7 maka akan menghasilkan error."),(0,i.kt)("p",null,"Selain itu, operasi assignment atau pengubahan nilai pada elemen array hanya bisa dilakukan dengan tipe data yang sama. Pada contoh di atas ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," adalah array bertipe numerik, karenanya tidak akan bisa diubah nilai elemen-nya dengan tipe lain, dan jika dipaksa akan menghasilkan error."),(0,i.kt)("h3",{id:"-formatted-print-"},"\u25c9 Formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{:?}")),(0,i.kt)("p",null,"Formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}")," berguna untuk memformat macam-macam tipe data ke bentuk string, yang salah satunya adalah tipe data array. Dengan menggunakan formatted print ini kita bisa menampilkan nilai elemen array dalam bentuk string."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("array {:?}", numbers);\n')),(0,i.kt)("h3",{id:"-formatted-print-namavariabel"},"\u25c9 Formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{namaVariabel:?}")),(0,i.kt)("p",null,"Formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{namaVariabel:?}")," kegunaannya sama seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),", dengan perbedaan: pada penggunaan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{namaVariabel:?}")," tidak perlu menuliskan variabel yang ingin di-format sebagai argumen. Cukup ganti ",(0,i.kt)("inlineCode",{parentName:"p"},"namaVariabel")," dengan nama variabel yang ingin di-format."),(0,i.kt)("p",null,"Silakan lihat contoh berikut. Keduanya adalah ekuivalen, menghasilkan nilai yang sama."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'println!("array {:?}", numbers);\nprintln!("array {numbers:?}");\n')),(0,i.kt)("h2",{id:"a132-notasi-penulisan-tipe-data-array"},"A.13.2. Notasi penulisan tipe data array"),(0,i.kt)("p",null,"Pada contoh program yang sudah dipraktikkan, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"number")," tipe datanya adalah array numerik, terlihat saat deklarasinya ",(0,i.kt)("em",{parentName:"p"},"predefined value")," diisi dengan literal elemen array bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," di sini adalah milik elemen array, sedang array ",(0,i.kt)("inlineCode",{parentName:"p"},"numbers")," itu sendiri tipe datanya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"[i32; 4]"),", yang artinya adalah ",(0,i.kt)("strong",{parentName:"p"},"sebuah array dengan elemen bertipe ",(0,i.kt)("inlineCode",{parentName:"strong"},"i32")," dengan size ",(0,i.kt)("inlineCode",{parentName:"strong"},"4")),"."),(0,i.kt)("p",null,"Jika kawan-kawan menggunakan ekstensi VSCode ",(0,i.kt)("inlineCode",{parentName:"p"},"rust-analyzer"),", akan terlihat informasi tipe data array-nya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array",src:n(2957).Z,width:"445",height:"336"})),(0,i.kt)("h2",{id:"a133-macam-macam-deklarasi-array"},"A.13.3. Macam-macam deklarasi array"),(0,i.kt)("p",null,"Array lebih mudah dideklarasikan dengan metode ",(0,i.kt)("em",{parentName:"p"},"type inference"),". Namun tak menutup kemungkinan ada kebutuhan dimana array harus dideklarasikan dengan menuliskan tipe datanya secara eksplisit. Berikut adalah macam-macam cara mendeklarasikan array."),(0,i.kt)("h3",{id:"-deklarasi-array-dengan-metode-type-inference"},"\u25c9 Deklarasi array dengan metode ",(0,i.kt)("em",{parentName:"h3"},"type inference")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let angka_integer = [24, 12, 32, 7];\nprintln!("{angka_integer:?}");\n// output: [24, 12, 32, 7]\n\nlet angka_float = [24.2, 12.5, 32.00002, 7.2];\nprintln!("{angka_float:?}");\n// output: [24.2, 12.5, 32.00002, 7.2]\n')),(0,i.kt)("h3",{id:"-deklarasi-array-dengan-metode-manifest-typing-disertai-predefined-value"},"\u25c9 Deklarasi array dengan metode ",(0,i.kt)("em",{parentName:"h3"},"manifest typing")," disertai ",(0,i.kt)("em",{parentName:"h3"},"predefined value")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_boolean: [bool; 2] = [false, true];\nprintln!("{data_boolean:?}");\n// output: [false, true]\n\nlet angka_unsigned_integer: [u32; 3] = [24, 0, 12];\nprintln!("{angka_unsigned_integer:?}");\n// output: [24, 0, 12]\n')),(0,i.kt)("h3",{id:"-deklarasi-array-dengan-notasi-penulisan-t-n"},"\u25c9 Deklarasi array dengan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"h3"},"[T; N]")),(0,i.kt)("p",null,"Pada contoh berikut, ",(0,i.kt)("inlineCode",{parentName:"p"},"data_numerik1")," dideklarasikan bertipe array dengan tipe data data elemen adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", mempunyai size ",(0,i.kt)("inlineCode",{parentName:"p"},"10"),", dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value")," untuk setiap elemen array adalah angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_numerik1: [i32; 10] = [0; 10];\nprintln!("{data_numerik1:?}");\n// output: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n')),(0,i.kt)("p",null,"Pada contoh ke-dua ini, ",(0,i.kt)("inlineCode",{parentName:"p"},"data_numerik2")," dideklarasikan dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value")," adalah array yang size-nya ",(0,i.kt)("inlineCode",{parentName:"p"},"5")," dan nilai default tiap elemen adalah angka ",(0,i.kt)("inlineCode",{parentName:"p"},"4"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_numerik2 = [4; 5];\nprintln!("{data_numerik2:?}");\n// output: [4, 4, 4, 4, 4]\n')),(0,i.kt)("p",null,"Tambahan penjelasan mengenai notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"[T; N]"),":"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Jika digunakan pada penulisan tipe data array saat deklarasi, ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," adalah tipe data elemen, dan ",(0,i.kt)("inlineCode",{parentName:"li"},"N")," adalah lebar/size array. Contoh: ",(0,i.kt)("inlineCode",{parentName:"li"},"let data_numerik1: [i32; 10]"),"."),(0,i.kt)("li",{parentName:"ul"},"Jika digunakan pada penulisan ",(0,i.kt)("em",{parentName:"li"},"predefined value"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"T")," adalah nilai setiap elemen array, dan ",(0,i.kt)("inlineCode",{parentName:"li"},"N")," adalah lebar/size array. Contoh: ",(0,i.kt)("inlineCode",{parentName:"li"},"[4; 2]"),", yang artinya semua elemen array diisi dengan angka ",(0,i.kt)("inlineCode",{parentName:"li"},"4"),".")),(0,i.kt)("h2",{id:"a134-melihat-size-array-menggunakan-method-len"},"A.13.4. Melihat size array menggunakan method ",(0,i.kt)("inlineCode",{parentName:"h2"},"len")),(0,i.kt)("p",null,"Array secara ",(0,i.kt)("em",{parentName:"p"},"default")," properti tipe data ",(0,i.kt)("strong",{parentName:"p"},"slice"),", yang salah satunya adalah method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"len")," yang berguna untuk melihat size dari sebuah array. Cara penggunaannya cukup dengan menuliskan ",(0,i.kt)("inlineCode",{parentName:"p"},".len()")," setelah variabel array. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names = ["jason", "grayon", "drake", "damian"];\nlet length = names.len();\nprintln!("array size is {}", length);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array for in",src:n(7674).Z,width:"449",height:"113"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai slice dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/slice"},"Slice"))),(0,i.kt)("h2",{id:"a135-iterasi-array-menggunakan-for-in"},"A.13.5. Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")),(0,i.kt)("p",null,"Pada contoh berikut, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"names")," adalah array bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"[&str; 4]"),", dideklarasikan dengan ",(0,i.kt)("em",{parentName:"p"},"predefined value"),". Elemen array tersebut kemudian diiterasi menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," untuk di-print ke layar console value setiap elemennya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\nfor name in names {\n println!("{name}");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array for in",src:n(2977).Z,width:"445",height:"149"})),(0,i.kt)("p",null,"Bisa juga dengan memanfaatkan ",(0,i.kt)("em",{parentName:"p"},"range syntax")," dalam perulangan array. Benefitnya adalah pengaksesan indeks array lebih mudah."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\nfor i in 0..names.len() {\n println!("array index ke-{}: {}", i, names[i]);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array for in",src:n(4097).Z,width:"447",height:"148"})),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"names.len()")," mengembalikan informasi size sebuah array, nilainya bisa dimanfaatkan dalam perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," untuk iterasi indeks ke-0 hingga terakhir."),(0,i.kt)("h2",{id:"a136-iterasi-array-menggunakan-while-dan-loop"},"A.13.6. Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"while")," dan ",(0,i.kt)("inlineCode",{parentName:"h2"},"loop")),(0,i.kt)("p",null,"Contoh iterasi array menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"while"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\n\nlet mut i = 0;\nwhile i < names.len() {\n println!("array index ke-{}: {}", i, names[i]);\n i += 1;\n}\n')),(0,i.kt)("p",null,"Contoh iterasi array menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"loop"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\n\nlet mut i = 0;\nloop {\n if i >= names.len() {\n break;\n }\n\n println!("array index ke-{}: {}", i, names[i]);\n i += 1;\n}\n')),(0,i.kt)("p",null,"Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"loop")," umumnya kurang praktis jika dibandingkan dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),". Tapi pastinya ada case dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"while")," dan/atau ",(0,i.kt)("inlineCode",{parentName:"p"},"loop")," akan dibutuhkan."),(0,i.kt)("h2",{id:"a137-iterasi-array-menggunakan-for-in-dan-tuple"},"A.13.7. Iterasi array menggunakan ",(0,i.kt)("inlineCode",{parentName:"h2"},"for in")," dan ",(0,i.kt)("em",{parentName:"h2"},"tuple")),(0,i.kt)("p",null,"Mengiterasi value sekaligus ",(0,i.kt)("em",{parentName:"p"},"counter")," perulangan sebenarnya bisa juga dilakukan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in"),", contohnya seperti yang sudah kita praktikkan di atas yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"for i in 0..names.len()"),"."),(0,i.kt)("p",null,"Ada juga bentuk lain pemanfaatan ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," untuk mengiterasi sebuah array. Caranya dengan menggunakan teknik tuple untuk menampung data ",(0,i.kt)("em",{parentName:"p"},"counter")," sekaligus value tiap elemen. Lebih jelasnya silakan lihat dan praktikkan contoh berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let names: [&str; 4] = ["jason", "grayon", "drake", "damian"];\n\nfor (i, name) in names.iter().enumerate() {\n println!("array index ke-{i}: {name}");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"array enumerate",src:n(4097).Z,width:"447",height:"148"})),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"names")," yang notabene bertipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"[&str; 4]")," perlu dikonversi ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Iterator")," terlebih dahulu caranya lewat pemanggilan method ",(0,i.kt)("inlineCode",{parentName:"p"},".iter()"),". Kemudian dari tipe tersebut perlu dikonversi lagi ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Enumerate")," dengan cara memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},".enumerate()"),"."),(0,i.kt)("p",null,"Setelah mendapatkan objek bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Enumerate"),", keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," digunakan untuk menampung tiap elemen array dalam bentuk ",(0,i.kt)("em",{parentName:"p"},"tuple")," ",(0,i.kt)("inlineCode",{parentName:"p"},"(i, name)"),". Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"i")," disitu berisi counter iterasi, dan ",(0,i.kt)("inlineCode",{parentName:"p"},"name")," adalah value-nya."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai traits dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/traits"},"Traits")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai ",(0,i.kt)("inlineCode",{parentName:"li"},"Enumerate")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai tuple dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/tuple"},"Tuple")))),(0,i.kt)("h2",{id:"a138-append-elemen-ke-array"},"A.13.8. Append elemen ke array"),(0,i.kt)("p",null,"Operasi menambahkan sebuah elemen ke array yang hasilnya melebihi kapasitas ... adalah tidak bisa. Karena array memiliki size fixed, tidak dinamis. Solusinya adalah menggunakan tipe data Vector. Nantinya array perlu dikonversi ke bentu Vector terlebih dahulu kemudian di-append, lebih jelasnya kita bahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/vector"},"Vector"),"."),(0,i.kt)("h2",{id:"a139-nested-array"},"A.13.9. Nested array"),(0,i.kt)("p",null,"Data nested array bisa dibuat dengan level kedalaman tanpa batas, tetapi harus mengikuti aturan tipe data array yaitu: fixed size dan elemen bertipe data sejenis."),(0,i.kt)("p",null,"Pada contoh berikut variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_arr")," didefinisikan sebagai sebuah array bersarang atau nested dengan kedalaman 2 level."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let data_arr = [\n ["salad", "fried rice"],\n ["apple", "coconut"],\n ["spinach", "jalapeno"],\n];\nfor sub_arr in data_arr {\n for el in sub_arr {\n print!("{el}, ");\n }\n println!();\n}\n\n// salad, fried rice,\n// apple, coconut,\n// spinach, jalapeno,\n')),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"data_arr")," pada contoh di atas bertipe data",(0,i.kt)("inlineCode",{parentName:"p"},"[[&str; 2] 3]"),", yang artinya adalah sebuah array dengan size 3, dengan isi elemen adalah juga array dengan size 2. Selalu ingat bahwa size array adalah fixed."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/array"},"github.com/novalagung/dasarpemrogramanrust-example/../array")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice"},"Slice (Basic)")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/vector"},"Tipe Data \u279c Vector")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/slice-memory-management"},"Slice Memory Management"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.array.html"},"https://doc.rust-lang.org/std/primitive.array.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.slice.html"},"https://doc.rust-lang.org/std/primitive.slice.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/index.html"},"https://doc.rust-lang.org/std/iter/index.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/struct.Enumerate.html"},"https://doc.rust-lang.org/std/iter/struct.Enumerate.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/iter/trait.Iterator.html"},"https://doc.rust-lang.org/std/iter/trait.Iterator.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/trait/iter.html"},"https://doc.rust-lang.org/rust-by-example/trait/iter.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"},"https://doc.rust-lang.org/rust-by-example/flow_control/for.html"))))}u.isMDXComponent=!0},3421:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/array-1-919358da6705a5ced706fbcd108be794.png"},2957:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/array-2-bc70d4683afb247a4d30a6551aabec0a.png"},7674:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAABxCAIAAAAiZI9+AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjM6MDg6MjkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQ2OjE2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQ2OjE2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ3NjdjMzI4LWM2NDYtNmU0MC05NDI0LTQ1MjQ1NmJjMzgxYyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDphM2I0ZTQzNS1lYmYxLWI5NGYtYjMwYi0xYzI3M2Q1MzE3ODkiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphM2I0ZTQzNS1lYmYxLWI5NGYtYjMwYi0xYzI3M2Q1MzE3ODkiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOmEzYjRlNDM1LWViZjEtYjk0Zi1iMzBiLTFjMjczZDUzMTc4OTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmEzYjRlNDM1LWViZjEtYjk0Zi1iMzBiLTFjMjczZDUzMTc4OSIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNlQyMzowODoyOSswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpkNzY3YzMyOC1jNjQ2LTZlNDAtOTQyNC00NTI0NTZiYzM4MWMiIHN0RXZ0OndoZW49IjIwMjItMDktMjdUMTY6NDY6MTYrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7FX4zkAAAbcUlEQVR4nO2dT2wbx73HfyRLWY4chioVik9V1tqqj7ECufW6Kvz4fKCRC+uDLgsDCwjIQTffdfbJZ91z88GAAQIGgcAoDD3kGeFBZfWe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"},4097:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb8AAACUCAIAAACMbbBkAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjM6MTk6MTQrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQyOjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQyOjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFiOGM0NzBjLTc0NDAt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"},2977:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb0AAACVCAIAAABDxLP8AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDktMjZUMjI6MTI6NTYrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE2OjQ0OjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2ZDI0NzYwLThhOTYtODU0NS1iMDhmLTc0M2U2YTUzNDg5YSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpkNmQyNDc2MC04YTk2LTg1NDUtYjA4Zi03NDNlNmE1MzQ4OWEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpkNmQyNDc2MC04YTk2LTg1NDUtYjA4Zi03NDNlNmE1MzQ4OWEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmQ2ZDI0NzYwLThhOTYtODU0NS1iMDhmLTc0M2U2YTUzNDg5YSIgc3RFdnQ6d2hlbj0iMjAyMi0wOS0yNlQyMjoxMjo1NiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PnJMBkMAABl1SURBVHic7Z1PbBvXncd/lEpFKVOZLhWZ61XGnirLWIXcZrIqXK4OLHRhc9CFCEBAgA+6+c6zTjrz7psOAgIQCAgEQhFo0RWWB1U11ugUTRRliXppEWnAqCbMyGEqh5W5h5nh/Hsz8x7/S/l+YMDi8P39vTc/vn/znZAkSQQAAICbiVEXAAAALhnwmwAAIAb8JgAAiAG/CQAAYsBvAgCAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACAG/CYAAIjB7TeVdDaTkoiIpFQmm1b6XhIlPYhUe8CscTcIWKm7jHor3kCwF0lJZ7OBReSuRY+9TkplGBkF5j6GRgY0Bg33I65QUiqTiNQO96pERC8HUxL1uJZJZlL1YqnqF0xJZxPRzqdGubCnuq+bl31jt2qHPrmpxzV5WZaoaguhpLPyuV80cdgZEZGUyiTjYf9S9gG26QZQUQbMuttbSWum4eUOxg13Vxx5w/H4TSm1HKfa4YDvIKqWirF0djklVYNyMu5tKZVJZtNU2Ktrfr3AVURr7GQmRZ6uoVqpLycXFaoyXXAf8chIkmNUK9di8iA7iCRiOiHUvQKH4Tzq7vqxGMzYYWhNDPrLqBuOw28qiyyv2RkTdAYo2uiIiKy93nKRGdI+MlSPa7KANaqlymI2MUfSTCzcqlcE73zNTyc62SnpbCJqK0+1VFnMyilJDXQqzLpTgJXMi8yMJDkWblbUCll/Wa3RqVXzyF1JZ+fOa5F4PNyqleuxhPegVZLdprMkl8xmk0ZJ66lMcrpiqYb+gVEk85LNnpZxpFkefiMz7clMk3nRkYiWAtvyXEZ2hvS7EbQR02Na1r5olAt7qpTKLNPjynTSu4do1zxaM8ZIk8Mgxhdni8zo/H3JXU12jTzqHtiXjD7H6Iqq1y0ztIYL9pvKXLRVP7QUboKIogm5dlgoVElJZxNpRd1TpdQiPS4Uqnr22rBRSi3Hm845s5JOGhellGNqXq3Ul5NzCpHQz0i1Ul+Ox33Hjmzq5y2KzUhEXrHU00YieLjHqjsR20oMg7AzkuRYuFFRqao0k8Y3FtORks7KXrmfEUXj0+VCeS6bSGj/e9SCZbpqqVhlTI7YIz5mkbQUpFQmOW0xkjmwlVKZZDKtVDU78BmZZc86K032RbO8Wfv42pU7r5E9ujczJBGF48lko1woqFIqk5RTpFaIwvGks4cw7g6P1jxjpck0spI2BgRSKpOMN8vFUpWURWd0SS0Rd18imdnnOzXqJOlVdwYMe7K74ugbLnBfSJqJUPPM2aMbZb0W6mmDonMKUbW0Z9SrWqm3wtMxPWh0zr6ar8xFG2W9xNVSpRGOyZY7snrWpMgM56RMSSeirdoxUbVULBzWKJ7McmxFWKieNc0P6l6h4PJo6nGN4osB+xFedXdbichtEHZGkhwLN05VLbJmIyklm6YLyr1VO1at/3uXvTvT6aVkF4mBshgPNyp6Qaulx7WWaQeGkcNagbLZbNbcDnLYk5km+6KOrDlN+x1oz13IyMRoTc+Qrdrhntq5yqhRZIZ5d2hx2a3pSJNdd2UuSlpXomql3rLcX/boMZG+FNTng+vOhn13MBllwwWON2PTYccVu6utn7doWiu3ZYxM1NCKUoyls4lsNmGO5WciFNWudIrlSC8xHfMeARKRGd86CdPGONqvbDYd89gYsiPNRIjOfYNwjYBZdbdhWIlhEHZGxmiTyPxhZf9Ic+QeRDem64LWed3jG7eRAzbDOr2OmaZHRuF4PEqtmms9p+smZremR3OYqyGGuV3lmyaJ/O8OB840lTSr7vXzFsW1+tmXZVxFEulLIr0uuO7Gl153Bzv86Bou0G92eqgHselw61wlJZ2MkzH9sU7QjN0BJZ1NZlJUrJDPdreRntf9ZdTIJ3619FjOJH0n3x0kORZmDKadCQatv3nW3cRSK6dBLNNjMyNJjoUpbL2BWrKH3+TInRMR03VD2PJ76Pg5FlrkJN2eRNPsND0yatUOH9OyZYGAP3fu7l2Kdd8cLe0X3NW7lTR3Eoy6K1Q9aybjhjdu+W3w8valUlVJZ/vU6+x43h1MRtdwgfN0/4mzlJKjrbp+Q+seSEotx51jVM3/EmmD3WjC8yQee1lABC5nSKSZNGwZ2Stp65zQQmei7INv3XUr2YtkGISZUWw63KodFgwOa61wjKpnTWN2IaUy1nV+39z5sZmuft5y11rvCUpa/2H2LhKjbhSV9XUAKSVHHVNOHiN3yqn3Olaa7IsG1VKx3IgmXOsRZu5dGtnWmuLNoaQT0Va9EnR3BME0sjaBNbpS4CCOv/A99jpnX7JhsyezK2qMquGC94XU00YiYd3j1vaFHDPl6nFNTuoXG7VaKz5NzoFvo6z58lKRUplkZyhlG5Bbp6f8OHYL/YajjrLzHb9xbPOH48benl56Vt2dORWNpXq3QdwZxRx7cdVKfTmeSdWL5YY+u2iUD2vycicOK3cuvE2njT71mjbKhT3VvNCqlWutxDQRqXvlOVeRrNVMZLMJLfpegdJZy66oR901I7tszLRnlZUm86J506l7hzOZZDKbka0TQTN3Zo2YRma2JvNG8MS94sS4O878UrDDNHK1spi1TV08p8C8fSkl9dbrrJ3L7Eued4e7KzqKPPyGC3G8z1JKZZKx+sCPQNOwzlp3w9BKNr4mGDyjrfuwc7edxRlePsO7m4fFKBqO59y75u55DqT3WhzzoaRxg+8Q92XKaAwZbd2vquXtS8ncy1iXh1E0HN9zlvyP8nSPshhvuiZvAIDesMxfiShwGQvwwDNPBwAAYBK4nw4AAMAG/CYAAIgBvwkAAGJMXrt2bdRl6DAbWr87+U64/XmjHyFnQ+t3J+dftv/63WDKQEo6+x/zL45PvhFJ3zOp1PLS0tLS0juz/Umxi/y5suYPGZBKv0zHl6aUyvz2zvTRE7+nFnly4K47V4uageaneizbUAhuNiWd/eUMb1X605dGAt9+el8JfXBvYsr82P7q01f/bXFtU6/zJsQf8jIwcHliIhr1EckfDKYCkS/aCRquxxRHf4CY65wgp/p473hqUXKHVNLZRLTbu24EfpOIiM4uPjx2XXzW/vDZBVd0/pCAB/4jcFf1lCMP3HWXZiIk/tjbWMMrXi5yZLH7vmSRjFPS2YSPo2aHVNLZBNVqLYoxIwUzKr/pxDII7bjU2dD6Quirr9s3b0wQEb18dfDn9gkzpB7YWKzVQxIR0RuhDxYmpmwXzRS+//rio6eu6P4EaaN2tGYTZP66OT7y5eISdq17KN26pWoZCrJeErAMjWEPqVpiqBE7NGRY8rcegX2Ffoj7uRa+5tBxyB57qecyVH4rMrPuzOZgiYgFSClz1tCh3cups0vMGpWqTit5Z8QUL2dK/xLxqY+zlK297emKLEdbtUPVzC3mId/KCkkUS8vnh4USpTJxj0IFDmLHxW+2P3p04ZrCE1Ho5o32F48u/jQbWl+Y+PnsxckzZsjQBwsTphO0cP0G2aOHPrg3MaU53NnQ+sLk+99efEKh9U70AAfK1EZlKTGfNhIJUxWub+MPty4secj0OjVxC3tsCViWxjBbqrbECNkRINO87anheBnS1EzT9Qh3cxCxZI890mSo/FKVZSVXc9QNh0X6k/md3ywPzWYOPGSkeXV2JbUUY+oWM6zkKRLsEi9naQybJQ7Wd2P3Og/ZYyexaVMMT5cF8ZCeZIVUqLRXJHKJ2fnVyMWo9tNnJtfvaf9C7/kGfP6k/Sfj78gbfiGnbjCSckS/dTs0Re2vtLHoM3pOdP1Neu/NCaJX//c0uNRsbVSmErN6bCrzSnKMAuSDuXHqwnrL9Do0ccUeb+CVPe6gpBNkGIElvsuvcMwPd3NoXzhljz0q4qnyy8LRHNVSsVAoFMoNIkOCaE/11WzuHk6d3Sq7Rv7y4Q48VMo8ayGkPm6DLXvMLlQqk81mE1QulAP6N39I7nYZq/XN7mn/z9ftlRsTd+7RHbLP0+3EXg8R0c27k+uWizOv9ZS3hxKz+aMryTGqPx7cOnmgXinZZRkHgJJOUNlYrAqSpvbHNvHWVZFEZrY8ufuJynqq/PYETxuJwq2zy6iRJIu0EWPdwV9jmEd9vCc6g2oiklIZap56ZcUdUkg1eVzm6b1y8vTVyVMiot+8O3nztYmfz14w/Wb9H22aIccO/m/e7Tl71mqI4TilmcG6TT894A6DuG872LymhssgUoozMWPm34tuj7s57GMMXfaYnT+3yq8IPG0kBr9eNatGEok8qM7+nfHRGOZRH++e+nmLWvVDy2qyV2b8IYlIRDX5yp17rzTaPt+ePG1/T6Gbt9xRJm7MElHofd/dIaY2qqfWbLVSb0VmFDnWrHR18/kKuxr4yvSSFj9hqib7SMB2iZTKmDN0IvIwCL/CMT9izWEpsUVs22lkQZVfLoI0m3lgNhyXzi6zRt5WYmXkP+92K3D3rj7uS7VSb4Xjy5pB7aLg2pS8o0vtE9IPhqa4gzEZb1p3Y2Ym1+/R919ffPQtf0jbZs73X1988oxolplT+6Mnr9YXJtfv6Z+fP7n45OkrOTp5c2FyfYGeP3n1fGEi4lVOpjZq1UuJWXtPcbxRLvFbQocp7OpRJA+ZXo+3MDkkYC3b7B2N4VNGNrbtV1ONuK7dsuaMT1M4ZhiEaboe4W8OYhqEYWStzZwqv8Ssu0A5/TWbOXBr9/Lq7LJr5NNpGSLBLvFyXwXuYPVxdl8SMEaRUkYhfefUzJDW3OPJbDbZqhWKlQBNcTvQQxoL+n2qeViauFePEaj8Drix+lMjgWg/hGcrrtw8HYBeuHoqv/2pUbX0uEbGjNcH7amix1faadLYzNOB8Uad4TxuCbwYqsqveRy9Mags+lcjrieBfijq45inAwCAGJinAwCAGPCbAAAgBvwmAACIMVa6xYNAQIeYB01pdqxUZgPFZAcq6DsIBWImUirz21//Yhw1fvsvOj0yQd8x7N7jyXjsp9+6PbFyI9T5yFQ26oX+KRyre5rOTDZNtl3JEcrKqsc1edlDR2vwDC13DwWdkcMpUXw58OrewMF4+E2N508uPnlG7y1O3rkx+f63F58860eiA1A4tminjQXVSn05SO/wquY+cgYiUTxScehx695jyTj5TY0//f3VnZkJIv2RSs2Zan8bj1S6xIz5FY7ZId2ym6++eGQK0PkyBrKy1VJlMetUKxySoG+p6s7dS4CWkTvLIF65B5nfW7PZqe7MNHJAdA/4JIo92t23Pl0I+joMYtHcJONYsJLO2sQ4uV41AZyMx/pmNBqS3gidP2//9Tt679bk7Gvt539rPw2H7v5Uv0g/Dt39aeii2f78+9Ddn0785I32F49e/edLuvvmxE9etv9KrIvf0ed/a3/6N3pnPjT5sv2pNnr9MTNk6IO7ExdfXxSO2mfhkPQGffVp+zDoyX6Db06Oj46OpuaXZhqHH/3uD0dHR9rikJT69fXPP/7dH46Ojl7MLi6+Pffi+OSbf3l7aW72rbf++aTw8e9fzL7zbzfnXhyf/Cyd+tfzcuHj3x+9mH3nrTdelD/6r/8lJf3bW61y4ePfHx29mP3lu/8+9+KPpT8yMyIiqs3M/+LmTyzrYZboR1PzS9f/+eXxyTfuNI9P6PbiW7NzepJT88uJt6eOnvzj9uJbP2royV8zPiiscrJyv3Z78Vb8liPNGit3hkGOjhvM3DtJWz+yjEyW3Ds2/oZZeP7o7nbX11tj00TTsaXOy9WmUpl3r/1da6AXs4uLi9LU0ZMas92Za5dad3ox+46lmtc4i2Rvd8PIf/nL8dT8L27dnjW7mvYbyGgOzj4Pxmk//frC5Pq9yTuvvTp4ZNN5c8MUM+ZXOHaGnKUpaj87JSI6+dZPTkmEIcrKEpF6XKP4oiFvM2xBX3vu7jQjM341shvEr5YuvIzskr9lF547OjNrQYliezVFX2zDJ+jrYWR177BG8cWUpVuIdjBgY5zm6c+f6K+s+NXtC01Mc0g8o+8XQq//mOg7Xfv9TOjVwR4MT1aWiOfdBIMU9A3IPTxNEnnl7jaIVw1YlWIbmbfwvNFF8FB4dFVzAHg3saZyFG8aMqm9aUuDcfKbRETP2l/N080bofeeci4v9o3rC5PrC0T20Wj3DFNWVkuGtcjpZGCCvv6562kyatTt+wQ1ejOyQHQR+i9RLAS72yjpZKxersWsr37Eomb3jNM8XcOiIkykz7gD5IR75Nbt0BS9+uLRxYePLj581N0+/khlZXXUU2O2NQpBXzN3G7pqMkfuNrg0m4moFyPzR+enHxLFAjBkellGVtKJaKNSUk1NI8HmAA7GbbxJdPK0/asboevzoVt/bn/xJt25Mbl+I0hOmAm3FvLJ0/bPO+8mIiLjRJQIo5WV1TFfwDo0Qd8qK3ePND1q5GdLU7OZqXTbo5G5owvQo0RxfwR9bUY+W9R20FUy7KC9A4K3OQAD6CERvbc4eWfGPHj0m3cnb5Lnm936Tn+Fcgd3/p6nnEo6K59r0tnjpZo8AjVicJUZv/Hm8LG/zzL0+mtEL4eXe3+Fcgd3YpqnnHru4/dLfPXUiMFIwXiTiCj0/r2J651P3q8RHgz2A9nju1rPXc5xfEtHD0Z2HJjvKo1hpAmGB/wmAACIMX776QAAMN7AbwIAgBjwmwAAIAb8JgAAiAG/CQAAYsBvAgCAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACAGp99c2dwpFnc2VwZbGAAAuARgvAkAAGJADwkAAMTw1y1e2dzJKZ23UzTV/P2tA8d15kWq7GZy20REG/nimmyLvrK584Ae7kdz2vVOSAAAuBz4z9MPtu5nNPJqs3N1ZTNDD43LpDzYXCGilc0HyumuHlp3hSubO2tzar4TMpffICKiiJJbbeS1VOVVrJoCAC4V3axvHmzltBEm0cF+uRmJGm+7kpc2rOE2Mkqksq8HPdh6qDblJe2byq42RrVHBwCAy0BX7xeyT9+pQkR0sHU/kS+uFYtr1rl7s1HuSzEBAGBs6MJvbuRzCqn5zNYBaS40qn+xncsYa5q5nU26/yVRJJog0semiajYe3wBAGAs6fIc0umX+lbQA8XtDMsNbS10+7MKdZYvVzZX5aZa7LKYAAAwNnQx3twuqqs5bUJOFVVtKlFyTt0ru5mtA6KDXIbyxVyxmLNcxC4QAOByw3t+c2VzJxfdx5EhAADgnKdvZJQI9ngAAIAC5umOk+zG4SMAAPghg+csAQBADOh6AACAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACBG4HOWFuFhIk3q6MtMcbWRf0gPtMOdhvKwS8x4I19cI1OW2PwIMWMAwCUmYLy5kV+TK7sd4WJDN5MiSi4X3bcqDzPEjLc/q1gkOTeWZKp8tg0xYwDAJcffbxq+jjSJYZqbN9xZU83ntsmiPMwSM94uqk3DcW4syU21uA0xYwDAZcd/nl5uNElZ2iDappXVRKRZ3tddo/nXwdZ97S+mmPF++UFuaYNoe2NJruxnDogSEDMGAFxuAt4v9OUpkbxWLBaLOYXUh95PqBtixo6XER3sl5vy0gZtLMn6uJV0MWMdiBkDAC4bAboeq7LAFo1NzLiiXTvY2s8UV3fmSH2opbL9WWVtbXVzZXvrwBAzzvdQfgAAGDa+fvNgaz+jvzJIw3xxkBOmmLH2zWeVtbU51ZjX0zbEjAEAlxpfPSSHWPHK5k4uUfbynJ5s5IurDeFYAAAwpviON+2LjyuriYgxF+dHP8kEpwkAuCoE6G/aT72LHUfX43rP7QEA4DIC3WIAABADz6cDAIAY8JsAACAG/CYAAIgh4Dc38sUdMbmNlc0d0SgAADDuYLwJAABiwG8CAIAYgbrFNpmjpkpkPAAUrFtsS0c7zamFtYSEQjEA4LIRqFucU053NZWj3Yp5nUu32JpMUdMqzm3b0syrc2tYAAUAXC58/aamh8QcD3LpFmusak7TGIBuLJlpHmztVyKJVThOAMAlInCezoZTt5iIIooiU9OUQ1qZnyPZqrGkT/4BAOCS0KXfdGHoFm8dkK6jpH/RVPMP6UEul9846AxcsagJALjE+M7TD748NV6strK5Y32tJRObbrE1ma37uxVZX8g82C835bX8BjMFAAAYf/zHm9u53SVduLiym1dXH3iH9NQt1hPKz+/kcsWd1fz9rfu0uZPrzNShlwQAuFxADwkAAMTAuXcAABADfhMAAMSA3wQAADHgNwEAQAz4TQAAEAN+EwAAxBiobnEnXhHyxQCAKwPGmwAAIEa/nk/3YTuXwcPoAICrQze6xQyJ4o18camhzilKpKnulhNrSqSp5u9vUSecTcrDrXC8srnzgB7uR3PaQ/AQ/gAAjC/d6BazJYplJbqf2a1ElDXt/8TqCh1s3de0ja1peigcR5TcaiNvlUIGAIBxpBvdYrZEcVMtblv/98RL4biyq+l7OGSPAQBgvOhqfdNDonhI0QEAYKR0sZ9uSBTrM+1mcIx+RgcAgBHTpW6xl0QxJz1GBwCAEdKFbnGARHGHrQPrhHytWFzT9sk5owMAwHgC3WIAABADzwsBAIAY8JsAACAG/CYAAIgBvwkAAGLAbwIAgBjwmwAAIAb8JgAAiAG/CQAAYsBvAgCAGPCbAAAgBvwmAACIAb8JAABiwG8CAIAY8JsAACAG/CYAAIgBvwkAAGL8P8WW/mrC7FDtAAAAAElFTkSuQmCC"}}]); \ No newline at end of file diff --git a/assets/js/db8ccf76.0bea83f9.js b/assets/js/db8ccf76.0bea83f9.js new file mode 100644 index 00000000..edf9979a --- /dev/null +++ b/assets/js/db8ccf76.0bea83f9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4861],{3905:(a,e,t)=>{t.d(e,{Zo:()=>d,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var s=n.createContext({}),u=function(a){var e=n.useContext(s),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},d=function(a){var e=u(a.components);return n.createElement(s.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,s=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),k=u(t),o=i,c=k["".concat(s,".").concat(o)]||k[o]||m[o]||r;return t?n.createElement(c,l(l({ref:e},d),{},{components:t})):n.createElement(c,l({ref:e},d))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=k;var p={};for(var s in e)hasOwnProperty.call(e,s)&&(p[s]=e[s]);p.originalType=a,p.mdxType="string"==typeof a?a:i,l[1]=p;for(var u=2;u{t.r(e),t.d(e,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:36,title:"A.36. Traits",sidebar_label:"A.36. Traits"},l=void 0,p={unversionedId:"basic/traits",id:"basic/traits",title:"A.36. Traits",description:"Trait jika diartikan dalam bahasa Indonesia artinya adalah sifat. Chapter ini akan membahas tentang apa itu trait, apa kegunaannya, dan bagaimana cara penerapannya di Rust programming.",source:"@site/docs/basic/traits.md",sourceDirName:"basic",slug:"/basic/traits",permalink:"/basic/traits",draft:!1,tags:[],version:"current",sidebarPosition:36,frontMatter:{sidebar_position:36,title:"A.36. Traits",sidebar_label:"A.36. Traits"},sidebar:"tutorialSidebar",previous:{title:"A.35. Borrowing",permalink:"/basic/borrowing"},next:{title:"A.37. Generics",permalink:"/basic/generics"}},s={},u=[{value:"A.36.1. Konsep traits",id:"a361-konsep-traits",level:2},{value:"A.36.2. Implementasi trait",id:"a362-implementasi-trait",level:2},{value:"\u25c9 Struct Circle",id:"-struct-circle",level:3},{value:"\u25c9 Block kode impl X for Y",id:"-block-kode-impl-x-for-y",level:3},{value:"\u25c9 Block kode method dalam impl",id:"-block-kode-method-dalam-impl",level:3},{value:"\u25c9 Macro write",id:"-macro-write",level:3},{value:"\u25c9 Print data menggunakan formatted print {:?}",id:"-print-data-menggunakan-formatted-print-",level:3},{value:"\u25c9 Print data menggunakan formatted print {}",id:"-print-data-menggunakan-formatted-print--1",level:3},{value:"A.36.3. Membuat custom trait",id:"a363-membuat-custom-trait",level:2},{value:"\u25c9 Method pow untuk operasi pangkat",id:"-method-pow-untuk-operasi-pangkat",level:3},{value:"\u25c9 Keyword as untuk casting tipe data",id:"-keyword-as-untuk-casting-tipe-data",level:3},{value:"A.36.4. Trait sebagai tipe parameter",id:"a364-trait-sebagai-tipe-parameter",level:2},{value:"A.36.5. Trait bound syntax",id:"a365-trait-bound-syntax",level:2},{value:"A.36.6. Trait where clause",id:"a366-trait-where-clause",level:2},{value:"A.36.7. Trait sebagai return type",id:"a367-trait-sebagai-return-type",level:2},{value:"A.36.8. Associated types pada trait",id:"a368-associated-types-pada-trait",level:2},{value:"A.36.9. Attribute derive",id:"a369-attribute-derive",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:u};function m(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Trait jika diartikan dalam bahasa Indonesia artinya adalah sifat. Chapter ini akan membahas tentang apa itu trait, apa kegunaannya, dan bagaimana cara penerapannya di Rust programming."),(0,i.kt)("p",null,"Pembahasan chapter ini cukup panjang. Makin mendekati akhir pembahasan, makin berat yang dibahas. Penulis anjurkan jika nantinya setelah section ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits#a424-trait-sebagai-tipe-parameter"},"A.36.4. Trait sebagai tipe parameter")," dirasa cukup susah untuk dipahami, silakan lanjut ke chapter berikutnya dulu, dan nanti bisa kembali ke pembahasan chapter ini lagi."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Chapter ini butuh tambahan detail")),(0,i.kt)("h2",{id:"a361-konsep-traits"},"A.36.1. Konsep traits"),(0,i.kt)("p",null,"Di Rust kita bisa mendefinisikan trait/sifat, isinya adalah definisi header method yang bisa di-share ke banyak tipe data."),(0,i.kt)("p",null,"Trait isinya hanya definisi header method (bisa diartikan method tanpa isi). Ketika ada tipe data yang meng-implement suatu trait, maka tipe tersebut wajib untuk menuliskan implementasi method sesuai dengan header method yang ada di trait."),(0,i.kt)("p",null,"Ada dua bagian penting dalam trait yang harus diketahui:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Deklarasi trait"),(0,i.kt)("li",{parentName:"ol"},"Implementasi trait ke tipe data")),(0,i.kt)("p",null,"Perihal point pertama, intinya kita bisa menciptakan trait sesuai kebutuhan. Terlepas dari itu, Rust juga menyediakan cukup banyak traits yang di-implement ke banyak tipe data yang ada di Rust standard library. Beberapa di antaranya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"std::fmt::Debug"),", digunakan agar data bisa di-print menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"li"},"{:?}"),"."),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"std::iter::Enumerate"),", digunakan agar data bisa di-iterasi menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"li"},"for"),"."),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"std::ops::Add"),", di-implementasikan agar data bisa digunakan pada operasi aritmatik penambahan ",(0,i.kt)("inlineCode",{parentName:"li"},"+"),".")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada bahasa pemrograman lain, contohnya Java, konsep trait mirip dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"interface"))),(0,i.kt)("p",null,"Ok, biar lebih jelas, mari lanjut pembelajaran menggunakan contoh. Kita mulai dengan pembahasan tentang cara implementasi trait. Contoh yang digunakan adalah implementasi salah satu trait milik Rust standard library, yaitu trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("h2",{id:"a362-implementasi-trait"},"A.36.2. Implementasi trait"),(0,i.kt)("p",null,"Kita pilih trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," milik Rust standard library untuk belajar cara implementasi trait pada tipe data."),(0,i.kt)("p",null,"Kegunaan dari trait ini adalah: jika di-implement ke tipe data tertentu maka data dengan tipe tersebut bisa di-print via macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," atau macro printing lainnya, dengan menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),"."),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," ini diimplementasikan ke pada banyak tipe data yang di Rust standard library, baik itu tipe primitif maupun non-primitif. Contohnya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let number = 12;\nprintln!("{:?}", number);\n\nlet text = String::from("hello");\nprintln!("{:?}", text);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(2767).Z,width:"451",height:"109"})),(0,i.kt)("p",null,"Dua variabel di atas sukses di-print tanpa error, karena tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ",(0,i.kt)("em",{parentName:"p"},"by default")," sudah implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Jika tertarik untuk pengecekan lebih lanjut, silakan lihat di halaman dokumentasi tipe data ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/primitive.i32.html"},"i32")," dan ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/string/struct.String.html"},"String"),".")),(0,i.kt)("p",null,"Bagaimana dengan custom type yang kita buat sendiri? Misalnya struct."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let circle_one = Circle{raidus: 6};\n println!("{:?}", circle_one);\n}\n\nstruct Circle {\n raidus: i32,\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(9856).Z,width:"841",height:"512"})),(0,i.kt)("p",null,"Hasilnya error, karena struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," yang dibuat tidak implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("p",null,"Solusi agar tidak error adalah dengan mengimplementasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),", dengan itu semua data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," akan bisa di-print menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Selain via implementasi trait, tipe data custom bisa di-print dengan cara menambahkan atribut ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]")," pada definisi tipe data-nya. Namun kita tidak membahas itu pada chapter ini.")),(0,i.kt)("p",null,"Langkah pertama untuk implementasi trait adalah mencari tau terlebih dahulu spesifikasi trait yang ingin diimplementasikan. Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," adalah traits milik Rust standard library, maka harusnya spesifikasi bisa dilihat di dokumentasi Rust."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html"))),(0,i.kt)("p",null,"Pada URL dokumentasi bisa dilihat kalau trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," memiliki struktur kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub trait Debug {\n fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>;\n}\n")),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," mempunyai satu spesifikasi method, bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"fmt")," yang detail strukturnya bisa dilihat di atas."),(0,i.kt)("p",null,"Kita akan implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," ini ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),", maka wajib hukumnya untuk menuliskan implementasi method sesuai dengan yang ada di trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug"),"."),(0,i.kt)("p",null,"Di bawah ini adalah contoh cara implementasi trait."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Circle {\n raidus: i32,\n}\n\nimpl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n\nfn main() {\n let circle_one = Circle{raidus: 6};\n println!("{:?}", circle_one);\n}\n')),(0,i.kt)("p",null,"Ketika program di-run, hasilnya sukses tanpa error. Artinya implementasi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," pada tipe data struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," adalah sukses."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(4666).Z,width:"457",height:"115"})),(0,i.kt)("p",null,"Cara implementasi trait ke struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," memang step-nya agak panjang, tapi penulis yakin lama-kelamaan pasti terbiasa. Ok, sekarang kita bahas satu per satu kode di atas."),(0,i.kt)("h3",{id:"-struct-circle"},"\u25c9 Struct ",(0,i.kt)("inlineCode",{parentName:"h3"},"Circle")),(0,i.kt)("p",null,"Block kode definisi struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," cukup straightforward, isinya hanya 1 property bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"radius")," bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("h3",{id:"-block-kode-impl-x-for-y"},"\u25c9 Block kode ",(0,i.kt)("inlineCode",{parentName:"h3"},"impl X for Y")),(0,i.kt)("p",null,"Notasi penulisan implementasi trait adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"impl X for Y"),", yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"X")," adalah trait yang ingin diimplementasikan dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Y")," adalah tipe data tujuan implementasi."),(0,i.kt)("p",null,"Pada contoh di atas, trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," diimplementasikan ke custom type struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),". Maka statement-nya adalah:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl std::fmt::Debug for Circle {\n // ...\n}\n")),(0,i.kt)("h3",{id:"-block-kode-method-dalam-impl"},"\u25c9 Block kode method dalam ",(0,i.kt)("inlineCode",{parentName:"h3"},"impl")),(0,i.kt)("p",null,"Block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," harus diikuti dengan implementasi method. Pada contoh ini, method ",(0,i.kt)("inlineCode",{parentName:"p"},"fmt")," milik trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," wajib untuk diimplementasikan. Spesifikasi method ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>")," (lebih jelasnya silakan lihat dokumentasi)."),(0,i.kt)("p",null,"Silakan copy method tersebut kemudian paste ke dalam block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," yang sudah ditulis, kemudian tambahkan block kurung kurawal."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n // ...\n }\n}\n")),(0,i.kt)("p",null,"Kemudian tulis implementasi method ",(0,i.kt)("inlineCode",{parentName:"p"},"fmt")," dalam block method. Tulis statement macro ",(0,i.kt)("inlineCode",{parentName:"p"},"write")," untuk data string (yang ingin di-print) dengan tujuan adalah variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"f"),"."),(0,i.kt)("p",null,"Di contoh, format ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle radius: {}")," digunakan. Dengan ini nantinya saat printing data, yang muncul adalah text ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle radius: {}"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'impl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tips untuk pengguna visual studio code dengan rust-analyzer extension ter-install, setelah selesai menulis block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"),", cukup jalankan ",(0,i.kt)("inlineCode",{parentName:"p"},"ctrl+space")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"cmd+space")," untuk men-trigger autocomplete suggestion. Kemudian klik opsi method yang ada di situ, maka kode implementasi method langsung muncul dengan sendirinya.")),(0,i.kt)("h3",{id:"-macro-write"},"\u25c9 Macro ",(0,i.kt)("inlineCode",{parentName:"h3"},"write")),(0,i.kt)("p",null,"Macro ini digunakan untuk menuliskan sebuah data ke object tertentu. Pada contoh kita gunakan untuk menulis string ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle radius: {}")," ke variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"f")," yang bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Formatter<'_>"),"."),(0,i.kt)("p",null,"Notasi penulisan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"write"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// notasi penulisan\nwrite!(variabel_tujuan, data_yang_ingin_di_print, arg1, arg2, ...);\n\n// contoh penerapan\nwrite!(f, "Circle radius: {}", self.raidus);\n')),(0,i.kt)("h3",{id:"-print-data-menggunakan-formatted-print-"},"\u25c9 Print data menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{:?}")),(0,i.kt)("p",null,"Step terakhir adalah print variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"circle")," menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Hasilnya sukses, tidak error seperti sebelumnya."),(0,i.kt)("h3",{id:"-print-data-menggunakan-formatted-print--1"},"\u25c9 Print data menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{}")),(0,i.kt)("p",null,"Coba tambahkan statement ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),", tetapi kali ini gunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{}"),", apakah hasilnya juga tidak error?"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(8738).Z,width:"849",height:"309"})),(0,i.kt)("p",null,"Hasilnya error, karena trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," hanya berguna untuk formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),". Agar data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," bisa di-print menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{}")," maka trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Display")," harus di-implementasikan juga."),(0,i.kt)("p",null,"Ubah kode dengan menambahkan implementasi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Display"),". Hasilnya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Circle {\n raidus: i32,\n}\n\nimpl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n\nimpl std::fmt::Display for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Link dokumentasi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Debug")," ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html")),(0,i.kt)("li",{parentName:"ul"},"Link dokumentasi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Display")," ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Display.html"},"https://doc.rust-lang.org/std/fmt/trait.Display.html")))),(0,i.kt)("h2",{id:"a363-membuat-custom-trait"},"A.36.3. Membuat custom trait"),(0,i.kt)("p",null,"Pada section di atas kita telah membahas bagaimana cara implementasi traits ke tipe data. Pada bagian ini kita akan belajar tentang cara membuat definisi trait (membuat custom trait)."),(0,i.kt)("p",null,"Masih sama dengan metode sebelumnya, pembelajaran dilakukan dengan praktik. Kita gunakan skenario praktik berikut pada program selanjutnya:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Buat struct bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Circle"),"."),(0,i.kt)("li",{parentName:"ol"},"Buat struct bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Square"),"."),(0,i.kt)("li",{parentName:"ol"},"Buat trait bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Area")," dengan isi satu buah method untuk menghitung luas bangun datar (",(0,i.kt)("inlineCode",{parentName:"li"},"calculate"),")."),(0,i.kt)("li",{parentName:"ol"},"Implementasikan trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Area")," ke dua struct tersebut.")),(0,i.kt)("p",null,"Ok, mari mulai praktikkan skenario di atas. Pertama siapkan project dengan struktur berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 calculation_spec.rs\n \u2502\u2500\u2500\u2500 two_dimensional.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("p",null,"Module ",(0,i.kt)("inlineCode",{parentName:"p"},"calculation_spec")," berisi definisi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area"),". Trait ini punya visibility akses publik, isinya hanya satu buah definisi method header bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate"),". Trait ini nantinya diimplementasikan ke struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan juga ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),", agar nantinya kedua struct tersebut memiliki method ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," yang berguna untuk kalkulasi luas bangun datar 2d."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/calculation_spec.rs"',title:'"src/calculation_spec.rs"'},"pub trait Area {\n fn calculate(&self) -> f64;\n}\n")),(0,i.kt)("p",null,"Kemudian siapkan file ",(0,i.kt)("inlineCode",{parentName:"p"},"two_dimensional"),", isinya dua buah struct: ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),". Pada file yang sama, siapkan juga block kode implementasi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area"),". Dengan ini maka kedua struct tersebut wajib untuk memiliki method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," dengan isi adalah operasi perhitungan aritmatika untuk mencari luas bangun datar."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/two_dimensional.rs"',title:'"src/two_dimensional.rs"'},"pub struct Circle {\n pub radius: i32,\n}\n\nimpl crate::calculation_spec::Area for Circle {\n fn calculate(&self) -> f64 {\n // PI * (r ^ 2)\n // ada operasi casting ke tipe f64 karena self.radius bertipe i32\n 3.14 * (self.radius.pow(2) as f64)\n }\n}\n\npub struct Square {\n pub length: i32,\n}\n\nimpl crate::calculation_spec::Area for Square {\n fn calculate(&self) -> f64 {\n // (s ^ 2)\n // ada operasi casting ke tipe f64 karena self.length bertipe i32\n self.length.pow(2) as f64\n }\n}\n")),(0,i.kt)("p",null,"Bisa dilihat pada kode di atas, deklarasi struct beserta property memiliki visibility publik. Idealnya, saat sturct tersebut digunakan di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," nantinya tidak akan ada error terkait visibility akses."),(0,i.kt)("p",null,"Selanjutnya, pada file ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," siapkan kode yang isinya registrasi module ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_spec")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"two_dimensional"),", juga definisi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," dengan isi statement pembuatan 2 variabel object untuk masing-masing tipe data struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod calculation_spec;\nmod two_dimensional;\n\nuse crate::calculation_spec::Area;\n\nfn main() {\n let circle_one = two_dimensional::Circle{ radius: 10 };\n println!("circle area: {}", circle_one.calculate());\n\n let square_one = two_dimensional::Square{ length: 5 };\n println!("square area: {}", square_one.calculate());\n}\n')),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," milik object bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," diakses untuk kemudian di-print."),(0,i.kt)("p",null,"Coba jalankan program."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(4176).Z,width:"655",height:"756"})),(0,i.kt)("p",null,"Hmm, error. Padahal trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," sudah publik, dan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," & ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," beserta property-nya juga sudah publik. Tapi masih error."),(0,i.kt)("p",null,"Error ini disebabkan oleh trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," yang belum di-import di crate root (main). Meskipun kita tidak mengakses trait tersebut secara langsung (melainkan via method ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," milik struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),"), diharuskan untuk meng-import-nya juga."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Detail error beserta solusi dari error ini sebenarnya bisa dilihat di error message. Bagaimana Rust menginformasikan error sangat luar biasa informatif.")),(0,i.kt)("p",null,"Ok, sekarang ubah isi file ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," menjadi seperti ini, kemudian jalankan ulang program. Hasilnya tidak ada error."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod calculation_spec;\nmod two_dimensional;\n\nuse crate::calculation_spec::Area; // <------- tambahkan statement import module\n\nfn main() {\n let circle_one = two_dimensional::Circle{ radius: 10 };\n println!("circle area: {}", circle_one.calculate());\n\n let square_one = two_dimensional::Square{ length: 5 };\n println!("square area: {}", square_one.calculate());\n}\n')),(0,i.kt)("p",null,"O iya, ada beberapa hal baru pada penerapan kode di atas, berikut adalah pembahasannya:"),(0,i.kt)("h3",{id:"-method-pow-untuk-operasi-pangkat"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"pow")," untuk operasi pangkat"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"pow")," adalah item milik tipe data numerik (",(0,i.kt)("inlineCode",{parentName:"p"},"i8"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"i16"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", ...) yang fungsinya untuk operasi pangkat."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"3.pow(2); // ===> 3 pangkat 2\n8.pow(5); // ===> 8 pangkat 5\n")),(0,i.kt)("h3",{id:"-keyword-as-untuk-casting-tipe-data"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"as")," untuk casting tipe data"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"as")," digunakan untuk casting tipe data. Keyword ini bisa diterapkan pada beberapa jenis tipe data, salah satunya adalah semua tipe data numerik."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"1024 as f32; // ===> 1024 dikonversi ke tipe f32, hasinya adalah 1024.0\n3.14 as i32; // ===> 3.14 dikonversi ke tipe i32, hasinya 3 karena ada pembulatan\n")),(0,i.kt)("h2",{id:"a364-trait-sebagai-tipe-parameter"},"A.36.4. Trait sebagai tipe parameter"),(0,i.kt)("p",null,"Trait bisa digunakan sebagai tipe data parameter sebuah fungsi, contoh notasi penulisannya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result(name: String, item: &impl Area) {\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("p",null,"Manfaat penerapan trait sebagai tipe data parameter fungsi adalah saat pemanggilan fungsi, parameter tersebut bisa diisi dengan argument data bertipe apapun dengan catatan tipe dari data tersebut mengimplementasikan trait yang sama dengan yang digunakan pada parameter."),(0,i.kt)("p",null,"Misalnya, pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_and_print_result")," di atas yang parameter ke-2 bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&impl Area"),", nantinya saat fungsi tersebut dipanggil, kita bisa sisipi parameter ke-2 dengan object ",(0,i.kt)("inlineCode",{parentName:"p"},"circle_one")," ataupun ",(0,i.kt)("inlineCode",{parentName:"p"},"circle_two"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let circle_one = two_dimensional::Circle{ radius: 10 };\ncalculate_and_print_result("circle".to_string(), &circle_one);\n\nlet square_one = two_dimensional::Square{ length: 5 };\ncalculate_and_print_result("square".to_string(), &square_one);\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("inlineCode",{parentName:"p"},"&impl Area")," ini tipe data pointer ya, tipe non-pointer-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Area"),". Di sini digunakan tipe data pointer untuk antisipasi ",(0,i.kt)("em",{parentName:"p"},"move semantics")," pada tipe data custom type (borrowing).")),(0,i.kt)("p",null,"Dimisalkan, fungsi tersebut parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"item"),"-nya bisa menampung beberapa jenis traits, kira-kira apakah bisa dibuat seperti itu? Misalnya ada trait lain bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"Circumference"),", dan parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"item")," milik fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_and_print_result")," harus bisa menampung data baik dari tipe yang implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," ataupun trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Circumference"),"."),(0,i.kt)("p",null,"Hal seperti itu bisa, caranya dengan menggunakan notasi penulisan berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result(name: String, item: &(impl Area + Circumference)) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n')),(0,i.kt)("p",null,"Tambahkan tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"()")," sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"impl NamaTrait"),", lalu ganti ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaTrait")," dengan traits apa saja yang diinginkan dengan separator tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"+"),"."),(0,i.kt)("h2",{id:"a365-trait-bound-syntax"},"A.36.5. Trait bound syntax"),(0,i.kt)("p",null,"Penerapan trait sebagai parameter fungsi juga bisa dituliskan dalam notasi yang memanfaatkan generic. Teknik penulisan ini disebut dengan ",(0,i.kt)("em",{parentName:"p"},"trait bound syntax"),"."),(0,i.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Ada generic bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yang merepresentasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area"),", kemudian pada definisi parameter ke-2 fungsi (yaitu parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"item"),") tipenya menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),". Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&T")," di sini adalah ekuivalen dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"&impl Area"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result2(name: String, item: &T) {\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("p",null,"Dimisalkan jika ada lebih dari satu trait yang digunakan sebagai tipe data paramater (misalnya trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Circumference"),"), maka penulisannya seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result2(name: String, item: &T) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n')),(0,i.kt)("p",null,"Satu tambahan contoh lagi untuk ilustrasi yang lebih kompleks:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn some_function(t: &T, u: &U) -> i32 {\n // ...\n}\n")),(0,i.kt)("p",null,"Pada contoh di atas fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"some_function")," memiliki 2 generics param, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"U"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," merepresentasikan trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Display")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Clone")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"U")," merepresentasikan trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Clone")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Debug"))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai generics dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics"},"Generics"))),(0,i.kt)("h2",{id:"a366-trait-where-clause"},"A.36.6. Trait ",(0,i.kt)("inlineCode",{parentName:"h2"},"where")," clause"),(0,i.kt)("p",null,"Ada lagi alternatif penulisan trait bound syntax, yaitu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"where"),". Contoh pengaplikasiannya bisa dilihat pada kode berikut. Semua definisi fungsi di bawah ini adalah ekuivalen."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result(name: String, item: &(impl Area + Circumference)) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n\nfn calculate_and_print_result2(name: String, item: &T) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n\nfn calculate_and_print_result3(name: String, item: &T) where T: Area + Circumference {\n println!("{} area: {}", name, item.calculate());\n}\n\nfn calculate_and_print_result4(name: String, item: &T)\nwhere\n T: Area + Circumference,\n // ... other generic params if exists\n{\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai generics dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics"},"Generics"))),(0,i.kt)("h2",{id:"a367-trait-sebagai-return-type"},"A.36.7. Trait sebagai return type"),(0,i.kt)("p",null,"Trait bisa juga digunakan sebagai tipe data return value. Caranya gunakan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl NamaTrait")," sebagai tipe data."),(0,i.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Ada dua fungsi baru dideklarasikan:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"new_circle")," dengan return type adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"impl Area"),", dan data yang dikembalikan adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"two_dimensional::Circle"),"."),(0,i.kt)("li",{parentName:"ol"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"new_square")," dengan return type adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"impl Area"),", dan data yang dikembalikan adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"two_dimensional::Square"),".")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let circle_one = new_circle(5);\n calculate_and_print_result4("circle".to_string(), &circle_one);\n\n let square_one = new_square(10);\n calculate_and_print_result4("square".to_string(), &square_one);\n}\n\nfn new_circle(radius: i32) -> impl Area {\n let data = two_dimensional::Circle{\n radius\n };\n data\n}\n\nfn new_square(length: i32) -> impl Area {\n two_dimensional::Square{\n length\n }\n}\n\nfn calculate_and_print_result4(name: String, item: &T)\nwhere\n T: Area,\n{\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("p",null,"Salah satu konsekuensi dalam penerapan trait sebagai return type adalah: tipe data milik nilai yang dikembalikan terdeteksi sebagai tipe trait. Contohnya variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"circle_one")," di atas, tipe data-nya bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),", melainkan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Area"),"."),(0,i.kt)("p",null,"Tipe data aslinya tetap bisa diakses, tapi butuh tambahan effort. Lebih jelasnya dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/trait-conversion-from-into"},"Trait \u279c Conversion (From & Into)"),"."),(0,i.kt)("h2",{id:"a368-associated-types-pada-trait"},"A.36.8. ",(0,i.kt)("em",{parentName:"h2"},"Associated types")," pada trait"),(0,i.kt)("p",null,"Associated types adalah tipe data yang didefinisikan di dalam suatu trait. Associated types tidak tidak memiliki tipe data konkret saat didefinisikan, namun ketika trait di-implementasikan maka tipe tersebut harus ditentukan tipe data konkritnya."),(0,i.kt)("p",null,"Lebih jelas silakan perhatikan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"trait Shape {\n type Area;\n\n fn area(&self) -> Self::Area;\n}\n")),(0,i.kt)("p",null,"Pada definisi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Shape")," di atas, yang disebut dengan associated types adalah tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," yang definisinya berada dalam block trait. Tipe didefinisikan tanpa assignment operator, jadi tidak ada tipe data konkretnya."),(0,i.kt)("p",null,"Associated types ini sering digunakan pada Rust programming. Contoh implementasinya bisa dilihat pada contoh di bawah ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 shape.rs\n \u2502\u2500\u2500\u2500 circle.rs\n \u2502\u2500\u2500\u2500 square.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Disiapkan suatu trait bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"shape::Shape"),".",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Trait ini memiliki satu associated types bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Area"),"."),(0,i.kt)("li",{parentName:"ul"},"Dan memiliki sebuah definisi method header ",(0,i.kt)("inlineCode",{parentName:"li"},"area")," yang gunanya untuk menghitung luas bangun datar (",(0,i.kt)("em",{parentName:"li"},"shape"),")."))),(0,i.kt)("li",{parentName:"ul"},"Disiapkan struct ",(0,i.kt)("inlineCode",{parentName:"li"},"circle::Circle")," yang mengadopsi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"shape::Shape"),"."),(0,i.kt)("li",{parentName:"ul"},"Disiapkan struct ",(0,i.kt)("inlineCode",{parentName:"li"},"square::Square")," yang mengadopsi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"shape::Shape"),".")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/shape.rs"',title:'"src/shape.rs"'},"pub trait Shape {\n type Area;\n\n fn area(&self) -> Self::Area;\n}\n")),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Shape")," di atas spesifikasinya mirip seperti pada contoh sebelumnya, hanya saja kali ini trait-nya di set public agar bisa diakses dari ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," nantinya."),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Shape")," kemudian di-implementasikan ke struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),", kode-nya bisa dilihat berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/circle.rs"',title:'"src/circle.rs"'},"pub struct Circle {\n pub radius: f64,\n}\n\nimpl crate::shape::Shape for Circle {\n type Area = f64;\n\n fn area(&self) -> Self::Area {\n std::f64::consts::PI * self.radius * self.radius\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/square.rs"',title:'"src/square.rs"'},"pub struct Square {\n pub side: i64,\n}\n\nimpl crate::shape::Shape for Square {\n type Area = i64;\n\n fn area(&self) -> Self::Area {\n self.side * self.side\n }\n}\n")),(0,i.kt)("p",null,"Bisa dilihat pada kedua implementasi di atas, associated type ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," diisi dengan tipe concrete, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"f64")," sebagai tipe concrete ",(0,i.kt)("inlineCode",{parentName:"li"},"circle:Circle:Area")),(0,i.kt)("li",{parentName:"ul"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"i64")," sebagai tipe concrete ",(0,i.kt)("inlineCode",{parentName:"li"},"square:Square:Area"))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Contoh di atas adalah cara pengaplikasian associated types.")),(0,i.kt)("p",null,"Lalu pada ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs"),", tipe data struct ",(0,i.kt)("inlineCode",{parentName:"p"},"circle::Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"square::Square")," digunakan untuk membuat variabel baru, yang kemudian dari variabel tersebut, method ",(0,i.kt)("inlineCode",{parentName:"p"},".area()")," milik diakses."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod shape;\nmod circle;\nmod square;\n\nuse crate::shape::Shape;\n\nfn main() {\n let obj1 = circle::Circle{ radius: 10.0 };\n println!("area of circle: {:.2}", obj1.area());\n\n let obj2 = square::Square{ side: 10 };\n println!("area of square: {:}", obj2.area());\n}\n')),(0,i.kt)("p",null,"Silakan jalankan program dan lihat hasilnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(6254).Z,width:"469",height:"130"})),(0,i.kt)("p",null,"O iya, pada ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs"),", module item ",(0,i.kt)("inlineCode",{parentName:"p"},"shape::Shape")," perlu di-import meskipun kita tidak menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"trait")," tersebut secara langsung. Jika tidak di-import, maka method ",(0,i.kt)("inlineCode",{parentName:"p"},".area()")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," tidak bisa diakses."),(0,i.kt)("h2",{id:"a369-attribute-derive"},"A.36.9. Attribute ",(0,i.kt)("inlineCode",{parentName:"h2"},"derive")),(0,i.kt)("p",null,"Ada cara lain untuk mengimplementasikan suatu trait ke dalam tipe data selain dengan menuliskan implementasinya secara eksplist, caranya menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive"),"."),(0,i.kt)("p",null,"Lebih detailnya dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/attributes"},"Attributes"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/traits"},"github.com/novalagung/dasarpemrogramanrust-example/../traits")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang trait bounds untuk implementasi method kondisional"),(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang trait overloading")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch10-02-traits.html"},"https://doc.rust-lang.org/book/ch10-02-traits.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.i32.html"},"https://doc.rust-lang.org/std/primitive.i32.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Display.html"},"https://doc.rust-lang.org/std/fmt/trait.Display.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/string/struct.String.html"},"https://doc.rust-lang.org/std/string/struct.String.html"))))}m.isMDXComponent=!0},2767:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcMAAABtCAIAAABShZ2jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMTM6NDE6NTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjI4OjM4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjI4OjM4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRkNTA5ZmM4LTVhZDUt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"},9856:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-2-7c5e41bf2bd31dba0f78fc7afd81c7ba.png"},4666:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAABzCAIAAAB8e26BAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMTQ6MTA6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjI3OjE0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjI3OjE0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFkOGFmM2Q4LTEwNDIt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"},8738:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-4-fe5c6a716894397c8088bae54e7194f9.png"},4176:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-5-29be804051729f23db8dd64e978e2398.png"},6254:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-6-8165525fc9f8604bf115634eeb974230.png"}}]); \ No newline at end of file diff --git a/assets/js/db8ccf76.f925a746.js b/assets/js/db8ccf76.f925a746.js deleted file mode 100644 index a6c2bd45..00000000 --- a/assets/js/db8ccf76.f925a746.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[4861],{3905:(a,e,t)=>{t.d(e,{Zo:()=>d,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function l(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var s=n.createContext({}),u=function(a){var e=n.useContext(s),t=e;return a&&(t="function"==typeof a?a(e):l(l({},e),a)),t},d=function(a){var e=u(a.components);return n.createElement(s.Provider,{value:e},a.children)},m={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,s=a.parentName,d=p(a,["components","mdxType","originalType","parentName"]),k=u(t),o=i,c=k["".concat(s,".").concat(o)]||k[o]||m[o]||r;return t?n.createElement(c,l(l({ref:e},d),{},{components:t})):n.createElement(c,l({ref:e},d))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,l=new Array(r);l[0]=k;var p={};for(var s in e)hasOwnProperty.call(e,s)&&(p[s]=e[s]);p.originalType=a,p.mdxType="string"==typeof a?a:i,l[1]=p;for(var u=2;u{t.r(e),t.d(e,{assets:()=>s,contentTitle:()=>l,default:()=>m,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:36,title:"A.36. Traits",sidebar_label:"A.36. Traits"},l=void 0,p={unversionedId:"basic/traits",id:"basic/traits",title:"A.36. Traits",description:"Trait jika diartikan dalam bahasa Indonesia artinya adalah sifat. Chapter ini akan membahas tentang apa itu trait, apa kegunaannya, dan bagaimana cara penerapannya di Rust programming.",source:"@site/docs/basic/traits.md",sourceDirName:"basic",slug:"/basic/traits",permalink:"/basic/traits",draft:!1,tags:[],version:"current",sidebarPosition:36,frontMatter:{sidebar_position:36,title:"A.36. Traits",sidebar_label:"A.36. Traits"},sidebar:"tutorialSidebar",previous:{title:"A.35. Borrowing",permalink:"/basic/borrowing"},next:{title:"A.37. Generics",permalink:"/basic/generics"}},s={},u=[{value:"A.36.1. Konsep traits",id:"a361-konsep-traits",level:2},{value:"A.36.2. Implementasi trait",id:"a362-implementasi-trait",level:2},{value:"\u25c9 Struct Circle",id:"-struct-circle",level:3},{value:"\u25c9 Block kode impl X for Y",id:"-block-kode-impl-x-for-y",level:3},{value:"\u25c9 Block kode method dalam impl",id:"-block-kode-method-dalam-impl",level:3},{value:"\u25c9 Macro write",id:"-macro-write",level:3},{value:"\u25c9 Print data menggunakan formatted print {:?}",id:"-print-data-menggunakan-formatted-print-",level:3},{value:"\u25c9 Print data menggunakan formatted print {}",id:"-print-data-menggunakan-formatted-print--1",level:3},{value:"A.36.3. Membuat custom trait",id:"a363-membuat-custom-trait",level:2},{value:"\u25c9 Method pow untuk operasi pangkat",id:"-method-pow-untuk-operasi-pangkat",level:3},{value:"\u25c9 Keyword as untuk casting tipe data",id:"-keyword-as-untuk-casting-tipe-data",level:3},{value:"A.36.4. Trait sebagai tipe parameter",id:"a364-trait-sebagai-tipe-parameter",level:2},{value:"A.36.5. Trait bound syntax",id:"a365-trait-bound-syntax",level:2},{value:"A.36.6. Trait where clause",id:"a366-trait-where-clause",level:2},{value:"A.36.7. Trait sebagai return type",id:"a367-trait-sebagai-return-type",level:2},{value:"A.36.8. Associated types pada trait",id:"a368-associated-types-pada-trait",level:2},{value:"A.36.9. Attribute derive",id:"a369-attribute-derive",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Work in progress",id:"-work-in-progress",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],d={toc:u};function m(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Trait jika diartikan dalam bahasa Indonesia artinya adalah sifat. Chapter ini akan membahas tentang apa itu trait, apa kegunaannya, dan bagaimana cara penerapannya di Rust programming."),(0,i.kt)("p",null,"Pembahasan chapter ini cukup panjang. Makin mendekati akhir pembahasan, makin berat yang dibahas. Penulis anjurkan jika nantinya setelah section ",(0,i.kt)("a",{parentName:"p",href:"/basic/traits#a424-trait-sebagai-tipe-parameter"},"A.36.4. Trait sebagai tipe parameter")," dirasa cukup susah untuk dipahami, silakan lanjut ke chapter berikutnya dulu, dan nanti bisa kembali ke pembahasan chapter ini lagi."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Chapter ini butuh tambahan detail")),(0,i.kt)("h2",{id:"a361-konsep-traits"},"A.36.1. Konsep traits"),(0,i.kt)("p",null,"Di Rust kita bisa mendefinisikan trait/sifat, isinya adalah definisi header method yang bisa di-share ke banyak tipe data."),(0,i.kt)("p",null,"Trait isinya hanya definisi header method (bisa diartikan method tanpa isi). Ketika ada tipe data yang meng-implement suatu trait, maka tipe tersebut wajib untuk menuliskan implementasi method sesuai dengan header method yang ada di trait."),(0,i.kt)("p",null,"Ada dua bagian penting dalam trait yang harus diketahui:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Deklarasi trait"),(0,i.kt)("li",{parentName:"ol"},"Implementasi trait ke tipe data")),(0,i.kt)("p",null,"Perihal point pertama, intinya kita bisa menciptakan trait sesuai kebutuhan. Terlepas dari itu, Rust juga menyediakan cukup banyak traits yang di-implement ke banyak tipe data yang ada di Rust standard library. Beberapa di antaranya:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"std::fmt::Debug"),", digunakan agar data bisa di-print menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"li"},"{:?}"),"."),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"std::iter::Enumerate"),", digunakan agar data bisa di-iterasi menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"li"},"for"),"."),(0,i.kt)("li",{parentName:"ul"},"Trait ",(0,i.kt)("inlineCode",{parentName:"li"},"std::ops::Add"),", di-implementasikan agar data bisa digunakan pada operasi aritmatik penambahan ",(0,i.kt)("inlineCode",{parentName:"li"},"+"),".")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Pada bahasa pemrograman lain, contohnya Java, konsep trait mirip dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"interface"))),(0,i.kt)("p",null,"Ok, biar lebih jelas, mari lanjut pembelajaran menggunakan contoh. Kita mulai dengan pembahasan tentang cara implementasi trait. Contoh yang digunakan adalah implementasi salah satu trait milik Rust standard library, yaitu trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("h2",{id:"a362-implementasi-trait"},"A.36.2. Implementasi trait"),(0,i.kt)("p",null,"Kita pilih trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," milik Rust standard library untuk belajar cara implementasi trait pada tipe data."),(0,i.kt)("p",null,"Kegunaan dari trait ini adalah: jika di-implement ke tipe data tertentu maka data dengan tipe tersebut bisa di-print via macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," atau macro printing lainnya, dengan menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),"."),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," ini diimplementasikan ke pada banyak tipe data yang di Rust standard library, baik itu tipe primitif maupun non-primitif. Contohnya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let number = 12;\nprintln!("{:?}", number);\n\nlet text = String::from("hello");\nprintln!("{:?}", text);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(2767).Z,width:"451",height:"109"})),(0,i.kt)("p",null,"Dua variabel di atas sukses di-print tanpa error, karena tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ",(0,i.kt)("em",{parentName:"p"},"by default")," sudah implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Jika tertarik untuk pengecekan lebih lanjut, silakan lihat di halaman dokumentasi tipe data ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/primitive.i32.html"},"i32")," dan ",(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/string/struct.String.html"},"String"),".")),(0,i.kt)("p",null,"Bagaimana dengan custom type yang kita buat sendiri? Misalnya struct."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let circle_one = Circle{raidus: 6};\n println!("{:?}", circle_one);\n}\n\nstruct Circle {\n raidus: i32,\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(9856).Z,width:"841",height:"512"})),(0,i.kt)("p",null,"Hasilnya error, karena struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," yang dibuat tidak implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug"),"."),(0,i.kt)("p",null,"Solusi agar tidak error adalah dengan mengimplementasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),", dengan itu semua data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," akan bisa di-print menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Selain via implementasi trait, tipe data custom bisa di-print dengan cara menambahkan atribut ",(0,i.kt)("inlineCode",{parentName:"p"},"#[derive(Debug)]")," pada definisi tipe data-nya. Namun kita tidak membahas itu pada chapter ini.")),(0,i.kt)("p",null,"Langkah pertama untuk implementasi trait adalah mencari tau terlebih dahulu spesifikasi trait yang ingin diimplementasikan. Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," adalah traits milik Rust standard library, maka harusnya spesifikasi bisa dilihat di dokumentasi Rust."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html"))),(0,i.kt)("p",null,"Pada URL dokumentasi bisa dilihat kalau trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," memiliki struktur kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"pub trait Debug {\n fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>;\n}\n")),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," mempunyai satu spesifikasi method, bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"fmt")," yang detail strukturnya bisa dilihat di atas."),(0,i.kt)("p",null,"Kita akan implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," ini ke tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),", maka wajib hukumnya untuk menuliskan implementasi method sesuai dengan yang ada di trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug"),"."),(0,i.kt)("p",null,"Di bawah ini adalah contoh cara implementasi trait."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Circle {\n raidus: i32,\n}\n\nimpl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n\nfn main() {\n let circle_one = Circle{raidus: 6};\n println!("{:?}", circle_one);\n}\n')),(0,i.kt)("p",null,"Ketika program di-run, hasilnya sukses tanpa error. Artinya implementasi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," pada tipe data struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," adalah sukses."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(4666).Z,width:"457",height:"115"})),(0,i.kt)("p",null,"Cara implementasi trait ke struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," memang step-nya agak panjang, tapi penulis yakin lama-kelamaan pasti terbiasa. Ok, sekarang kita bahas satu per satu kode di atas."),(0,i.kt)("h3",{id:"-struct-circle"},"\u25c9 Struct ",(0,i.kt)("inlineCode",{parentName:"h3"},"Circle")),(0,i.kt)("p",null,"Block kode definisi struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," cukup straightforward, isinya hanya 1 property bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"radius")," bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("h3",{id:"-block-kode-impl-x-for-y"},"\u25c9 Block kode ",(0,i.kt)("inlineCode",{parentName:"h3"},"impl X for Y")),(0,i.kt)("p",null,"Notasi penulisan implementasi trait adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"impl X for Y"),", dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"X")," adalah trait yang ingin diimplementasikan dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Y")," adalah tipe data tujuan implementasi."),(0,i.kt)("p",null,"Pada contoh di atas, trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," diimplementasikan ke custom type struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),". Maka statement-nya adalah:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl std::fmt::Debug for Circle {\n // ...\n}\n")),(0,i.kt)("h3",{id:"-block-kode-method-dalam-impl"},"\u25c9 Block kode method dalam ",(0,i.kt)("inlineCode",{parentName:"h3"},"impl")),(0,i.kt)("p",null,"Block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," harus diikuti dengan implementasi method. Pada contoh ini, method ",(0,i.kt)("inlineCode",{parentName:"p"},"fmt")," milik trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Debug")," wajib untuk diimplementasikan. Spesifikasi method ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>")," (lebih jelasnya silakan lihat dokumentasi)."),(0,i.kt)("p",null,"Silakan copy method tersebut kemudian paste ke dalam block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl")," yang sudah ditulis, kemudian tambahkan block kurung kurawal."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"impl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n // ...\n }\n}\n")),(0,i.kt)("p",null,"Kemudian tulis implementasi method ",(0,i.kt)("inlineCode",{parentName:"p"},"fmt")," dalam block method. Tulis statement macro ",(0,i.kt)("inlineCode",{parentName:"p"},"write")," untuk data string (yang ingin di-print) dengan tujuan adalah variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"f"),"."),(0,i.kt)("p",null,"Di contoh, format ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle radius: {}")," digunakan. Dengan ini nantinya saat printing data, yang muncul adalah text ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle radius: {}"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'impl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tips untuk pengguna visual studio code dengan rust-analyzer extension ter-install, setelah selesai menulis block kode ",(0,i.kt)("inlineCode",{parentName:"p"},"impl"),", cukup jalankan ",(0,i.kt)("inlineCode",{parentName:"p"},"ctrl+space")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"cmd+space")," untuk men-trigger autocomplete suggestion. Kemudian klik opsi method yang ada disitu, maka kode implementasi method langsung muncul dengan sendirinya.")),(0,i.kt)("h3",{id:"-macro-write"},"\u25c9 Macro ",(0,i.kt)("inlineCode",{parentName:"h3"},"write")),(0,i.kt)("p",null,"Macro ini digunakan untuk menuliskan sebuah data ke object tertentu. Pada contoh kita gunakan untuk menulis string ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle radius: {}")," ke variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"f")," yang bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Formatter<'_>"),"."),(0,i.kt)("p",null,"Notasi penulisan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"write"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'// notasi penulisan\nwrite!(variabel_tujuan, data_yang_ingin_di_print, arg1, arg2, ...);\n\n// contoh penerapan\nwrite!(f, "Circle radius: {}", self.raidus);\n')),(0,i.kt)("h3",{id:"-print-data-menggunakan-formatted-print-"},"\u25c9 Print data menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{:?}")),(0,i.kt)("p",null,"Step terakhir adalah print variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"circle")," menggunakan macro ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Hasilnya sukses, tidak error seperti sebelumnya."),(0,i.kt)("h3",{id:"-print-data-menggunakan-formatted-print--1"},"\u25c9 Print data menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"h3"},"{}")),(0,i.kt)("p",null,"Coba tambahkan statement ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),", tetapi kali ini gunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{}"),", apakah hasilnya juga tidak error?"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(8738).Z,width:"849",height:"309"})),(0,i.kt)("p",null,"Hasilnya error, karena trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Debug")," hanya berguna untuk formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{:?}"),". Agar data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," bisa di-print menggunakan formatted print ",(0,i.kt)("inlineCode",{parentName:"p"},"{}")," maka trait ",(0,i.kt)("inlineCode",{parentName:"p"},"std::fmt::Display")," harus di-implementasikan juga."),(0,i.kt)("p",null,"Ubah kode dengan menambahkan implementasi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Display"),". Hasilnya kurang lebih seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'struct Circle {\n raidus: i32,\n}\n\nimpl std::fmt::Debug for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n\nimpl std::fmt::Display for Circle {\n fn fmt(&self, f: &mut std::fmt::Formatter<\'_>) -> std::fmt::Result {\n write!(f, "Circle radius: {}", self.raidus)\n }\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Link dokumentasi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Debug")," ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html")),(0,i.kt)("li",{parentName:"ul"},"Link dokumentasi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Display")," ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Display.html"},"https://doc.rust-lang.org/std/fmt/trait.Display.html")))),(0,i.kt)("h2",{id:"a363-membuat-custom-trait"},"A.36.3. Membuat custom trait"),(0,i.kt)("p",null,"Pada section di atas kita telah membahas bagaimana cara implementasi traits ke tipe data. Pada bagian ini kita akan belajar tentang cara membuat definisi trait (membuat custom trait)."),(0,i.kt)("p",null,"Masih sama dengan metode sebelumnya, pembelajaran dilakukan dengan praktik. Kita gunakan skenario praktik berikut pada program selanjutnya:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Buat struct bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Circle"),"."),(0,i.kt)("li",{parentName:"ol"},"Buat struct bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Square"),"."),(0,i.kt)("li",{parentName:"ol"},"Buat trait bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Area")," dengan isi satu buah method untuk menghitung luas bangun datar (",(0,i.kt)("inlineCode",{parentName:"li"},"calculate"),")."),(0,i.kt)("li",{parentName:"ol"},"Implementasikan trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Area")," ke dua struct tersebut.")),(0,i.kt)("p",null,"Ok, mari mulai praktikkan skenario di atas. Pertama siapkan project dengan struktur berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 calculation_spec.rs\n \u2502\u2500\u2500\u2500 two_dimensional.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("p",null,"Module ",(0,i.kt)("inlineCode",{parentName:"p"},"calculation_spec")," berisi definisi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area"),". Trait ini punya visibility akses publik, isinya hanya satu buah definisi method header bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate"),". Trait ini nantinya diimplementasikan ke struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan juga ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),", agar nantinya kedua struct tersebut memiliki method ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," yang berguna untuk kalkulasi luas bangun datar 2d."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/calculation_spec.rs"',title:'"src/calculation_spec.rs"'},"pub trait Area {\n fn calculate(&self) -> f64;\n}\n")),(0,i.kt)("p",null,"Kemudian siapkan file ",(0,i.kt)("inlineCode",{parentName:"p"},"two_dimensional"),", isinya dua buah struct: ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),". Pada file yang sama, siapkan juga block kode implementasi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area"),". Dengan ini maka kedua struct tersebut wajib untuk memiliki method bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," dengan isi adalah operasi perhitungan aritmatika untuk mencari luas bangun datar."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/two_dimensional.rs"',title:'"src/two_dimensional.rs"'},"pub struct Circle {\n pub radius: i32,\n}\n\nimpl crate::calculation_spec::Area for Circle {\n fn calculate(&self) -> f64 {\n // PI * (r ^ 2)\n // ada operasi casting ke tipe f64 karena self.radius bertipe i32\n 3.14 * (self.radius.pow(2) as f64)\n }\n}\n\npub struct Square {\n pub length: i32,\n}\n\nimpl crate::calculation_spec::Area for Square {\n fn calculate(&self) -> f64 {\n // (s ^ 2)\n // ada operasi casting ke tipe f64 karena self.length bertipe i32\n self.length.pow(2) as f64\n }\n}\n")),(0,i.kt)("p",null,"Bisa dilihat pada kode di atas, deklarasi struct beserta property memiliki visibility publik. Idealnya, saat sturct tersebut digunakan di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," nantinya tidak akan ada error terkait visibility akses."),(0,i.kt)("p",null,"Selanjutnya, pada file ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," siapkan kode yang isinya registrasi module ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_spec")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"two_dimensional"),", juga definisi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," dengan isi statement pembuatan 2 variabel object untuk masing-masing tipe data struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod calculation_spec;\nmod two_dimensional;\n\nuse crate::calculation_spec::Area;\n\nfn main() {\n let circle_one = two_dimensional::Circle{ radius: 10 };\n println!("circle area: {}", circle_one.calculate());\n\n let square_one = two_dimensional::Square{ length: 5 };\n println!("square area: {}", square_one.calculate());\n}\n')),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," milik object bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," diakses untuk kemudian di-print."),(0,i.kt)("p",null,"Coba jalankan program."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(4176).Z,width:"655",height:"756"})),(0,i.kt)("p",null,"Hmm, error. Padahal trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," sudah publik, dan struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," & ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," beserta property-nya juga sudah publik. Tapi masih error."),(0,i.kt)("p",null,"Error ini disebabkan oleh trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," yang belum di-import di crate root (main). Meskipun kita tidak mengakses trait tersebut secara langsung (melainkan via method ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate")," milik struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),"), diharuskan untuk meng-import-nya juga."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Detail error beserta solusi dari error ini sebenarnya bisa dilihat di error message. Bagaimana Rust menginformasikan error sangat luar biasa informatif.")),(0,i.kt)("p",null,"Ok, sekarang ubah isi file ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," menjadi seperti ini, kemudian jalankan ulang program. Hasilnya tidak ada error."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod calculation_spec;\nmod two_dimensional;\n\nuse crate::calculation_spec::Area; // <------- tambahkan statement import module\n\nfn main() {\n let circle_one = two_dimensional::Circle{ radius: 10 };\n println!("circle area: {}", circle_one.calculate());\n\n let square_one = two_dimensional::Square{ length: 5 };\n println!("square area: {}", square_one.calculate());\n}\n')),(0,i.kt)("p",null,"O iya, ada beberapa hal baru pada penerapan kode di atas, berikut adalah pembahasannya:"),(0,i.kt)("h3",{id:"-method-pow-untuk-operasi-pangkat"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"pow")," untuk operasi pangkat"),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"pow")," adalah item milik tipe data numerik (",(0,i.kt)("inlineCode",{parentName:"p"},"i8"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"i16"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", ...) yang fungsinya untuk operasi pangkat."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"3.pow(2); // ===> 3 pangkat 2\n8.pow(5); // ===> 8 pangkat 5\n")),(0,i.kt)("h3",{id:"-keyword-as-untuk-casting-tipe-data"},"\u25c9 Keyword ",(0,i.kt)("inlineCode",{parentName:"h3"},"as")," untuk casting tipe data"),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"as")," digunakan untuk casting tipe data. Keyword ini bisa diterapkan pada beberapa jenis tipe data, salah satunya adalah semua tipe data numerik."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"1024 as f32; // ===> 1024 dikonversi ke tipe f32, hasinya adalah 1024.0\n3.14 as i32; // ===> 3.14 dikonversi ke tipe i32, hasinya 3 karena ada pembulatan\n")),(0,i.kt)("h2",{id:"a364-trait-sebagai-tipe-parameter"},"A.36.4. Trait sebagai tipe parameter"),(0,i.kt)("p",null,"Trait bisa digunakan sebagai tipe data parameter sebuah fungsi, contoh notasi penulisannya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result(name: String, item: &impl Area) {\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("p",null,"Manfaat penerapan trait sebagai tipe data parameter fungsi adalah saat pemanggilan fungsi, parameter tersebut bisa diisi dengan argument data bertipe apapun dengan catatan tipe dari data tersebut mengimplementasikan trait yang sama dengan yang digunakan pada parameter."),(0,i.kt)("p",null,"Misalnya, pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_and_print_result")," di atas yang parameter ke-2 bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&impl Area"),", nantinya saat fungsi tersebut dipanggil, kita bisa sisipi parameter ke-2 dengan object ",(0,i.kt)("inlineCode",{parentName:"p"},"circle_one")," ataupun ",(0,i.kt)("inlineCode",{parentName:"p"},"circle_two"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let circle_one = two_dimensional::Circle{ radius: 10 };\ncalculate_and_print_result("circle".to_string(), &circle_one);\n\nlet square_one = two_dimensional::Square{ length: 5 };\ncalculate_and_print_result("square".to_string(), &square_one);\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},(0,i.kt)("inlineCode",{parentName:"p"},"&impl Area")," ini tipe data pointer ya, tipe non-pointer-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Area"),". Di sini digunakan tipe data pointer untuk antisipasi ",(0,i.kt)("em",{parentName:"p"},"move semantics")," pada tipe data custom type (borrowing).")),(0,i.kt)("p",null,"Dimisalkan, fungsi tersebut parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"item"),"-nya bisa menampung beberapa jenis traits, kira-kira apakah bisa dibuat seperti itu? Misalnya ada trait lain bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"Circumference"),", dan parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"item")," milik fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"calculate_and_print_result")," harus bisa menampung data baik dari tipe yang implement trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," ataupun trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Circumference"),"."),(0,i.kt)("p",null,"Hal seperti itu bisa, caranya dengan menggunakan notasi penulisan berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result(name: String, item: &(impl Area + Circumference)) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n')),(0,i.kt)("p",null,"Tambahkan tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"()")," sebelum ",(0,i.kt)("inlineCode",{parentName:"p"},"impl NamaTrait"),", lalu ganti ",(0,i.kt)("inlineCode",{parentName:"p"},"NamaTrait")," dengan traits apa saja yang diinginkan dengan separator tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"+"),"."),(0,i.kt)("h2",{id:"a365-trait-bound-syntax"},"A.36.5. Trait bound syntax"),(0,i.kt)("p",null,"Penerapan trait sebagai parameter fungsi juga bisa dituliskan dalam notasi yang memanfaatkan generic. Teknik penulisan ini disebut dengan ",(0,i.kt)("em",{parentName:"p"},"trait bound syntax"),"."),(0,i.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Ada generic bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," yang merepresentasikan trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area"),", kemudian pada definisi parameter ke-2 fungsi (yaitu parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"item"),") tipenya menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&T"),". Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"&T")," di sini adalah ekuivalen dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"&impl Area"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result2(name: String, item: &T) {\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("p",null,"Dimisalkan jika ada lebih dari satu trait yang digunakan sebagai tipe data paramater (misalnya trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Circumference"),"), maka penulisannya seperti ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result2(name: String, item: &T) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n')),(0,i.kt)("p",null,"Satu tambahan contoh lagi untuk ilustrasi yang lebih kompleks:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"fn some_function(t: &T, u: &U) -> i32 {\n // ...\n}\n")),(0,i.kt)("p",null,"Pada contoh di atas fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"some_function")," memiliki 2 generics param, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"U"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," merepresentasikan trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Display")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Clone")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"U")," merepresentasikan trait ",(0,i.kt)("inlineCode",{parentName:"li"},"Clone")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Debug"))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai generics dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics"},"Generics"))),(0,i.kt)("h2",{id:"a366-trait-where-clause"},"A.36.6. Trait ",(0,i.kt)("inlineCode",{parentName:"h2"},"where")," clause"),(0,i.kt)("p",null,"Ada lagi alternatif penulisan trait bound syntax, yaitu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"where"),". Contoh pengaplikasiannya bisa dilihat pada kode berikut. Semua definisi fungsi di bawah ini adalah ekuivalen."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn calculate_and_print_result(name: String, item: &(impl Area + Circumference)) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n\nfn calculate_and_print_result2(name: String, item: &T) {\n println!("{} area: {}", name, item.calculate());\n println!("{} circumference: {}", name, item.calculateCircumference());\n}\n\nfn calculate_and_print_result3(name: String, item: &T) where T: Area + Circumference {\n println!("{} area: {}", name, item.calculate());\n}\n\nfn calculate_and_print_result4(name: String, item: &T)\nwhere\n T: Area + Circumference,\n // ... other generic params if exists\n{\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai generics dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/generics"},"Generics"))),(0,i.kt)("h2",{id:"a367-trait-sebagai-return-type"},"A.36.7. Trait sebagai return type"),(0,i.kt)("p",null,"Trait bisa juga digunakan sebagai tipe data return value. Caranya gunakan notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl NamaTrait")," sebagai tipe data."),(0,i.kt)("p",null,"Contohnya bisa dilihat pada kode berikut. Ada dua fungsi baru dideklarasikan:"),(0,i.kt)("ol",null,(0,i.kt)("li",{parentName:"ol"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"new_circle")," dengan return type adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"impl Area"),", dan data yang dikembalikan adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"two_dimensional::Circle"),"."),(0,i.kt)("li",{parentName:"ol"},"Fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"new_square")," dengan return type adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"impl Area"),", dan data yang dikembalikan adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"li"},"two_dimensional::Square"),".")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let circle_one = new_circle(5);\n calculate_and_print_result4("circle".to_string(), &circle_one);\n\n let square_one = new_square(10);\n calculate_and_print_result4("square".to_string(), &square_one);\n}\n\nfn new_circle(radius: i32) -> impl Area {\n let data = two_dimensional::Circle{\n radius\n };\n data\n}\n\nfn new_square(length: i32) -> impl Area {\n two_dimensional::Square{\n length\n }\n}\n\nfn calculate_and_print_result4(name: String, item: &T)\nwhere\n T: Area,\n{\n println!("{} area: {}", name, item.calculate());\n}\n')),(0,i.kt)("p",null,"Salah satu konsekuensi dalam penerapan trait sebagai return type adalah: tipe data milik nilai yang dikembalikan terdeteksi sebagai tipe trait. Contohnya variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"circle_one")," di atas, tipe data-nya bukan ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle"),", melainkan ",(0,i.kt)("inlineCode",{parentName:"p"},"impl Area"),"."),(0,i.kt)("p",null,"Tipe data aslinya tetap bisa diakses, tapi butuh tambahan effort. Lebih jelasnya dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/trait-conversion-from-into"},"Trait \u279c Conversion (From & Into)"),"."),(0,i.kt)("h2",{id:"a368-associated-types-pada-trait"},"A.36.8. ",(0,i.kt)("em",{parentName:"h2"},"Associated types")," pada trait"),(0,i.kt)("p",null,"Associated types adalah tipe data yang didefinisikan didalam suatu trait. Associated types tidak tidak memiliki tipe data konkret saat didefinisikan, namun ketika trait di-implementasikan maka tipe tersebut harus ditentukan tipe data konkritnya."),(0,i.kt)("p",null,"Lebih jelas silakan perhatikan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"trait Shape {\n type Area;\n\n fn area(&self) -> Self::Area;\n}\n")),(0,i.kt)("p",null,"Pada definisi trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Shape")," di atas, yang disebut dengan associated types adalah tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," yang definisinya berada dalam block trait. Tipe didefinisikan tanpa assignment operator, jadi tidak ada tipe data konkretnya."),(0,i.kt)("p",null,"Associated types ini sering digunakan pada Rust programming. Contoh implementasinya bisa dilihat pada contoh di bawah ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-bash",metastring:'title="package source code structure"',title:'"package',source:!0,code:!0,'structure"':!0},"my_package\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 shape.rs\n \u2502\u2500\u2500\u2500 circle.rs\n \u2502\u2500\u2500\u2500 square.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Disiapkan suatu trait bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"shape::Shape"),".",(0,i.kt)("ul",{parentName:"li"},(0,i.kt)("li",{parentName:"ul"},"Trait ini memiliki satu associated types bernama ",(0,i.kt)("inlineCode",{parentName:"li"},"Area"),"."),(0,i.kt)("li",{parentName:"ul"},"Dan memiliki sebuah definisi method header ",(0,i.kt)("inlineCode",{parentName:"li"},"area")," yang gunanya untuk menghitung luas bangun datar (",(0,i.kt)("em",{parentName:"li"},"shape"),")."))),(0,i.kt)("li",{parentName:"ul"},"Disiapkan struct ",(0,i.kt)("inlineCode",{parentName:"li"},"circle::Circle")," yang mengadopsi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"shape::Shape"),"."),(0,i.kt)("li",{parentName:"ul"},"Disiapkan struct ",(0,i.kt)("inlineCode",{parentName:"li"},"square::Square")," yang mengadopsi trait ",(0,i.kt)("inlineCode",{parentName:"li"},"shape::Shape"),".")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/shape.rs"',title:'"src/shape.rs"'},"pub trait Shape {\n type Area;\n\n fn area(&self) -> Self::Area;\n}\n")),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Shape")," di atas spesifikasinya mirip seperti pada contoh sebelumnya, hanya saja kali ini trait-nya di set public agar bisa diakses dari ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs")," nantinya."),(0,i.kt)("p",null,"Trait ",(0,i.kt)("inlineCode",{parentName:"p"},"Shape")," kemudian di-implementasikan ke struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square"),", kode-nya bisa dilihat berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/circle.rs"',title:'"src/circle.rs"'},"pub struct Circle {\n pub radius: f64,\n}\n\nimpl crate::shape::Shape for Circle {\n type Area = f64;\n\n fn area(&self) -> Self::Area {\n std::f64::consts::PI * self.radius * self.radius\n }\n}\n")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/square.rs"',title:'"src/square.rs"'},"pub struct Square {\n pub side: i64,\n}\n\nimpl crate::shape::Shape for Square {\n type Area = i64;\n\n fn area(&self) -> Self::Area {\n self.side * self.side\n }\n}\n")),(0,i.kt)("p",null,"Bisa dilihat pada kedua implementasi di atas, associated type ",(0,i.kt)("inlineCode",{parentName:"p"},"Area")," diisi dengan tipe concrete, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"f64")," sebagai tipe concrete ",(0,i.kt)("inlineCode",{parentName:"li"},"circle:Circle:Area")),(0,i.kt)("li",{parentName:"ul"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"li"},"i64")," sebagai tipe concrete ",(0,i.kt)("inlineCode",{parentName:"li"},"square:Square:Area"))),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Contoh di atas adalah cara pengaplikasian associated types.")),(0,i.kt)("p",null,"Lalu pada ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs"),", tipe data struct ",(0,i.kt)("inlineCode",{parentName:"p"},"circle::Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"square::Square")," digunakan untuk membuat variabel baru, yang kemudian dari variabel tersebut, method ",(0,i.kt)("inlineCode",{parentName:"p"},".area()")," milik diakses."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},'mod shape;\nmod circle;\nmod square;\n\nuse crate::shape::Shape;\n\nfn main() {\n let obj1 = circle::Circle{ radius: 10.0 };\n println!("area of circle: {:.2}", obj1.area());\n\n let obj2 = square::Square{ side: 10 };\n println!("area of square: {:}", obj2.area());\n}\n')),(0,i.kt)("p",null,"Silakan jalankan program dan lihat hasilnya."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Trait",src:t(6254).Z,width:"469",height:"130"})),(0,i.kt)("p",null,"O iya, pada ",(0,i.kt)("inlineCode",{parentName:"p"},"main.rs"),", module item ",(0,i.kt)("inlineCode",{parentName:"p"},"shape::Shape")," perlu di-import meskipun kita tidak menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"trait")," tersebut secara langsung. Jika tidak di-import, maka method ",(0,i.kt)("inlineCode",{parentName:"p"},".area()")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Circle")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Square")," tidak bisa diakses."),(0,i.kt)("h2",{id:"a369-attribute-derive"},"A.36.9. Attribute ",(0,i.kt)("inlineCode",{parentName:"h2"},"derive")),(0,i.kt)("p",null,"Ada cara lain untuk mengimplementasikan suatu trait ke dalam tipe data selain dengan menuliskan implementasinya secara eksplist, caranya menggunakan attribute ",(0,i.kt)("inlineCode",{parentName:"p"},"derive"),"."),(0,i.kt)("p",null,"Lebih detailnya dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/attributes"},"Attributes"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/traits"},"github.com/novalagung/dasarpemrogramanrust-example/../traits")),(0,i.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang trait bounds untuk implementasi method kondisional"),(0,i.kt)("li",{parentName:"ul"},"Pembahasan tentang trait overloading")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch10-02-traits.html"},"https://doc.rust-lang.org/book/ch10-02-traits.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/primitive.i32.html"},"https://doc.rust-lang.org/std/primitive.i32.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Debug.html"},"https://doc.rust-lang.org/std/fmt/trait.Debug.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/fmt/trait.Display.html"},"https://doc.rust-lang.org/std/fmt/trait.Display.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/string/struct.String.html"},"https://doc.rust-lang.org/std/string/struct.String.html"))))}m.isMDXComponent=!0},2767:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcMAAABtCAIAAABShZ2jAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMTM6NDE6NTArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjI4OjM4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjI4OjM4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmRkNTA5ZmM4LTVhZDUt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"},9856:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-2-7c5e41bf2bd31dba0f78fc7afd81c7ba.png"},4666:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAckAAABzCAIAAAB8e26BAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTFUMTQ6MTA6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjI3OjE0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjI3OjE0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjFkOGFmM2Q4LTEwNDIt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"},8738:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-4-fe5c6a716894397c8088bae54e7194f9.png"},4176:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-5-29be804051729f23db8dd64e978e2398.png"},6254:(a,e,t)=>{t.d(e,{Z:()=>n});const n=t.p+"assets/images/traits-6-8165525fc9f8604bf115634eeb974230.png"}}]); \ No newline at end of file diff --git a/assets/js/e4904969.2c9c10d1.js b/assets/js/e4904969.2c9c10d1.js deleted file mode 100644 index c0d7f6a9..00000000 --- a/assets/js/e4904969.2c9c10d1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8732],{3905:(e,a,n)=>{n.d(a,{Zo:()=>m,kt:()=>s});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function r(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var d=t.createContext({}),o=function(e){var a=t.useContext(d),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},m=function(e){var a=o(e.components);return t.createElement(d.Provider,{value:a},e.children)},u={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},k=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,l=e.originalType,d=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),k=o(n),s=i,c=k["".concat(d,".").concat(s)]||k[s]||u[s]||l;return n?t.createElement(c,r(r({ref:a},m),{},{components:n})):t.createElement(c,r({ref:a},m))}));function s(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var l=n.length,r=new Array(l);r[0]=k;var p={};for(var d in a)hasOwnProperty.call(a,d)&&(p[d]=a[d]);p.originalType=e,p.mdxType="string"==typeof e?e:i,r[1]=p;for(var o=2;o{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:38,title:"A.38. Tipe Data \u279c Option",sidebar_label:"A.38. Tipe Data \u279c Option"},r=void 0,p={unversionedId:"basic/option-type",id:"basic/option-type",title:"A.38. Tipe Data \u279c Option",description:"Option adalah salah satu tipe data penting pada Rust programming, digunakan untuk menampung data yang isinya bisa berpotensi kosong (None). Chapter ini membahas tentang tipe data tersebut.",source:"@site/docs/basic/option-type.md",sourceDirName:"basic",slug:"/basic/option-type",permalink:"/basic/option-type",draft:!1,tags:[],version:"current",sidebarPosition:38,frontMatter:{sidebar_position:38,title:"A.38. Tipe Data \u279c Option",sidebar_label:"A.38. Tipe Data \u279c Option"},sidebar:"tutorialSidebar",previous:{title:"A.37. Generics",permalink:"/basic/generics"},next:{title:"A.39. Tipe Data \u279c Result",permalink:"/basic/result-type"}},d={},o=[{value:"A.38.1. Konsep Option",id:"a381-konsep-option",level:2},{value:"A.38.2. Pattern matching pada tipe Option",id:"a382-pattern-matching-pada-tipe-option",level:2},{value:"\u25c9 Tips pattern matching",id:"-tips-pattern-matching",level:3},{value:"A.38.3. Method tipe data Option",id:"a383-method-tipe-data-option",level:2},{value:"\u25c9 Method unwrap",id:"-method-unwrap",level:3},{value:"\u25c9 Method is_some & is_none",id:"-method-is_some--is_none",level:3},{value:"\u25c9 Method unwrap_or_default",id:"-method-unwrap_or_default",level:3},{value:"\u25c9 Method unwrap_or",id:"-method-unwrap_or",level:3},{value:"\u25c9 Method unwrap_or_else",id:"-method-unwrap_or_else",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:o};function u(e){let{components:a,...l}=e;return(0,i.kt)("wrapper",(0,t.Z)({},m,l,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Option")," adalah salah satu tipe data penting pada Rust programming, digunakan untuk menampung data yang isinya bisa berpotensi kosong (",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"). Chapter ini membahas tentang tipe data tersebut."),(0,i.kt)("h2",{id:"a381-konsep-option"},"A.38.1. Konsep ",(0,i.kt)("inlineCode",{parentName:"h2"},"Option")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," adalah enum dengan isi 2 buah enum value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Option::Some")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"Some"),"), digunakan untuk menandai bahwa data memiliki value/nilai."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Option::None")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"None"),"), digunakan untuk menandai bawah data adalah tidak ada nilainya.")),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"None")," bisa disamakan dengan nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"null")," atau ",(0,i.kt)("inlineCode",{parentName:"li"},"nil")," pada bahasa pemrograman lain."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," merupakan parameter generic. Lebih jelasnya mengenai generic dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics"),"."))),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," memiliki notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data sebenarnya yang dibungkus oleh enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),"."),(0,i.kt)("p",null,"Berikut adalah contoh cara penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn divider(a: i32, b: i32) -> Option {\n if b == 0 {\n return None;\n }\n\n let result = a / b;\n return Some(result);\n}\n\nfn main() {\n let result1 = divider(10, 5);\n println!("result: {:?}", result1);\n\n let result2: Option = divider(10, 0);\n println!("result: {:?}", result2);\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," di atas tugasnya adalah melakukan operasi aritmatika pembagian angka numerik ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"a")," dibagi ",(0,i.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,i.kt)("p",null,"Pada fungsi tersebut terdapat pengecekan apabila nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", maka yang dikembalikan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", selainnya maka hasil operasi pembagian dikembalikan dibungkus dalam enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),". Bisa dilihat pada statement return value fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider"),", nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," dibungkus menggunakan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),"."),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),". Dari tipe data yang digunakan nantinya bisa diprediksi pasti akan ada 2 potensi value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Return value adalah enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"None"),", muncul ketika nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"0")),(0,i.kt)("li",{parentName:"ul"},"Return value adalah nilai hasil numerik yang dibungkus oleh enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"Some"))),(0,i.kt)("p",null,"Output program di atas saat di-run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(1384).Z,width:"450",height:"127"})),(0,i.kt)("h2",{id:"a382-pattern-matching-pada-tipe-option"},"A.38.2. Pattern matching pada tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Option")),(0,i.kt)("p",null,"Dalam penerapannya, ketika ada data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," artinya data tersebut berpotensi untuk berisi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),", pasti antara 2 nilai tersebut."),(0,i.kt)("p",null,"Umumnya penggunaan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," selalu diikuti dengan seleksi kondisi. Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," bisa digunakan dalam seleksi kondisi, namun dalam Praktiknya lebih baik menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," karena memberikan kemudahan dalam pengaksesan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Some")," (dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah data yang kita cari dibungkus dalam enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),")."),(0,i.kt)("p",null,"Mari kita praktikkan. Ubah isi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," dengan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\nmatch result1 {\n None => println!("cannot divide by 0"),\n Some(x) => println!("result: {x}"),\n}\n\nlet result2 = divider(10, 0);\nmatch result2 {\n None => println!("cannot divide by 0"),\n Some(x) => {\n println!("result: {}", x)\n },\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(4890).Z,width:"446",height:"124"})),(0,i.kt)("p",null,"Bisa dilihat cara mengambil nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dari enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some")," cukup mudah dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),". Penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk seleksi kondisi biasa disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"pattern matching")," dan teknik ini sangat fleksibel dan advance."),(0,i.kt)("p",null,"Sebagai contoh, dengan penerapan match yang seperti ini kita bisa meng-handle 3 skenario seleksi kondisi:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\nmatch result1 {\n None => println!("cannot divide by 0"),\n Some(2) => println!("the result is 2"),\n Some(x) => println!("result: {x}"),\n}\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-1: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"None"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"cannot divide by 0")),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-2: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"2"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"the result is 2")),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-1: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Some")," selain dari ",(0,i.kt)("inlineCode",{parentName:"li"},"None")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Some(2)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"result: {x}"))),(0,i.kt)("h3",{id:"-tips-pattern-matching"},"\u25c9 Tips pattern matching"),(0,i.kt)("p",null,"Silakan perhatikan kode yang sudah kita praktikkan berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10, 5);\nmatch result {\n None => println!("cannot divide by 0"),\n Some(x) => println!("result: {x}"),\n}\n')),(0,i.kt)("p",null,"Penerapan pattern matching seperti contoh di atas memiliki konsekuensi, yaitu variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," hanya bisa diakses pada block ",(0,i.kt)("inlineCode",{parentName:"p"},"Some(x)")," saja."),(0,i.kt)("p",null,"Adakalanya kita butuh untuk mengeluarkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," ke luar block. Hal seperti ini mudah untuk dilakukan, dan ada beberapa cara yang bisa dipilih, namun menurut penulis yang paling elegan adalah cara berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result = match divider(10, 5) {\n None => {\n println!("cannot divide by 0");\n 0\n },\n Some(x) => x,\n };\n\n println!("result: {:?}", result);\n}\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10, 5)")," mengembalikan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),". Data tersebut digunakan pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," seperti biasa. Namun pada contoh di atas ada yang berbeda, yaitu return value dari statement ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," ditampung ke variabel (",(0,i.kt)("inlineCode",{parentName:"p"},"result"),")."),(0,i.kt)("p",null,"Isi dari pattern matching ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," sendiri ada dua:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"None")," match, pesan error di-print kemudian nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"0")," dijadikan return statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),"."),(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"Some")," match, data ",(0,i.kt)("inlineCode",{parentName:"li"},"x")," dijadikan return value statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),".")),(0,i.kt)("p",null,"Dengan penerapan pattern matching seperti di atas, maka variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," akan selalu berisi data hasil operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10, 5)"),". Dengan pengecualian ketika ada error, pesan errornya dimunculkan kemudian hasil operasi pembagian di-set sebagai ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai pattern matching dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h2",{id:"a383-method-tipe-data-option"},"A.38.3. Method tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Option")),(0,i.kt)("h3",{id:"-method-unwrap"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap")),(0,i.kt)("p",null,"Isi dari enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some")," bisa diakses tanpa menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," dengan cara memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\nif result1 != None {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n')),(0,i.kt)("p",null,"Penggunaan method tersebut sangat dianjurkan diiringi dengan seleksi kondisi untuk memastikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," tidak berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),". Jika data ternyata adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," dan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," diakses, hasilnya adalah panic error. Contohnya bisa dilihat pada gambar berikut:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(5499).Z,width:"659",height:"262"})),(0,i.kt)("p",null,"Selain method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," ada beberapa method sejenis lainnya yang bisa dimanfaatkan untuk pengambilan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),". Kita akan bahas satu per satu."),(0,i.kt)("h3",{id:"-method-is_some--is_none"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_some")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_none")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_some")," menghasilkan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," jika data isinya adalah enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),". Sedangkan ",(0,i.kt)("inlineCode",{parentName:"p"},"is_none")," bernilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," jika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,i.kt)("p",null,"Contoh penerapannya bisa dilihat pada program berikut. Kesemua seleksi kondisi pada konteks ini menghasilkan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\n\nif result1 != None {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n\nif result1.is_some() {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n\nif !result1.is_none() {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n')),(0,i.kt)("h3",{id:"-method-unwrap_or_default"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_default")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_default")," mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),". Jika data ternyata isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", maka nilai yang dikembalikan adalah ",(0,i.kt)("em",{parentName:"p"},"default value")," dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("p",null,"Sebagai contoh, pada kode berikut statement ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10, 0)")," return type-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),", sedangkan return value-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),". Pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_default")," menghasilkan ",(0,i.kt)("em",{parentName:"p"},"default value")," dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"0")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result2 = divider(10, 0);\nlet number = result2.unwrap_or_default();\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("h3",{id:"-method-unwrap_or"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or")),(0,i.kt)("p",null,"Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),", namun jika data ternyata isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", maka nilai yang dikembalikan adalah argument pemanggilan method tersebut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result2 = divider(10, 0);\nlet number = result2.unwrap_or(0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("p",null,"Pada contoh di atas argument pemanggilan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or")," adalah angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", artinya ketika ",(0,i.kt)("inlineCode",{parentName:"p"},"result2")," isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," maka angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," adalah return value pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or"),"."),(0,i.kt)("h3",{id:"-method-unwrap_or_else"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_else")),(0,i.kt)("p",null,"Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),", namun jika data isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", maka nilai yang dikembalikan adalah hasil eksekusi closure yang disisipkan saat memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_else"),". Contoh pengaplikasiannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result2 = divider(10, 0);\nlet number = result2.unwrap_or_else(|| 0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("p",null,"Closure harus dalam notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"FnOnce() -> T")," dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," pada konteks ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Closure ",(0,i.kt)("inlineCode",{parentName:"p"},"|| 0")," adalah kependekan dari ",(0,i.kt)("inlineCode",{parentName:"p"},"|| -> i32 { 0 }"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai closure dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/closures"},"Closures"),".")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/option_type"},"github.com/novalagung/dasarpemrogramanrust-example/../option_type")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/closures"},"Closures"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html"},"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/option/index.html"},"https://doc.rust-lang.org/std/option/index.html"))))}u.isMDXComponent=!0},1384:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAB/CAIAAADzWVUNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTY6Mjg6NDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAwOjM2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAwOjM2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE5NGQ1MGI1LThiMmIt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"},4890:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAAB8CAIAAACZuEK1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTY6NDA6MjIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAxOjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAxOjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFiNTc0MTQ0LTliOWQt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"},5499:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/option-type-3-e2943c7c0a60b13cd69ce8461805846c.png"}}]); \ No newline at end of file diff --git a/assets/js/e4904969.d2252a8b.js b/assets/js/e4904969.d2252a8b.js new file mode 100644 index 00000000..90a9d33b --- /dev/null +++ b/assets/js/e4904969.d2252a8b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8732],{3905:(e,a,n)=>{n.d(a,{Zo:()=>m,kt:()=>s});var t=n(7294);function i(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}function l(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,t)}return n}function r(e){for(var a=1;a=0||(i[n]=e[n]);return i}(e,a);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var d=t.createContext({}),o=function(e){var a=t.useContext(d),n=a;return e&&(n="function"==typeof e?e(a):r(r({},a),e)),n},m=function(e){var a=o(e.components);return t.createElement(d.Provider,{value:a},e.children)},u={inlineCode:"code",wrapper:function(e){var a=e.children;return t.createElement(t.Fragment,{},a)}},k=t.forwardRef((function(e,a){var n=e.components,i=e.mdxType,l=e.originalType,d=e.parentName,m=p(e,["components","mdxType","originalType","parentName"]),k=o(n),s=i,c=k["".concat(d,".").concat(s)]||k[s]||u[s]||l;return n?t.createElement(c,r(r({ref:a},m),{},{components:n})):t.createElement(c,r({ref:a},m))}));function s(e,a){var n=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var l=n.length,r=new Array(l);r[0]=k;var p={};for(var d in a)hasOwnProperty.call(a,d)&&(p[d]=a[d]);p.originalType=e,p.mdxType="string"==typeof e?e:i,r[1]=p;for(var o=2;o{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>r,default:()=>u,frontMatter:()=>l,metadata:()=>p,toc:()=>o});var t=n(7462),i=(n(7294),n(3905));const l={sidebar_position:38,title:"A.38. Tipe Data \u279c Option",sidebar_label:"A.38. Tipe Data \u279c Option"},r=void 0,p={unversionedId:"basic/option-type",id:"basic/option-type",title:"A.38. Tipe Data \u279c Option",description:"Option adalah salah satu tipe data penting pada Rust programming, digunakan untuk menampung data yang isinya bisa berpotensi kosong (None). Chapter ini membahas tentang tipe data tersebut.",source:"@site/docs/basic/option-type.md",sourceDirName:"basic",slug:"/basic/option-type",permalink:"/basic/option-type",draft:!1,tags:[],version:"current",sidebarPosition:38,frontMatter:{sidebar_position:38,title:"A.38. Tipe Data \u279c Option",sidebar_label:"A.38. Tipe Data \u279c Option"},sidebar:"tutorialSidebar",previous:{title:"A.37. Generics",permalink:"/basic/generics"},next:{title:"A.39. Tipe Data \u279c Result",permalink:"/basic/result-type"}},d={},o=[{value:"A.38.1. Konsep Option",id:"a381-konsep-option",level:2},{value:"A.38.2. Pattern matching pada tipe Option",id:"a382-pattern-matching-pada-tipe-option",level:2},{value:"\u25c9 Tips pattern matching",id:"-tips-pattern-matching",level:3},{value:"A.38.3. Method tipe data Option",id:"a383-method-tipe-data-option",level:2},{value:"\u25c9 Method unwrap",id:"-method-unwrap",level:3},{value:"\u25c9 Method is_some & is_none",id:"-method-is_some--is_none",level:3},{value:"\u25c9 Method unwrap_or_default",id:"-method-unwrap_or_default",level:3},{value:"\u25c9 Method unwrap_or",id:"-method-unwrap_or",level:3},{value:"\u25c9 Method unwrap_or_else",id:"-method-unwrap_or_else",level:3},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Chapter relevan lainnya",id:"-chapter-relevan-lainnya",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:o};function u(e){let{components:a,...l}=e;return(0,i.kt)("wrapper",(0,t.Z)({},m,l,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"Option")," adalah salah satu tipe data penting pada Rust programming, digunakan untuk menampung data yang isinya bisa berpotensi kosong (",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"). Chapter ini membahas tentang tipe data tersebut."),(0,i.kt)("h2",{id:"a381-konsep-option"},"A.38.1. Konsep ",(0,i.kt)("inlineCode",{parentName:"h2"},"Option")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," adalah enum dengan isi 2 buah enum value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Option::Some")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"Some"),"), digunakan untuk menandai bahwa data memiliki value/nilai."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"Option::None")," (atau ",(0,i.kt)("inlineCode",{parentName:"li"},"None"),"), digunakan untuk menandai bawah data adalah tidak ada nilainya.")),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"None")," bisa disamakan dengan nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"null")," atau ",(0,i.kt)("inlineCode",{parentName:"li"},"nil")," pada bahasa pemrograman lain."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," merupakan parameter generic. Lebih jelasnya mengenai generic dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics"),"."))),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," memiliki notasi penulisan ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah tipe data sebenarnya yang dibungkus oleh enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),"."),(0,i.kt)("p",null,"Berikut adalah contoh cara penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn divider(a: i32, b: i32) -> Option {\n if b == 0 {\n return None;\n }\n\n let result = a / b;\n return Some(result);\n}\n\nfn main() {\n let result1 = divider(10, 5);\n println!("result: {:?}", result1);\n\n let result2: Option = divider(10, 0);\n println!("result: {:?}", result2);\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," di atas tugasnya adalah melakukan operasi aritmatika pembagian angka numerik ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"a")," dibagi ",(0,i.kt)("inlineCode",{parentName:"p"},"b"),"."),(0,i.kt)("p",null,"Pada fungsi tersebut terdapat pengecekan apabila nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", maka yang dikembalikan adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", selainnya maka hasil operasi pembagian dikembalikan dibungkus dalam enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),". Bisa dilihat pada statement return value fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider"),", nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," dibungkus menggunakan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),"."),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider")," nilai baliknya bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),". Dari tipe data yang digunakan nantinya bisa diprediksi pasti akan ada 2 potensi value:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Return value adalah enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"None"),", muncul ketika nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"b")," adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"0")),(0,i.kt)("li",{parentName:"ul"},"Return value adalah nilai hasil numerik yang dibungkus oleh enum value ",(0,i.kt)("inlineCode",{parentName:"li"},"Some"))),(0,i.kt)("p",null,"Output program di atas saat di-run:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(1384).Z,width:"450",height:"127"})),(0,i.kt)("h2",{id:"a382-pattern-matching-pada-tipe-option"},"A.38.2. Pattern matching pada tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Option")),(0,i.kt)("p",null,"Dalam penerapannya, ketika ada data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," artinya data tersebut berpotensi untuk berisi nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),", pasti antara 2 nilai tersebut."),(0,i.kt)("p",null,"Umumnya penggunaan tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," selalu diikuti dengan seleksi kondisi. Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," bisa digunakan dalam seleksi kondisi, namun dalam Praktiknya lebih baik menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," karena memberikan kemudahan dalam pengaksesan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Some")," (yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," adalah data yang kita cari dibungkus dalam enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),")."),(0,i.kt)("p",null,"Mari kita praktikkan. Ubah isi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," dengan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\nmatch result1 {\n None => println!("cannot divide by 0"),\n Some(x) => println!("result: {x}"),\n}\n\nlet result2 = divider(10, 0);\nmatch result2 {\n None => println!("cannot divide by 0"),\n Some(x) => {\n println!("result: {}", x)\n },\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(4890).Z,width:"446",height:"124"})),(0,i.kt)("p",null,"Bisa dilihat cara mengambil nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," dari enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some")," cukup mudah dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match"),". Penerapan ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," untuk seleksi kondisi biasa disebut dengan ",(0,i.kt)("strong",{parentName:"p"},"pattern matching")," dan teknik ini sangat fleksibel dan advance."),(0,i.kt)("p",null,"Sebagai contoh, dengan penerapan match yang seperti ini kita bisa meng-handle 3 skenario seleksi kondisi:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\nmatch result1 {\n None => println!("cannot divide by 0"),\n Some(2) => println!("the result is 2"),\n Some(x) => println!("result: {x}"),\n}\n')),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-1: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"None"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"cannot divide by 0")),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-2: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"2"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"the result is 2")),(0,i.kt)("li",{parentName:"ul"},"Kondisi ke-1: jika nilai adalah ",(0,i.kt)("inlineCode",{parentName:"li"},"Some")," selain dari ",(0,i.kt)("inlineCode",{parentName:"li"},"None")," dan ",(0,i.kt)("inlineCode",{parentName:"li"},"Some(2)"),", maka munculkan pesan ",(0,i.kt)("inlineCode",{parentName:"li"},"result: {x}"))),(0,i.kt)("h3",{id:"-tips-pattern-matching"},"\u25c9 Tips pattern matching"),(0,i.kt)("p",null,"Silakan perhatikan kode yang sudah kita praktikkan berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result = divider(10, 5);\nmatch result {\n None => println!("cannot divide by 0"),\n Some(x) => println!("result: {x}"),\n}\n')),(0,i.kt)("p",null,"Penerapan pattern matching seperti contoh di atas memiliki konsekuensi, yaitu variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," hanya bisa diakses pada block ",(0,i.kt)("inlineCode",{parentName:"p"},"Some(x)")," saja."),(0,i.kt)("p",null,"Adakalanya kita butuh untuk mengeluarkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," ke luar block. Hal seperti ini mudah untuk dilakukan, dan ada beberapa cara yang bisa dipilih, namun menurut penulis yang paling elegan adalah cara berikut ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let result = match divider(10, 5) {\n None => {\n println!("cannot divide by 0");\n 0\n },\n Some(x) => x,\n };\n\n println!("result: {:?}", result);\n}\n')),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10, 5)")," mengembalikan data bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),". Data tersebut digunakan pada keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," seperti biasa. Namun pada contoh di atas ada yang berbeda, yaitu return value dari statement ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," ditampung ke variabel (",(0,i.kt)("inlineCode",{parentName:"p"},"result"),")."),(0,i.kt)("p",null,"Isi dari pattern matching ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," sendiri ada dua:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"None")," match, pesan error di-print kemudian nilai ",(0,i.kt)("inlineCode",{parentName:"li"},"0")," dijadikan return statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),"."),(0,i.kt)("li",{parentName:"ul"},"Ketika block ",(0,i.kt)("inlineCode",{parentName:"li"},"Some")," match, data ",(0,i.kt)("inlineCode",{parentName:"li"},"x")," dijadikan return value statement ",(0,i.kt)("inlineCode",{parentName:"li"},"match"),".")),(0,i.kt)("p",null,"Dengan penerapan pattern matching seperti di atas, maka variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"result")," akan selalu berisi data hasil operasi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10, 5)"),". Dengan pengecualian ketika ada error, pesan errornya dimunculkan kemudian hasil operasi pembagian di-set sebagai ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai pattern matching dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(0,i.kt)("h2",{id:"a383-method-tipe-data-option"},"A.38.3. Method tipe data ",(0,i.kt)("inlineCode",{parentName:"h2"},"Option")),(0,i.kt)("h3",{id:"-method-unwrap"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap")),(0,i.kt)("p",null,"Isi dari enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some")," bisa diakses tanpa menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"match")," dengan cara memanfaatkan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," milik ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\nif result1 != None {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n')),(0,i.kt)("p",null,"Penggunaan method tersebut sangat dianjurkan diiringi dengan seleksi kondisi untuk memastikan data ",(0,i.kt)("inlineCode",{parentName:"p"},"Option")," tidak berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),". Jika data ternyata adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," dan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," diakses, hasilnya adalah panic error. Contohnya bisa dilihat pada gambar berikut:"),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Option type",src:n(5499).Z,width:"659",height:"262"})),(0,i.kt)("p",null,"Selain method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," ada beberapa method sejenis lainnya yang bisa dimanfaatkan untuk pengambilan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),". Kita akan bahas satu per satu."),(0,i.kt)("h3",{id:"-method-is_some--is_none"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_some")," & ",(0,i.kt)("inlineCode",{parentName:"h3"},"is_none")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"is_some")," menghasilkan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," jika data isinya adalah enum value ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),". Sedangkan ",(0,i.kt)("inlineCode",{parentName:"p"},"is_none")," bernilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true")," jika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"."),(0,i.kt)("p",null,"Contoh penerapannya bisa dilihat pada program berikut. Kesemua seleksi kondisi pada konteks ini menghasilkan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result1 = divider(10, 5);\n\nif result1 != None {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n\nif result1.is_some() {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n\nif !result1.is_none() {\n let number = result1.unwrap();\n println!("result: {}", number);\n}\n')),(0,i.kt)("h3",{id:"-method-unwrap_or_default"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_default")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_default")," mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),". Jika data ternyata isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", maka nilai yang dikembalikan adalah ",(0,i.kt)("em",{parentName:"p"},"default value")," dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"T"),"."),(0,i.kt)("p",null,"Sebagai contoh, pada kode berikut statement ",(0,i.kt)("inlineCode",{parentName:"p"},"divider(10, 0)")," return type-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),", sedangkan return value-nya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),". Pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_default")," menghasilkan ",(0,i.kt)("em",{parentName:"p"},"default value")," dari tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),", yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"0")),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result2 = divider(10, 0);\nlet number = result2.unwrap_or_default();\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("h3",{id:"-method-unwrap_or"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or")),(0,i.kt)("p",null,"Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),", namun jika data ternyata isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", maka nilai yang dikembalikan adalah argument pemanggilan method tersebut."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result2 = divider(10, 0);\nlet number = result2.unwrap_or(0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("p",null,"Pada contoh di atas argument pemanggilan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or")," adalah angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0"),", artinya ketika ",(0,i.kt)("inlineCode",{parentName:"p"},"result2")," isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None")," maka angka ",(0,i.kt)("inlineCode",{parentName:"p"},"0")," adalah return value pengaksesan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or"),"."),(0,i.kt)("h3",{id:"-method-unwrap_or_else"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"unwrap_or_else")),(0,i.kt)("p",null,"Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," ketika data berisi ",(0,i.kt)("inlineCode",{parentName:"p"},"Some"),", namun jika data isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", maka nilai yang dikembalikan adalah hasil eksekusi closure yang disisipkan saat memanggil method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap_or_else"),". Contoh pengaplikasiannya:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let result2 = divider(10, 0);\nlet number = result2.unwrap_or_else(|| 0);\nprintln!("result: {}", number);\n// result: 0\n')),(0,i.kt)("p",null,"Closure harus dalam notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"FnOnce() -> T")," yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," pada konteks ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"i32"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Closure ",(0,i.kt)("inlineCode",{parentName:"p"},"|| 0")," adalah kependekan dari ",(0,i.kt)("inlineCode",{parentName:"p"},"|| -> i32 { 0 }"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai closure dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/closures"},"Closures"),".")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/option_type"},"github.com/novalagung/dasarpemrogramanrust-example/../option_type")),(0,i.kt)("h3",{id:"-chapter-relevan-lainnya"},"\u25c9 Chapter relevan lainnya"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/generics"},"Generics")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/closures"},"Closures"))),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html"},"https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/option/index.html"},"https://doc.rust-lang.org/std/option/index.html"))))}u.isMDXComponent=!0},1384:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcIAAAB/CAIAAADzWVUNAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTY6Mjg6NDgrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAwOjM2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAwOjM2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmE5NGQ1MGI1LThiMmIt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"},4890:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAb4AAAB8CAIAAACZuEK1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTlUMTY6NDA6MjIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTIxVDE1OjAxOjI2KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTIxVDE1OjAxOjI2KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmFiNTc0MTQ0LTliOWQt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"},5499:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/option-type-3-e2943c7c0a60b13cd69ce8461805846c.png"}}]); \ No newline at end of file diff --git a/assets/js/e7bd9b37.38bdc3e5.js b/assets/js/e7bd9b37.38bdc3e5.js deleted file mode 100644 index 8fb7f00a..00000000 --- a/assets/js/e7bd9b37.38bdc3e5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7539],{3905:(a,e,t)=>{t.d(e,{Zo:()=>u,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function p(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var s=n.createContext({}),m=function(a){var e=n.useContext(s),t=e;return a&&(t="function"==typeof a?a(e):p(p({},e),a)),t},u=function(a){var e=m(a.components);return n.createElement(s.Provider,{value:e},a.children)},d={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,s=a.parentName,u=l(a,["components","mdxType","originalType","parentName"]),k=m(t),o=i,h=k["".concat(s,".").concat(o)]||k[o]||d[o]||r;return t?n.createElement(h,p(p({ref:e},u),{},{components:t})):n.createElement(h,p({ref:e},u))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,p=new Array(r);p[0]=k;var l={};for(var s in e)hasOwnProperty.call(e,s)&&(l[s]=e[s]);l.originalType=a,l.mdxType="string"==typeof a?a:i,p[1]=l;for(var m=2;m{t.r(e),t.d(e,{assets:()=>s,contentTitle:()=>p,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>m});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:18,title:"A.18. Module System \u279c Path & Item",sidebar_label:"A.18. Module System \u279c Path & Item"},p=void 0,l={unversionedId:"basic/path-item",id:"basic/path-item",title:"A.18. Module System \u279c Path & Item",description:"Chapter ini membahas tentang konsep path dan item dalam Rust programming.",source:"@site/docs/basic/path-item.md",sourceDirName:"basic",slug:"/basic/path-item",permalink:"/basic/path-item",draft:!1,tags:[],version:"current",sidebarPosition:18,frontMatter:{sidebar_position:18,title:"A.18. Module System \u279c Path & Item",sidebar_label:"A.18. Module System \u279c Path & Item"},sidebar:"tutorialSidebar",previous:{title:"A.17. Function",permalink:"/basic/function"},next:{title:"A.19. Module System \u279c Package & Crate",permalink:"/basic/package-crate"}},s={},m=[{value:"A.18.1. Rust Paths",id:"a181-rust-paths",level:2},{value:"A.18.2. Absolute & relative paths",id:"a182-absolute--relative-paths",level:2},{value:"A.18.3. Rust Items",id:"a183-rust-items",level:2},{value:"A.18.4. Penerapan paths dalam penggaksesan item",id:"a184-penerapan-paths-dalam-penggaksesan-item",level:2},{value:"\u25c9 std::string::String::new()",id:"-stdstringstringnew",level:3},{value:"\u25c9 std::io::stdin()",id:"-stdiostdin",level:3},{value:"\u25c9 stdin_reader.read_line(&mut message)",id:"-stdin_readerread_linemut-message",level:3},{value:"\u25c9 Pengecekan error stdin_reader",id:"-pengecekan-error-stdin_reader",level:3},{value:"\u25c9 Menampilkan isi message",id:"-menampilkan-isi-message",level:3},{value:"A.18.5. Penggunaan keyword use untuk import path",id:"a185-penggunaan-keyword-use-untuk-import-path",level:2},{value:"\u25c9 Import beberapa items yang parent path-nya yang sama",id:"-import-beberapa-items-yang-parent-path-nya-yang-sama",level:3},{value:"\u25c9 Import semua items dalam suatu path",id:"-import-semua-items-dalam-suatu-path",level:3},{value:"A.18.6. Pembahasan lanjutan",id:"a186-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:m};function d(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},u,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang konsep ",(0,i.kt)("em",{parentName:"p"},"path")," dan ",(0,i.kt)("em",{parentName:"p"},"item")," dalam Rust programming."),(0,i.kt)("h2",{id:"a181-rust-paths"},"A.18.1. Rust ",(0,i.kt)("em",{parentName:"h2"},"Paths")),(0,i.kt)("p",null,"Paths (atau Path) adalah notasi penulisan alamat sebuah item, contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration")," adalah ",(0,i.kt)("em",{parentName:"p"},"path")," untuk item yang isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"struct")," bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration"),". Item bisa berupa banyak jenis, bisa saja struct, atau ",(0,i.kt)("em",{parentName:"p"},"macro"),", konstanta, atau lainnya. Lebih jelasnya silakan cek pada halaman dokumentasi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("p",null,"Sebuah path bisa memiliki banyak bagian (biasa disebut ",(0,i.kt)("em",{parentName:"p"},"segment"),"), sebagai contoh, path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration")," memiliki 3 segmen yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"std"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"time"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration"),". Karakter ",(0,i.kt)("inlineCode",{parentName:"p"},"::")," digunakan dalam penulisan path sebagai pembatas antar segmen (jika path memiliki lebih dari 1 segmen)."),(0,i.kt)("p",null,"Dalam sebuah path, yang disebut dengan item adalah segment terakhir. Contohnya path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),", maka item yang dituju adalah struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Rust paths mirip seperti konsep ",(0,i.kt)("em",{parentName:"p"},"filesystem")," path di sistem operasi. Seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"C:\\Users\\novalagung\\Desktop")," di windows, atau ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d/nginx.conf")," di Unix/Linux."),(0,i.kt)("p",{parentName:"blockquote"},"Di Rust, path tidak menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"\\")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"/")," sebagai separator, melainkan ",(0,i.kt)("inlineCode",{parentName:"p"},"::"),".")),(0,i.kt)("p",null,"Jika di-breakdown, berikut adalah penjelasan dari setiap kombinasi segmen path pada contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Path ",(0,i.kt)("inlineCode",{parentName:"li"},"std")," \u279c adalah path untuk ",(0,i.kt)("strong",{parentName:"li"},"crate")," bernama ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/"},(0,i.kt)("strong",{parentName:"a"},"Rust Standard Library")),", isinya adalah sangat banyak item untuk keperluan umum di Rust programming. Lebih jelasnya akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/rust-standard-library"},"Rust standard library"),"."),(0,i.kt)("li",{parentName:"ul"},"Path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::time")," \u279c adalah path untuk ",(0,i.kt)("strong",{parentName:"li"},"module")," bernama ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/time/index.html"},(0,i.kt)("inlineCode",{parentName:"a"},"time")),", isinya banyak item yang berhubungan dengan operasi waktu/time."),(0,i.kt)("li",{parentName:"ul"},"Path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::time::Duration")," \u279c adalah path untuk ",(0,i.kt)("strong",{parentName:"li"},"struct")," bernama ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/time/index.html"},(0,i.kt)("inlineCode",{parentName:"a"},"Duration")),", yang merupakan representasi dari unit waktu.")),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai crate dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/package-crate"},"Module System \u279c Package & Crate")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai module dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/module-basic"},"Module System \u279c Module")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai struct dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/struct"},"Struct")))),(0,i.kt)("h2",{id:"a182-absolute--relative-paths"},"A.18.2. Absolute & relative paths"),(0,i.kt)("p",null,"Rust mengenal dua jenis path:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Absolute path \u279c adalah path yang penulisannya lengkap dari root path, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"li"},"std::time::Duration"),"."),(0,i.kt)("li",{parentName:"ul"},"Relative path \u279c adalah path yang penulisannya relatif terhadap current path, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"li"},"self::my_func"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"super::my_mod::my_consntan"),".")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai relative path dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/module-scope-item-access"},"Module System \u279c Scope & Akses Item"),".")),(0,i.kt)("h2",{id:"a183-rust-items"},"A.18.3. Rust ",(0,i.kt)("em",{parentName:"h2"},"Items")),(0,i.kt)("p",null,"Seperti yang sudah dibahas bahwa path adalah notasi penulisan alamat untuk item. Lalu apa saja yang disebut dengan item? Di Rust ada banyak hal, yang kurang lebih list-nya bisa dilihat berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"modules ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/module-basic"},"Module System \u279c Module"),")")),(0,i.kt)("li",{parentName:"ul"},"extern crate declarations"),(0,i.kt)("li",{parentName:"ul"},"use declarations ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/use"},"Module System \u279c Use"),")")),(0,i.kt)("li",{parentName:"ul"},"function definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/function"},"Function"),", ",(0,i.kt)("a",{parentName:"em",href:"/basic/associated-function"},"Associated Function"),", dan ",(0,i.kt)("a",{parentName:"em",href:"/basic/method"},"Method"),")")),(0,i.kt)("li",{parentName:"ul"},"type definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter-chapter tentang tipe data)")),(0,i.kt)("li",{parentName:"ul"},"struct definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/struct"},"Struct"),")")),(0,i.kt)("li",{parentName:"ul"},"enumeration definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/enum"},"Enum"),")")),(0,i.kt)("li",{parentName:"ul"},"union definitions"),(0,i.kt)("li",{parentName:"ul"},"constant items ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/konstanta"},"Konstanta"),")")),(0,i.kt)("li",{parentName:"ul"},"static items ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/static"},"Static Items"),")")),(0,i.kt)("li",{parentName:"ul"},"trait definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/traits"},"Traits"),")")),(0,i.kt)("li",{parentName:"ul"},"implementations ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/function"},"Function"),", ",(0,i.kt)("a",{parentName:"em",href:"/basic/associated-function"},"Associated Function"),", dan ",(0,i.kt)("a",{parentName:"em",href:"/basic/method"},"Method"),")")),(0,i.kt)("li",{parentName:"ul"},"extern blocks")),(0,i.kt)("h2",{id:"a184-penerapan-paths-dalam-penggaksesan-item"},"A.18.4. Penerapan paths dalam penggaksesan item"),(0,i.kt)("p",null,"Pada bagian ini, kita akan coba terapkan path untuk mengakses beberapa item."),(0,i.kt)("p",null,"Dalam program sederhana berikut, inputan user ditampung sebagai string, kemudian ditampilkan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n // tampilkan intro untuk user agar menginput sebuah pesan\n println!("enter a message:");\n\n // variabel yang akan menampung inputan user dalam string\n let mut message = std::string::String::new();\n\n // objek reader untuk membaca inputan user\n let stdin_reader = std::io::stdin(); \n\n // proses pembacaan inputan user\n let reader_res = stdin_reader.read_line(&mut message);\n\n // pengecekan apakah ada error dalam pembacaan inputan.\n // jika iya, maka tampilkan error dan hentikan program\n if reader_res.is_err() {\n println!("error! {:?}", reader_res.err());\n return;\n }\n\n // tampilkan pesan inputan user\n println!("message: {}", message);\n}\n')),(0,i.kt)("p",null,"Jalankan program, lalu inputkan sebuah pesan, kemudian enter."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Module system path",src:t(7873).Z,width:"452",height:"153"})),(0,i.kt)("p",null,"Bisa dilihat pesan ditampilkan sesuai inputan. Oke, sekarang kita akan bahas program di atas per-barisnya."),(0,i.kt)("h3",{id:"-stdstringstringnew"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"std::string::String::new()")),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"message")," adalah string yang dibuat menggunakan tipe data custom ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". Salah satu cara pembuatan string bertipe data ini adalah menggunakan statement ",(0,i.kt)("inlineCode",{parentName:"p"},"std::string::String::new()"),"."),(0,i.kt)("p",null,"Bisa dilihat tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"::")," digunakan pada statement tersebut. Path tersebut jika dijabarkan per segment:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Segment ",(0,i.kt)("inlineCode",{parentName:"li"},"std")," adalah crate ",(0,i.kt)("em",{parentName:"li"},"Rust Standard Library")),(0,i.kt)("li",{parentName:"ul"},"Pada path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::string"),", segment ",(0,i.kt)("inlineCode",{parentName:"li"},"string")," adalah module"),(0,i.kt)("li",{parentName:"ul"},"Pada path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::string::String"),", segment ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," adalah struct String, yang biasa disebut dengan ",(0,i.kt)("em",{parentName:"li"},"custom type ",(0,i.kt)("inlineCode",{parentName:"em"},"String"))),(0,i.kt)("li",{parentName:"ul"},"Pada path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::string::String::new"),", segment ",(0,i.kt)("inlineCode",{parentName:"li"},"new")," adalah sebuah fungsi milik struct ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," yang mengembalikan data bertipe custom string ",(0,i.kt)("inlineCode",{parentName:"li"},"String"),"."),(0,i.kt)("li",{parentName:"ul"},"Di segment terakhir, yaitu ",(0,i.kt)("inlineCode",{parentName:"li"},"new"),", ditambahkan tanda pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"()"),", yang menandakan bahwa fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"new")," dipanggil. Dengan itu maka nilai baliknya (yang berupa ",(0,i.kt)("inlineCode",{parentName:"li"},"String"),") ditampung oleh variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"message"),".")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Terkesan banyak sekali penjelasan dalam 1 baris kode, tapi tidak perlu dihafal, lama-kelamaan akan terbiasa.")),(0,i.kt)("p",null,"Salah satu yang menarik dari crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library")," adalah, beberapa segmen otomatis di-import atau dipakai. Jadi tidak perlu menuliskan path secara full."),(0,i.kt)("p",null,"Pada contoh yang sudah dibuat, statement pembuatan data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," bisa diubah dari ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut message = std::string::String::new();\n")),(0,i.kt)("p",null,"... menjadi cukup ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut message = String::new();\n")),(0,i.kt)("h3",{id:"-stdiostdin"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"std::io::stdin()")),(0,i.kt)("p",null,"Berbeda dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::stdin")," tidak otomatis ter-import, jadi harus dituliskan secara full meskipun sama-sama dibawah crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library"),"."),(0,i.kt)("p",null,"Path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io")," berisi module untuk keperluan I/O atau input output. Salah satu item yang ada dalam module ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin"),", yang merupakan sebuah fungsi berguna untuk pembuatan objek handler untuk keperluan yang berhubungan dengan console (",(0,i.kt)("em",{parentName:"p"},"stdin"),"). Objek tersebut ditampung oleh variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Secara terminologi, ",(0,i.kt)("em",{parentName:"p"},"stdin")," (yang merupakan kependekan dari ",(0,i.kt)("em",{parentName:"p"},"standard input"),") adalah sebuah input stream dimana data dikirim dan dibaca oleh program.")),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader")," ini kemudian kita gunakan untuk berinteraksi dengan input stream, untuk menangkap inputan user."),(0,i.kt)("h3",{id:"-stdin_readerread_linemut-message"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"stdin_reader.read_line(&mut message)")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"read_line")," milik variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader")," berguna untuk menangkap inputan user. Variabel yang disisipkan sebagai argumen pemanggilan method tersebut menjadi penampung inputan user, yang pada contoh ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"message"),"."),(0,i.kt)("p",null,"Perlu diperhatikan bahwa ",(0,i.kt)("inlineCode",{parentName:"p"},"message")," disisipkan ",(0,i.kt)("em",{parentName:"p"},"mutable reference"),"-nya sebagai argumen pemanggilan fungsi."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai pointer dan ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Eksekusi dari statement ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader.read_line(&mut message)")," adalah blocking, artinya program akan berhenti untuk sementara di baris tersebut, hingga ada inputan dari user dan tombol enter ditekan."),(0,i.kt)("h3",{id:"-pengecekan-error-stdin_reader"},"\u25c9 Pengecekan error ",(0,i.kt)("inlineCode",{parentName:"h3"},"stdin_reader")),(0,i.kt)("p",null,"Blok statement ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," pada contoh di atas bertugas melakukan pengecekan error. Jika ada error, maka ",(0,i.kt)("inlineCode",{parentName:"p"},"reader_res.is_err()")," bernilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", dan pesan error-nya dimunculkan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'if reader_res.is_err() {\n println!("error! {:?}", reader_res.err());\n return;\n}\n')),(0,i.kt)("h3",{id:"-menampilkan-isi-message"},"\u25c9 Menampilkan isi ",(0,i.kt)("inlineCode",{parentName:"h3"},"message")),(0,i.kt)("p",null,"Jika program berlajan sesuai harapan, tanpa error, pada baris terakhir data dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"message")," ditampilkan ke layar."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ini tidak perlu di-konversi ke bentuk literal string ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," untuk ditampilkan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Langsung saja sisipkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ke macro tersebut dan ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," akan tau harus menampilkan apa.")),(0,i.kt)("p",null,"Oke, Penulis rasa sudah cukup jelas perihal bagaimana cara menggunakan path untuk mengakses item. Cukup tulis saja path-nya. Jika path-nya panjang? ya ditulis semua."),(0,i.kt)("h2",{id:"a185-penggunaan-keyword-use-untuk-import-path"},"A.18.5. Penggunaan keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"use")," untuk import path"),(0,i.kt)("p",null,"Ada alternatif cara lain untuk memperpendek penulisan dan pengaksesan path, yaitu dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Penggunaan ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," juga sempat dipraktikkan pada chapter sebelumnya, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/perulangan-while"},"Perulangan \u279c while"),".")),(0,i.kt)("p",null,"Cara penerapannya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let stdin_reader = std::io::stdin();\n\n// ... atau ...\n\nuse std::io;\nlet stdin_reader = io::stdin();\n\n// ... atau ...\n\nuse std::io::stdin;\nlet stdin_reader = stdin();\n\n// ... atau ...\n\nuse std::io::{stdin};\nlet stdin_reader = stdin();\n")),(0,i.kt)("p",null,"Dengan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," kita bisa memperpendek pengaksesan sebuah path."),(0,i.kt)("p",null,"O iya keyword ini bisa digunakan dimana saja, artinya tidak harus di luar fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". Bisa saja di dalam fungsi, atau di dalam blok kode seleksi kondisi atau lainnya."),(0,i.kt)("h3",{id:"-import-beberapa-items-yang-parent-path-nya-yang-sama"},"\u25c9 Import beberapa items yang parent path-nya yang sama"),(0,i.kt)("p",null,"Pada contoh di atas, path yang diimport adalah sebuah item ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::stdin"),". Dimisalkan ada path lain (sebagai contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::stderr"),") yang juga ikut diimport, maka penulisannya kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::io::stdin;\nuse std::io::stderr;\n\n// ... atau ...\n\nuse std::io::{stdin, stderr};\n")),(0,i.kt)("h3",{id:"-import-semua-items-dalam-suatu-path"},"\u25c9 Import semua items dalam suatu path"),(0,i.kt)("p",null,"Suatu path bisa saja memiliki cukup banyak item/child dibawahnya. Sebagai contoh, path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io")," merupakan parent path dari ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"stderr"),". Selain dua items tersebut, ada juga item lainnya."),(0,i.kt)("p",null,"Ada shortcut yang membuat penulisan import path lebih praktis, tidak perlu menuliskan satu-per-satu, caranya adalah menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"*"),". Sebagai contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::io::*;\n\n// ... adalah ekuivalen dengan ...\n\nuse std::io::{stdin, stderr, stdout, };\n\n// ... atau ...\n\nuse std::io::stdin;\nuse std::io::stderr;\nuse std::io::stdout;\nuse std::io::;\n")),(0,i.kt)("h2",{id:"a186-pembahasan-lanjutan"},"A.18.6. Pembahasan lanjutan"),(0,i.kt)("p",null,"Kita sudah beberapa kali menerapkan path untuk mengakses item milik crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library"),", lalu bagaimana penerapan path untuk internal item, pastinya pada proyek real dalam 1 program akan ada banyak item."),(0,i.kt)("p",null,"Jawabannya akan ada di beberapa chapter berikutnya. Untuk sekarang khusus pada bagian ",(0,i.kt)("strong",{parentName:"p"},"module system")," ini, penulis anjurkan untuk mengikuti urutan pembelajaran ebook terlebih dahulu."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/path_item"},"github.com/novalagung/dasarpemrogramanrust-example/../path_item")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html"},"https://doc.rust-lang.org/book/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/paths.html"},"https://doc.rust-lang.org/reference/paths.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items.html"},"https://doc.rust-lang.org/reference/items.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.use.html"},"https://doc.rust-lang.org/std/keyword.use.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html"},"https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html"))))}d.isMDXComponent=!0},7873:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcQAAACZCAIAAAA+Wt3VAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTJUMTU6NTQ6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEyVDE2OjU2OjQ0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEyVDE2OjU2OjQ0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNhMWU1ODU0LThkYTct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"}}]); \ No newline at end of file diff --git a/assets/js/e7bd9b37.6bffc9e2.js b/assets/js/e7bd9b37.6bffc9e2.js new file mode 100644 index 00000000..acf68c01 --- /dev/null +++ b/assets/js/e7bd9b37.6bffc9e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7539],{3905:(a,e,t)=>{t.d(e,{Zo:()=>u,kt:()=>o});var n=t(7294);function i(a,e,t){return e in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function r(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),t.push.apply(t,n)}return t}function p(a){for(var e=1;e=0||(i[t]=a[t]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,t)&&(i[t]=a[t])}return i}var s=n.createContext({}),m=function(a){var e=n.useContext(s),t=e;return a&&(t="function"==typeof a?a(e):p(p({},e),a)),t},u=function(a){var e=m(a.components);return n.createElement(s.Provider,{value:e},a.children)},d={inlineCode:"code",wrapper:function(a){var e=a.children;return n.createElement(n.Fragment,{},e)}},k=n.forwardRef((function(a,e){var t=a.components,i=a.mdxType,r=a.originalType,s=a.parentName,u=l(a,["components","mdxType","originalType","parentName"]),k=m(t),o=i,h=k["".concat(s,".").concat(o)]||k[o]||d[o]||r;return t?n.createElement(h,p(p({ref:e},u),{},{components:t})):n.createElement(h,p({ref:e},u))}));function o(a,e){var t=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=t.length,p=new Array(r);p[0]=k;var l={};for(var s in e)hasOwnProperty.call(e,s)&&(l[s]=e[s]);l.originalType=a,l.mdxType="string"==typeof a?a:i,p[1]=l;for(var m=2;m{t.r(e),t.d(e,{assets:()=>s,contentTitle:()=>p,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>m});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:18,title:"A.18. Module System \u279c Path & Item",sidebar_label:"A.18. Module System \u279c Path & Item"},p=void 0,l={unversionedId:"basic/path-item",id:"basic/path-item",title:"A.18. Module System \u279c Path & Item",description:"Chapter ini membahas tentang konsep path dan item dalam Rust programming.",source:"@site/docs/basic/path-item.md",sourceDirName:"basic",slug:"/basic/path-item",permalink:"/basic/path-item",draft:!1,tags:[],version:"current",sidebarPosition:18,frontMatter:{sidebar_position:18,title:"A.18. Module System \u279c Path & Item",sidebar_label:"A.18. Module System \u279c Path & Item"},sidebar:"tutorialSidebar",previous:{title:"A.17. Function",permalink:"/basic/function"},next:{title:"A.19. Module System \u279c Package & Crate",permalink:"/basic/package-crate"}},s={},m=[{value:"A.18.1. Rust Paths",id:"a181-rust-paths",level:2},{value:"A.18.2. Absolute & relative paths",id:"a182-absolute--relative-paths",level:2},{value:"A.18.3. Rust Items",id:"a183-rust-items",level:2},{value:"A.18.4. Penerapan paths dalam penggaksesan item",id:"a184-penerapan-paths-dalam-penggaksesan-item",level:2},{value:"\u25c9 std::string::String::new()",id:"-stdstringstringnew",level:3},{value:"\u25c9 std::io::stdin()",id:"-stdiostdin",level:3},{value:"\u25c9 stdin_reader.read_line(&mut message)",id:"-stdin_readerread_linemut-message",level:3},{value:"\u25c9 Pengecekan error stdin_reader",id:"-pengecekan-error-stdin_reader",level:3},{value:"\u25c9 Menampilkan isi message",id:"-menampilkan-isi-message",level:3},{value:"A.18.5. Penggunaan keyword use untuk import path",id:"a185-penggunaan-keyword-use-untuk-import-path",level:2},{value:"\u25c9 Import beberapa items yang parent path-nya yang sama",id:"-import-beberapa-items-yang-parent-path-nya-yang-sama",level:3},{value:"\u25c9 Import semua items dalam suatu path",id:"-import-semua-items-dalam-suatu-path",level:3},{value:"A.18.6. Pembahasan lanjutan",id:"a186-pembahasan-lanjutan",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],u={toc:m};function d(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,n.Z)({},u,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang konsep ",(0,i.kt)("em",{parentName:"p"},"path")," dan ",(0,i.kt)("em",{parentName:"p"},"item")," dalam Rust programming."),(0,i.kt)("h2",{id:"a181-rust-paths"},"A.18.1. Rust ",(0,i.kt)("em",{parentName:"h2"},"Paths")),(0,i.kt)("p",null,"Paths (atau Path) adalah notasi penulisan alamat sebuah item, contohnya ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration")," adalah ",(0,i.kt)("em",{parentName:"p"},"path")," untuk item yang isinya adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"struct")," bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration"),". Item bisa berupa banyak jenis, bisa saja struct, atau ",(0,i.kt)("em",{parentName:"p"},"macro"),", konstanta, atau lainnya. Lebih jelasnya silakan cek pada halaman dokumentasi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("p",null,"Sebuah path bisa memiliki banyak bagian (biasa disebut ",(0,i.kt)("em",{parentName:"p"},"segment"),"), sebagai contoh, path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration")," memiliki 3 segmen yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"std"),", ",(0,i.kt)("inlineCode",{parentName:"p"},"time"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration"),". Karakter ",(0,i.kt)("inlineCode",{parentName:"p"},"::")," digunakan dalam penulisan path sebagai pembatas antar segmen (jika path memiliki lebih dari 1 segmen)."),(0,i.kt)("p",null,"Dalam sebuah path, yang disebut dengan item adalah segment terakhir. Contohnya path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),", maka item yang dituju adalah struct ",(0,i.kt)("inlineCode",{parentName:"p"},"Duration"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Rust paths mirip seperti konsep ",(0,i.kt)("em",{parentName:"p"},"filesystem")," path di sistem operasi. Seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"C:\\Users\\novalagung\\Desktop")," di windows, atau ",(0,i.kt)("inlineCode",{parentName:"p"},"/etc/nginx/conf.d/nginx.conf")," di Unix/Linux."),(0,i.kt)("p",{parentName:"blockquote"},"Di Rust, path tidak menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"\\")," atau ",(0,i.kt)("inlineCode",{parentName:"p"},"/")," sebagai separator, melainkan ",(0,i.kt)("inlineCode",{parentName:"p"},"::"),".")),(0,i.kt)("p",null,"Jika di-breakdown, berikut adalah penjelasan dari setiap kombinasi segmen path pada contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"std::time::Duration"),"."),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Path ",(0,i.kt)("inlineCode",{parentName:"li"},"std")," \u279c adalah path untuk ",(0,i.kt)("strong",{parentName:"li"},"crate")," bernama ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/"},(0,i.kt)("strong",{parentName:"a"},"Rust Standard Library")),", isinya adalah sangat banyak item untuk keperluan umum di Rust programming. Lebih jelasnya akan dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"#/wip/rust-standard-library"},"Rust standard library"),"."),(0,i.kt)("li",{parentName:"ul"},"Path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::time")," \u279c adalah path untuk ",(0,i.kt)("strong",{parentName:"li"},"module")," bernama ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/time/index.html"},(0,i.kt)("inlineCode",{parentName:"a"},"time")),", isinya banyak item yang berhubungan dengan operasi waktu/time."),(0,i.kt)("li",{parentName:"ul"},"Path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::time::Duration")," \u279c adalah path untuk ",(0,i.kt)("strong",{parentName:"li"},"struct")," bernama ",(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/time/index.html"},(0,i.kt)("inlineCode",{parentName:"a"},"Duration")),", yang merupakan representasi dari unit waktu.")),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai crate dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/package-crate"},"Module System \u279c Package & Crate")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai module dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/module-basic"},"Module System \u279c Module")),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai struct dibahas pada chapter ",(0,i.kt)("a",{parentName:"li",href:"/basic/struct"},"Struct")))),(0,i.kt)("h2",{id:"a182-absolute--relative-paths"},"A.18.2. Absolute & relative paths"),(0,i.kt)("p",null,"Rust mengenal dua jenis path:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Absolute path \u279c adalah path yang penulisannya lengkap dari root path, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"li"},"std::time::Duration"),"."),(0,i.kt)("li",{parentName:"ul"},"Relative path \u279c adalah path yang penulisannya relatif terhadap current path, contohnya seperti ",(0,i.kt)("inlineCode",{parentName:"li"},"self::my_func"),", ",(0,i.kt)("inlineCode",{parentName:"li"},"super::my_mod::my_consntan"),".")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai relative path dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/module-scope-item-access"},"Module System \u279c Scope & Akses Item"),".")),(0,i.kt)("h2",{id:"a183-rust-items"},"A.18.3. Rust ",(0,i.kt)("em",{parentName:"h2"},"Items")),(0,i.kt)("p",null,"Seperti yang sudah dibahas bahwa path adalah notasi penulisan alamat untuk item. Lalu apa saja yang disebut dengan item? Di Rust ada banyak hal, yang kurang lebih list-nya bisa dilihat berikut:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"modules ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/module-basic"},"Module System \u279c Module"),")")),(0,i.kt)("li",{parentName:"ul"},"extern crate declarations"),(0,i.kt)("li",{parentName:"ul"},"use declarations ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/use"},"Module System \u279c Use"),")")),(0,i.kt)("li",{parentName:"ul"},"function definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/function"},"Function"),", ",(0,i.kt)("a",{parentName:"em",href:"/basic/associated-function"},"Associated Function"),", dan ",(0,i.kt)("a",{parentName:"em",href:"/basic/method"},"Method"),")")),(0,i.kt)("li",{parentName:"ul"},"type definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter-chapter tentang tipe data)")),(0,i.kt)("li",{parentName:"ul"},"struct definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/struct"},"Struct"),")")),(0,i.kt)("li",{parentName:"ul"},"enumeration definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/enum"},"Enum"),")")),(0,i.kt)("li",{parentName:"ul"},"union definitions"),(0,i.kt)("li",{parentName:"ul"},"constant items ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/konstanta"},"Konstanta"),")")),(0,i.kt)("li",{parentName:"ul"},"static items ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/static"},"Static Items"),")")),(0,i.kt)("li",{parentName:"ul"},"trait definitions ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/traits"},"Traits"),")")),(0,i.kt)("li",{parentName:"ul"},"implementations ",(0,i.kt)("em",{parentName:"li"},"(dibahas pada chapter ",(0,i.kt)("a",{parentName:"em",href:"/basic/function"},"Function"),", ",(0,i.kt)("a",{parentName:"em",href:"/basic/associated-function"},"Associated Function"),", dan ",(0,i.kt)("a",{parentName:"em",href:"/basic/method"},"Method"),")")),(0,i.kt)("li",{parentName:"ul"},"extern blocks")),(0,i.kt)("h2",{id:"a184-penerapan-paths-dalam-penggaksesan-item"},"A.18.4. Penerapan paths dalam penggaksesan item"),(0,i.kt)("p",null,"Pada bagian ini, kita akan coba terapkan path untuk mengakses beberapa item."),(0,i.kt)("p",null,"Dalam program sederhana berikut, inputan user ditampung sebagai string, kemudian ditampilkan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n // tampilkan intro untuk user agar menginput sebuah pesan\n println!("enter a message:");\n\n // variabel yang akan menampung inputan user dalam string\n let mut message = std::string::String::new();\n\n // objek reader untuk membaca inputan user\n let stdin_reader = std::io::stdin(); \n\n // proses pembacaan inputan user\n let reader_res = stdin_reader.read_line(&mut message);\n\n // pengecekan apakah ada error dalam pembacaan inputan.\n // jika iya, maka tampilkan error dan hentikan program\n if reader_res.is_err() {\n println!("error! {:?}", reader_res.err());\n return;\n }\n\n // tampilkan pesan inputan user\n println!("message: {}", message);\n}\n')),(0,i.kt)("p",null,"Jalankan program, lalu inputkan sebuah pesan, kemudian enter."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Module system path",src:t(7873).Z,width:"452",height:"153"})),(0,i.kt)("p",null,"Bisa dilihat pesan ditampilkan sesuai inputan. Oke, sekarang kita akan bahas program di atas per-barisnya."),(0,i.kt)("h3",{id:"-stdstringstringnew"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"std::string::String::new()")),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"message")," adalah string yang dibuat menggunakan tipe data custom ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),". Salah satu cara pembuatan string bertipe data ini adalah menggunakan statement ",(0,i.kt)("inlineCode",{parentName:"p"},"std::string::String::new()"),"."),(0,i.kt)("p",null,"Bisa dilihat tanda ",(0,i.kt)("inlineCode",{parentName:"p"},"::")," digunakan pada statement tersebut. Path tersebut jika dijabarkan per segment:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Segment ",(0,i.kt)("inlineCode",{parentName:"li"},"std")," adalah crate ",(0,i.kt)("em",{parentName:"li"},"Rust Standard Library")),(0,i.kt)("li",{parentName:"ul"},"Pada path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::string"),", segment ",(0,i.kt)("inlineCode",{parentName:"li"},"string")," adalah module"),(0,i.kt)("li",{parentName:"ul"},"Pada path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::string::String"),", segment ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," adalah struct String, yang biasa disebut dengan ",(0,i.kt)("em",{parentName:"li"},"custom type ",(0,i.kt)("inlineCode",{parentName:"em"},"String"))),(0,i.kt)("li",{parentName:"ul"},"Pada path ",(0,i.kt)("inlineCode",{parentName:"li"},"std::string::String::new"),", segment ",(0,i.kt)("inlineCode",{parentName:"li"},"new")," adalah sebuah fungsi milik struct ",(0,i.kt)("inlineCode",{parentName:"li"},"String")," yang mengembalikan data bertipe custom string ",(0,i.kt)("inlineCode",{parentName:"li"},"String"),"."),(0,i.kt)("li",{parentName:"ul"},"Di segment terakhir, yaitu ",(0,i.kt)("inlineCode",{parentName:"li"},"new"),", ditambahkan tanda pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"()"),", yang menandakan bahwa fungsi ",(0,i.kt)("inlineCode",{parentName:"li"},"new")," dipanggil. Dengan itu maka nilai baliknya (yang berupa ",(0,i.kt)("inlineCode",{parentName:"li"},"String"),") ditampung oleh variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"message"),".")),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Terkesan banyak sekali penjelasan dalam 1 baris kode, tapi tidak perlu dihafal, lama-kelamaan akan terbiasa.")),(0,i.kt)("p",null,"Salah satu yang menarik dari crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library")," adalah, beberapa segmen otomatis di-import atau dipakai. Jadi tidak perlu menuliskan path secara full."),(0,i.kt)("p",null,"Pada contoh yang sudah dibuat, statement pembuatan data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," bisa diubah dari ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut message = std::string::String::new();\n")),(0,i.kt)("p",null,"... menjadi cukup ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let mut message = String::new();\n")),(0,i.kt)("h3",{id:"-stdiostdin"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"std::io::stdin()")),(0,i.kt)("p",null,"Berbeda dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::stdin")," tidak otomatis ter-import, jadi harus dituliskan secara full meskipun sama-sama di bawah crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library"),"."),(0,i.kt)("p",null,"Path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io")," berisi module untuk keperluan I/O atau input output. Salah satu item yang ada dalam module ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin"),", yang merupakan sebuah fungsi berguna untuk pembuatan objek handler untuk keperluan yang berhubungan dengan console (",(0,i.kt)("em",{parentName:"p"},"stdin"),"). Objek tersebut ditampung oleh variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Secara terminologi, ",(0,i.kt)("em",{parentName:"p"},"stdin")," (merupakan kependekan dari ",(0,i.kt)("em",{parentName:"p"},"standard input"),") adalah sebuah input stream yang nilainya dibaca oleh program sebagai inputan.")),(0,i.kt)("p",null,"Variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader")," ini kemudian kita gunakan untuk berinteraksi dengan input stream, untuk menangkap inputan user."),(0,i.kt)("h3",{id:"-stdin_readerread_linemut-message"},"\u25c9 ",(0,i.kt)("inlineCode",{parentName:"h3"},"stdin_reader.read_line(&mut message)")),(0,i.kt)("p",null,"Method ",(0,i.kt)("inlineCode",{parentName:"p"},"read_line")," milik variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader")," berguna untuk menangkap inputan user. Variabel yang disisipkan sebagai argumen pemanggilan method tersebut menjadi penampung inputan user, yang pada contoh ini adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"message"),"."),(0,i.kt)("p",null,"Perlu diperhatikan bahwa ",(0,i.kt)("inlineCode",{parentName:"p"},"message")," disisipkan ",(0,i.kt)("em",{parentName:"p"},"mutable reference"),"-nya sebagai argumen pemanggilan fungsi."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai pointer dan ",(0,i.kt)("em",{parentName:"p"},"mutable reference")," dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"))),(0,i.kt)("p",null,"Eksekusi dari statement ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin_reader.read_line(&mut message)")," adalah blocking, artinya program akan berhenti untuk sementara di baris tersebut, hingga ada inputan dari user dan tombol enter ditekan."),(0,i.kt)("h3",{id:"-pengecekan-error-stdin_reader"},"\u25c9 Pengecekan error ",(0,i.kt)("inlineCode",{parentName:"h3"},"stdin_reader")),(0,i.kt)("p",null,"Blok statement ",(0,i.kt)("inlineCode",{parentName:"p"},"if")," pada contoh di atas bertugas melakukan pengecekan error. Jika ada error, maka ",(0,i.kt)("inlineCode",{parentName:"p"},"reader_res.is_err()")," bernilai ",(0,i.kt)("inlineCode",{parentName:"p"},"true"),", dan pesan error-nya dimunculkan."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'if reader_res.is_err() {\n println!("error! {:?}", reader_res.err());\n return;\n}\n')),(0,i.kt)("h3",{id:"-menampilkan-isi-message"},"\u25c9 Menampilkan isi ",(0,i.kt)("inlineCode",{parentName:"h3"},"message")),(0,i.kt)("p",null,"Jika program berlajan sesuai harapan, tanpa error, pada baris terakhir data dalam ",(0,i.kt)("inlineCode",{parentName:"p"},"message")," ditampilkan ke layar."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ini tidak perlu di-konversi ke bentuk literal string ",(0,i.kt)("inlineCode",{parentName:"p"},"&str")," untuk ditampilkan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"println"),". Langsung saja sisipkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"String")," ke macro tersebut dan ",(0,i.kt)("inlineCode",{parentName:"p"},"println")," akan tau harus menampilkan apa.")),(0,i.kt)("p",null,"Oke, Penulis rasa sudah cukup jelas perihal bagaimana cara menggunakan path untuk mengakses item. Cukup tulis saja path-nya. Jika path-nya panjang? ya ditulis semua."),(0,i.kt)("h2",{id:"a185-penggunaan-keyword-use-untuk-import-path"},"A.18.5. Penggunaan keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"use")," untuk import path"),(0,i.kt)("p",null,"Ada alternatif cara lain untuk memperpendek penulisan dan pengaksesan path, yaitu dengan menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Penggunaan ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," juga sempat dipraktikkan pada chapter sebelumnya, yaitu ",(0,i.kt)("a",{parentName:"p",href:"/basic/perulangan-while"},"Perulangan \u279c while"),".")),(0,i.kt)("p",null,"Cara penerapannya bisa dilihat pada kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"let stdin_reader = std::io::stdin();\n\n// ... atau ...\n\nuse std::io;\nlet stdin_reader = io::stdin();\n\n// ... atau ...\n\nuse std::io::stdin;\nlet stdin_reader = stdin();\n\n// ... atau ...\n\nuse std::io::{stdin};\nlet stdin_reader = stdin();\n")),(0,i.kt)("p",null,"Dengan menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," kita bisa memperpendek pengaksesan sebuah path."),(0,i.kt)("p",null,"O iya keyword ini bisa digunakan di mana saja, artinya tidak harus di luar fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main"),". Bisa saja di dalam fungsi, atau di dalam blok kode seleksi kondisi atau lainnya."),(0,i.kt)("h3",{id:"-import-beberapa-items-yang-parent-path-nya-yang-sama"},"\u25c9 Import beberapa items yang parent path-nya yang sama"),(0,i.kt)("p",null,"Pada contoh di atas, path yang diimport adalah sebuah item ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::stdin"),". Dimisalkan ada path lain (sebagai contoh ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::stderr"),") yang juga ikut diimport, maka penulisannya kurang lebih seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::io::stdin;\nuse std::io::stderr;\n\n// ... atau ...\n\nuse std::io::{stdin, stderr};\n")),(0,i.kt)("h3",{id:"-import-semua-items-dalam-suatu-path"},"\u25c9 Import semua items dalam suatu path"),(0,i.kt)("p",null,"Suatu path bisa saja memiliki cukup banyak item/child di bawahnya. Sebagai contoh, path ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io")," merupakan parent path dari ",(0,i.kt)("inlineCode",{parentName:"p"},"stdin")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"stderr"),". Selain dua items tersebut, ada juga item lainnya."),(0,i.kt)("p",null,"Ada shortcut yang membuat penulisan import path lebih praktis, tidak perlu menuliskan satu-per-satu, caranya adalah menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"*"),". Sebagai contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::io::*;\n\n// ... adalah ekuivalen dengan ...\n\nuse std::io::{stdin, stderr, stdout, };\n\n// ... atau ...\n\nuse std::io::stdin;\nuse std::io::stderr;\nuse std::io::stdout;\nuse std::io::;\n")),(0,i.kt)("h2",{id:"a186-pembahasan-lanjutan"},"A.18.6. Pembahasan lanjutan"),(0,i.kt)("p",null,"Kita sudah beberapa kali menerapkan path untuk mengakses item milik crate ",(0,i.kt)("em",{parentName:"p"},"Rust Standard Library"),", lalu bagaimana penerapan path untuk internal item, pastinya pada proyek real dalam 1 program akan ada banyak item."),(0,i.kt)("p",null,"Jawabannya akan ada di beberapa chapter berikutnya. Untuk sekarang khusus pada bagian ",(0,i.kt)("strong",{parentName:"p"},"module system")," ini, penulis anjurkan untuk mengikuti urutan pembelajaran ebook terlebih dahulu."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/path_item"},"github.com/novalagung/dasarpemrogramanrust-example/../path_item")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html"},"https://doc.rust-lang.org/book/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/paths.html"},"https://doc.rust-lang.org/reference/paths.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items.html"},"https://doc.rust-lang.org/reference/items.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.use.html"},"https://doc.rust-lang.org/std/keyword.use.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html"},"https://doc.rust-lang.org/edition-guide/rust-2018/path-changes.html"))))}d.isMDXComponent=!0},7873:(a,e,t)=>{t.d(e,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcQAAACZCAIAAAA+Wt3VAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTAtMTJUMTU6NTQ6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEwLTEyVDE2OjU2OjQ0KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEwLTEyVDE2OjU2OjQ0KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjNhMWU1ODU0LThkYTctMjE0Ni04NDc0LTEyNGI1NTMyNTA4YSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozYTFlNTg1NC04ZGE3LTIxNDYtODQ3NC0xMjRiNTUzMjUwOGEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozYTFlNTg1NC04ZGE3LTIxNDYtODQ3NC0xMjRiNTUzMjUwOGEiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjNhMWU1ODU0LThkYTctMjE0Ni04NDc0LTEyNGI1NTMyNTA4YSIgc3RFdnQ6d2hlbj0iMjAyMi0xMC0xMlQxNTo1NDowNyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqjmjEwAABV6SURBVHja7Z3LktTIFYZ5kmJmx3q2BrxkR2M7sINFY4dtjMcOO3om3MzExGDGz8Ej8BTseSh3XSTl5T+ZJ1WSSlX9fUEEXSpJedVfJzOlXw82AABwNA+oAgAAxBQAADEFAEBMAQAAMQUAQEwBABBTAADEFAAAEFMAAMQUAAAxBQBATAEAADEFAEBMAQAuTEyv3tzeXD/e/vX4+ub2zdXkmblLYIazHpehQ4nH0FBL4xI6LnsL1Njdp9tqFt2lOLLXbQ/PE6qmvsJKhnU23INRXXEmMTX6u6ilgCEf0XYze/HRldTuMjTi+htx8cuEDucwczldd9FVN+L8I8RUlj1upf05ZhFTs+YR05VL5/oa7sGojjiXmPqqYHuhdanvxGb7wafD6ujiUaqkc4ipsfOuw1xZvWai7mJW3dFiOr7s6jzziGnttIjpWuPQ1TXcg1FF2Rejjx76Eu3jqCTkCzbKPZP6qF8yoRwePvm1NDk6/rgrUfWy1q2Ul91RS0lOxI/vdo/4Nzg8vD8iS307ZXJ9CGuvSuGtrLoojSGnUdsEH0SWhk1RfQYRZ5hmVnb74snrU54z3xiWc/9tdwaj5uuV7OneQZJ3f/Zf7HbdN2yxh+y3Ga2pzumokO4L43B/X5J9XpTIKHu1L3V9TnTFEzfc6+++e/3kxbc//fT+/ftffvnXH/ximuU5Gnz2cvT4+k04DzBcVJk2BgqWX8pVNVViWh4PF8Q0Sl+JqfdCz8tu1ZJVPFnNu12Db8Ls95tF6l1Rgv9Laiqrzs5QmjtLl+LChnXdDyl0UpaYZvUpz1neuD203KLeSjZaU+55EJi+D9xcWz1EXB1Ga1rnzCt5OGdQ8fnhj1v6Uq3P18ue9yXr6jC67wkb7t0PP3z3xyfbXX/3z/f/+/dLp5jm6cZbEnnKa0cEe6WIrBafJzUWT+VWZ0LT3NZHA2n5a0d0++taUhWiEwo+dklmp8wzctil+y79v5DneryoLoBilqIvxc9YLLTJgCGNRUR9ynPqjYcL4frNrV1pRu8u7F9oTfGTEy86yJTk1WG1pjinLns6tzXIRHEdxN+XZJ/3l71an1b3PV3DvRsO/u23//3xL5vN7z1imoulcR0kEXk26sgHB3IZqBaaRheaOeC2zlCKTH1qarZSaVCcSKPOvN01+mBAd5c89UYxlVU3vZjaUavjShD1Kc+pN5Z/asNz+yvZak21Z71Ew4RVenUUxDQ9Z6HsQ2Q6xMLl+apKX6r1eTWyqvd1eXWY3XcNDfebv//88z82v/7rRJHp4Re1/DvX7eAQS3dk2rikkh1d/YESWdJdOC97VR7y8abdA/YXlT6lSn2cmHZV96sFItOsGcNjXdKzV5nsnHpj1ynqsY+/knVr6j29JbLmxfxiqio5DECKleztS54+P05MZU4K3ff0Dffi7U//+dPm6Z/Hz5lmo4ZkqkcP/YdfNFPBGudMrfjKE5mmc6RyztRzocuyy1qqaX5/ciFLN9ncl13zI8U0qrosf3FUcztcp1mWzNArnM4rRFW1HiwnQMsbjeGtSN1dybo19Z61EvWZMibGnGIqy25cUtbhnr7k6PN1Pcr6knl1VMKjkzbc3969+347e/rUvZofZUEumUVrkNfBL5W6+VOfYcxqvj3H1j5JYIupHKUn90AWyy4WFnVaSTSQNXmwUtqv8ovU/WJaqrpsWTkYK1/1NSKylMXVed3ZZa/X8W12N2vhpmOx1CnX3FQTlyvZaE21Z2FJLS9Rtr1BTHWFqPqszldV+pJVIT4xlX2pcHXY9/+spuHG3We68A1l673V7Z5VwaWXfenUZ7xfu7ayeVk9bB0NN+4JqDnzyB3ScF9YSkxHrRPAbGK6hPyv7tl8gEsQU/sRbDiRmAIAgAFiCgCAmAIAIKYAAIjpyfnm4Y8vv/7+af/54fcvv/5x/+9Zec+TUF69MzyW7i2TrMz43FTvG6OWkXFJX42Yvn7eydzLhy8mFdNUN/eS+syz5wr78HKLuyvrjuXnVicU05MWs3Db+ehfgqZzKhtCXNLzah/rkj6/mO6UtNfQh6/njRCVmJ5NQICYzl0TJyxmcK+nfpw12fXacc91wzlTKcUlvVY/7eefWUyfPP3qLip8+40RVw6j8odv73Z7ttv4/OHrZ9327W5fvX7a7fz84ZPyiD4VU7WnPmecJTuINo1ypSNv/thZyd8h60f+uCNzujVdRfzmu16LYjvAqNuHF12o3b7ajmmTKYrpS13arMTXafHhlKs3iZWA79qv759IAi7pDi1tckmfWUxfbGXxq9eP7EnMw99bMd3q2qOt/N19tVPhXuD2unb4qhiEOjaG59z9vdP64eS7pLM8b5JuFhrl1h15DUfSspgWLbQ9YYMwbPKb7/otim01c9mHbyru4xVD36Yg55hiulOPal5YLYRuwyPCJFkYxzlLRsobXNI3x7ukzyymuzF+Kkw7hR3ivu0+z7diutOyO1Hb7h+KaRfYdoI7hZgeztnL+j5cfRSEro/KXTJy0JGOvNoQzC+mFQvtrBeU7R/C4MpjINRgUVzXMYdjkqeztj4H6RDThmL6U49fwpG/YKR8STeKqfecWWXgkl4c04xwST9FZBrPovrF9LDnLGK622e/MdF6p5jmjrxHimnNQtuaOY8Hft3vuTKxL3WXFotil5jW7MM9Yrop+GqPE9PGYnpTD+U/f/eFL8Z2iWnDOZV9LC7pZU1tdEk/xZxpsiS1jze9kemzaYb5Ukz7CVMxydsSmQ7TZEeK6Yg1mNTOct+djJG9PdBusSh2RqYFm16/mMrMHyemI4pZTT2b40ukynFFt86ZekKugpjikl6o3XWI6UEBQ+l8KuZM335TF9NMl6cU093JXbdt1V3HhddsMBlT8sTNf8Hb5TRbsb25ubFf+GCb7zZYFNcu3cjJXNr0ytSLYuryF9OviJigmC6h2613xAMNqazGTJ1II93TPmfrnCku6cWZM6dL+hL3me71NFo63ytjEAaWxDQNGNNl937SM9rY3Qyg98wj07fxnlZwaraNsihWVrV1T1y50HxbmzLV68zJb36T+a7XoriapaJ9uExdimnVV9sevZsJeYvZkrqlR8MZxFSD+R6irPqMeYq6QojxEy7paqZsrEv6yp+AiudMZ57bTadxn2zOn1PdWHnCW2Zh/MzBuvrUubmkI6b2NO75i2n91YOIKXIKiOlscxGrVdJkHFIach52nf3C0VlaSkwbKgTONNxDTAEAEFMAAEBMAQAQUwAAxHQC/EbOnj3HrV81mElPOJs/LKacZn3Ab6U8jenyHAshVQODRQ2nXS067HQey2b1Zmt6x/BFGXifRkyjZzejh/f9Rs6ePc9MTE969x5iOv1PzpEmnivrId47q1ruvzqmL7WbbRedF89aTBewcEZMT5nQJYpp05XuT+0sxLRBJBfIaoMxtnhmOHBGddk8nJuY+o2cDXPo8OHR/Z57MX3a7Z84TvUPmOaHl8W09nhc7zFsmu96+p/1SKU0Xc6tqcWelkGyeAOVYamr3lWVnlXYMRs7H+/10dAc2qLYMgEQT0oaZZfNIZtb2oe7xNTlbB27cvRfZH5b4d5pLdkJmZ7NOrxz2mL567PYNcodpTbvkL1yYGzAurrI1GPkLE+SWEcXDg8O7DcKv2pP3UdP5qdGzsokeAIxzV2TpTW1duQtRA2p05ltqWuWJei20tnak41WMXU3h6wQLaaJi0ZYVmFGEzdHwZs9tw8/MjKVZtuhM59lupP93Je9uq3UC5n2RubV+qzXRcUYe7frdWFqOq6bIwYvq5gzDe2aPHZ5ppimzk+mQVQ/S3uw9YuezS+Kqen9JXwehUnwFGIqXNxza2rb98wrprY9hNHnwkpQpssOQ99mMXU3h7RYNSo5DVUyr9qrYhtt6uOStAYnGOZHvwSxD51RItN9vOblbY+e20f63vqUZ/cYY2fOpLk9eOFX7uIiU5+YRk5U0TA/PvzFs69zf6no2fx2MbWMnHOT4JnENLemtuyZZxPT6NJs8KD0jWpLl4qrOeRlWwr/h1il4IDaIqa2JI8XU2W2bUlhWiLbfVydQc9SFdyynVHeeDF1GmMX32aRq2eT+/jlimnP/s3S/eC9GJmGhxwnprIt5YvAZo5MVcw1e2SazEvJClksMjVfcJn7VdvDfEPFp4lMU2kaJ6babNsapN/K19x5g8pyDovuznOIaYMxdvxdPFq0NXPMstQliulgI10w1X9mHNI5nphzpqbls2z4zCS4TUwzA1pzWJpZU0t75pJEjRdT7xBQVt2Rc6b+5pAWxaqSG+YC3WKq26hNTLPDtNm2/XLP+iJ3od6rd0qMe1n3SDFtMdtOXbCHpbbKrMn5iqnfyNlhDh3b+GdarDyn9/FsbPtfHGLEls/mOnXBZ9c9iIttpCurz3VjaeHEfOt4c45hutzibK2r7rgO7W0Oo0KUy2/F9bj2yl9jWKzsw9vHxMbi+2C2XY1MLYdmbSJulqjo7lwvUGN9Fs9QNNuWxcn8xrphyjHeYzxOuhamvjUPR9GJam4JD9CZG2uaEq3rPtMVgpgipmDNHBQHw2ckplOVaPonoBBTmKnDT/lsPmI6RVvM/tD8Qs/mT1aiiZ/NR0wBAAAxBQBATAEAEFMAAMT0bGmw1PMw3EG/GqqrArN60y3mQ6h8hu4zi9tdb9bV59fWEVYjptGT9VNqX4vhdFM3Fvdkn8xusnYH/LxGn56nZafT5RPepnDa2yfLDxxPKKZnc5foIretna2Y7h9G2nuRNJs6rz08nDOhynU1s2vyZPqGmC4upqsrJsP8ScU0sRlVj5NmjtF+G2m9Z/6UauzmV/2BXLl374yuySJ1w1vaMEjWj35ajxVmEuJ/AUVm/Wv6j6R7upq4dwnVZbdC+twLOe02BY/UrOE2fofjfNpkimL6/ZWzc8YPzAcPYs/wjpF7FZnujJ1Kz+bHls9+G2nbMXo/tyBtpUb9ni/p3ZtvXtY1OU5deUtbBskqnw1iatWSL6SN1DRywVAXbV7zIvWir7ZSk9TAW3YbKzLNrZRb49V8/2OK6U9dN1xvCJO8lsTXxIhpPmcaR4tSTF0bbTHV0e6jIHSdQExll53Hu7cUTG6Wd02WPinSxFrn0y+mZi05Z9jioDsMrrT9dTa7mNVn0XCrpGO16RufSWPzRKJDTBuK6U7dbLhdfq7jcnubGDFNItPM3mkJMd3tE8TF/jF+qZWX8+7NLovFXZPldZ+KaW5ifaSY2rVkr7bkcwxdwyQBb3a+tOZlfR4jpnI2p1FMN40Ox3UxbSymK/VSw8WC3NjEiGk8zB+smpcV08SU71gxXdK7N/tqcdfkTXI9VSPTfQg8gZiOmEVL3UX3w1RjZG8PtK1XDhwRmVrdpklMZeaPE9MRxSymXuneV8Nv9fmYTKxSTFWUGng2zyCmuxRHRKNp9zidd6/Ss0Vdk9OpWWGHKg2SzXxmxtiytsbdHRNX4TZ3NzeOV8XLl5hYt8g1iqmaLIzfX1R+hYpqHNcMY37gRMUsezYbDReF58Ey7DnI6TpX8/fyt5s57V/ZNHg2N4arLsPpTqyPCk5P6t0r5wCXcE1WqZtXmjJIlvk0jLG9LtTVgWX24h9dvbe3tTsHstQbxTTPuew2KvXC+2vbFvNLb+RuKWYp9bJn8220qBX0i+y2llsWoFZOMk+6nWfoF8HmZ1o34vlm6D35PMt7FE+VaWwSLwrEdBPP0m66KHVBMT2BG/FF5/OoYiGmgJgeRzzMX1BJxTB/vdfXOeQze72PndnDrrNHpTpLS4lpQ4UAYgoAgJgCACCmAACAmAIAIKYAAIgpAABiCgAAiCkAAGIKAICYAgAgpgAAgJgCACCmAACIKQAAYgoAAIgpAMAZiumHT18+f3xFtQIAYoqYAgDMIqavPn7+cuDTh27LnWbeKeewNdgp3znZctDc/otucy31gk7fnfHTx92enz9+OPz/ykg9zmy/tbZxSL0vePiFTKjbuVhCALgXYroVg0AWd8rxKpCrfqOOTNXhnRrttkfHCyn91H1X3LGTrOD/7b4y9e1fmboZG0Xqwzl31bD/UyaEmAIgplHI9yEexifKE37IxFQc/movMJ9DmXKJTWnH4Mz9/1bqgQYmAXApG13qgWwOuqkTAgDEVA2Iu0Ftg5iqw181qU1yhiYxNVIPB+phNsRGkXqgukmkrhICAMS0EA02ianQP7eYukNYU0zLMW90/myjTj2cMQ0mZhnJAyCm1chQjYmlmGbzmnr03CSm0TpW2zDfNXbPchIO3rPU7V8XIyHmTAEQUzXW7Ye1UkyNpf80lPMP88PTfWyMTNNF9i9qTK4yGf02ZKnLtXxZTMQUADEF37xH+V4EAEBMoTrxsHHMIwAAYgq2nNZvLwAAxBQAABBTAADEFAAAMQUAQEwNGh7uGe60PMWqzGlTBwDEdDIxHXnA5JI6aeqYlgAAYoqYAsC6xDTygU5G1YnYZHIW3Jc5RpZqns2xdGapZ/n02EgbVlDVx/yz/UTZDWNss0QAcDlimvtAFzyb80f1o6fXG5VCRpq2E3P+tGeWT8NG2iqRMzJV+dRll8bYhRIBwAUO8z0e9dHH+OHLEYNwJcAlJ+ZCCoevTEsUXaIGMU0SNsqe+/rhLQ1wj8XU9mxOxbQQN/pIPZuLTsxpCnk+LTE1SuRXtjSfRtkN8cZbGuA+imnJs7kUmSYf20V1PyAvKHL8pcqn+YITXaL2MLE7lVH2SiQMAPdNTC3PZlvO4tnAcDLWPeK33+Fkpp7m0xZTWaL2KcxoIjQvu1JnzKcA7uswX7kmZ4PVw2HBirZYZy9LiPZsrls+hys8ST6NYb7tQu1ZZ7fyKcpuhLqWtzQAXIiYzoh8ARMAAGLapKMoKQAgpgAAgJgCACCmAACIKQAAYgoAAPdQTHG2BgDEdFkxHXnAabNbA8sUAMQUMUVMAS5JTD1WyvopT2XkXPGWDh6+/BKZqKohcOdHWlcnnK1xtgZYg5gqK2VpZuxxO+02Cifm4ZyB74ftmuwVU5ytR+UTZ2uAycVUeywJM2OpN1UREk5U0XV6jGsyztY4WwOsWUxtM+PUINnaKJyYgys6Nts7wjUZZ2ucrQHWLqZlWZGGUP1G7cQczpgG0nPMJBzO1jhbA6x6mO8au0sLZDXJtvugr8lCQv4FKHs+AWdrM584WwPML6bpIrtcQI4u7nT4KZ2Y5Vq+7Zo8WkxxtnbmE2drgAnFdDHEeHvVVyXO1gCwSjGNJ+lWPXTE2RoA1ium6TCfSTgAQEwBABBTAABATAEAEFMAAMQUAAAxBQAAxBQAADEFAEBMAQAAMQUAQEwBABBTAIDL4f+9xQMz8c2S2gAAAABJRU5ErkJggg=="}}]); \ No newline at end of file diff --git a/assets/js/eb2a6637.01009699.js b/assets/js/eb2a6637.01009699.js deleted file mode 100644 index 2fe64b0c..00000000 --- a/assets/js/eb2a6637.01009699.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6388],{3905:(e,a,t)=>{t.d(a,{Zo:()=>s,kt:()=>A});var n=t(7294);function i(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(i[t]=e[t]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var u=n.createContext({}),m=function(e){var a=n.useContext(u),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},s=function(e){var a=m(e.components);return n.createElement(u.Provider,{value:a},e.children)},d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},k=n.forwardRef((function(e,a){var t=e.components,i=e.mdxType,r=e.originalType,u=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),k=m(t),A=i,o=k["".concat(u,".").concat(A)]||k[A]||d[A]||r;return t?n.createElement(o,l(l({ref:a},s),{},{components:t})):n.createElement(o,l({ref:a},s))}));function A(e,a){var t=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=t.length,l=new Array(r);l[0]=k;var p={};for(var u in a)hasOwnProperty.call(a,u)&&(p[u]=a[u]);p.originalType=e,p.mdxType="string"==typeof e?e:i,l[1]=p;for(var m=2;m{t.r(a),t.d(a,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>m});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:29,title:"A.29. Module System \u279c Use, Import, Re-export",sidebar_label:"A.29. Module System \u279c Use, Import, Re-export"},l=void 0,p={unversionedId:"basic/use",id:"basic/use",title:"A.29. Module System \u279c Use, Import, Re-export",description:"Keyword use digunakan untuk dua hal, yaitu import path dan re-export path. Sebenarnya kita telah mempelajari kedua penerapan tersebut pada beberapa chapter sebelumnya. Pada chapter ini kita akan ulang lagi pembahasan agar lebih jelas.",source:"@site/docs/basic/use.md",sourceDirName:"basic",slug:"/basic/use",permalink:"/basic/use",draft:!1,tags:[],version:"current",sidebarPosition:29,frontMatter:{sidebar_position:29,title:"A.29. Module System \u279c Use, Import, Re-export",sidebar_label:"A.29. Module System \u279c Use, Import, Re-export"},sidebar:"tutorialSidebar",previous:{title:"A.28. Module System \u279c Visibility & Privacy",permalink:"/basic/visibility-privacy"},next:{title:"A.30. Block Expression",permalink:"/basic/block-expression"}},u={},m=[{value:"A.29.1. Keyword use untuk import path",id:"a291-keyword-use-untuk-import-path",level:2},{value:"\u25c9 Import items dari module yang sama",id:"-import-items-dari-module-yang-sama",level:3},{value:"A.29.2. Keyword use untuk re-export path",id:"a292-keyword-use-untuk-re-export-path",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:m};function d(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},s,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," digunakan untuk dua hal, yaitu ",(0,i.kt)("em",{parentName:"p"},"import")," path dan ",(0,i.kt)("em",{parentName:"p"},"re-export")," path. Sebenarnya kita telah mempelajari kedua penerapan tersebut pada beberapa chapter sebelumnya. Pada chapter ini kita akan ulang lagi pembahasan agar lebih jelas."),(0,i.kt)("h2",{id:"a291-keyword-use-untuk-import-path"},"A.29.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"use")," untuk import path"),(0,i.kt)("p",null,"Untuk bisa menggunakan sebuah item dari crate lain, entah itu dari rust standard library crate maupun 3rd-party, caranya cukup dengan menuliskan path item. Contohnya bisa dilihat dibawah ini, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"current_dir")," digunakan untuk mengambil path dari current directory. Fungsi tersebut merupakan item dari module ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env"),", maka untuk mengaksesnya kita harus menuliskan path secara lengkap."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let package_path = std::env::current_dir().unwrap();\nprintln!("package_path: {:?}", package_path);\n')),(0,i.kt)("p",null,"Selain cara di atas, bisa juga gunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," untuk meng-import fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"current_dir")," ke kode program, dengannya kita tidak perlu menulis path secara lengkap. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::env::current_dir;\n\nfn main() {\n let package_path = current_dir().unwrap();\n println!("package_path: {:?}", package_path);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Rust use",src:t(9772).Z,width:"818",height:"104"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di contoh, pengaksesan current directory di-chain dengan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," karena nilai balik fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"current_dir")," adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::Result"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai tipe tersebut dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h3",{id:"-import-items-dari-module-yang-sama"},"\u25c9 Import items dari module yang sama"),(0,i.kt)("p",null,"Pada contoh selanjutnya ini, kita akan coba praktikkan penerapan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env::args")," untuk mengambil ",(0,i.kt)("em",{parentName:"p"},"argument")," saat eksekusi program, kemudian menampilkannya ke layar."),(0,i.kt)("p",null,"Ok, berarti akan ada 2 path yang akan di-import:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::env::current_dir;\nuse std::env::args;\n")),(0,i.kt)("p",null,"Ada notasi penulisan import path lainnya yang bisa digunakan jika path-nya memiliki parent segment yang sama. Contohnya seperti di atas, kedua fungsi tersebut memiliki parent segment path yang sama yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env"),". Yang seperti ini bisa dituliskan juga dengan notasi penulisan import berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::env::{current_dir, args};\n")),(0,i.kt)("p",null,"Ok, lanjut ke praktik. Silakan tulis kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::env::{current_dir, args};\n\nfn main() {\n let package_path = current_dir().unwrap();\n println!("package_path: {:?}", package_path);\n\n for i in 1..=args().len() {\n let each_arg = args().nth(i);\n if each_arg != None {\n println!("arg{}: {:?}", i, each_arg.unwrap());\n }\n }\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env::args")," digunakan untuk mengambil argument eksekusi program baik eksekusi via ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run")," ataupun via pemanggilan binary. Fungsi tersebut nilai baliknya adalah iterator, jadi bisa digunakan dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," dengan mudah."),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"args().nth(i)")," mengembalikan nilai argument pada index ke-",(0,i.kt)("inlineCode",{parentName:"p"},"i")," dalam tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),", dan nilai tersebut bisa saja tidak ada (direpresentasikan dengan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"). Oleh karena itu penting untuk dicek terlebih dahulu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if"),". Jika memang nilainya adalah selain ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," untuk mengambil nilainya dalam tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai Iterator akan dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator"),"."),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"Option")," akan dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"li",href:"/basic/option-type"},"Tipe Data \u279c Option"),"."))),(0,i.kt)("p",null,"Silakan coba jalankan menggunakan dua command, yang pertama ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run"),", kemudian ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run tulis argumen di sini dengan pembatas spasi"),"."),(0,i.kt)("p",null,"Bisa dilihat pada gambar berikut, jika ada argument disisipkan dalam eksekusi program, maka ditampilkan. Pada gambar berikut dicontohkan argument yang dipakai adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"hello")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"world"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Rust use",src:t(4887).Z,width:"793",height:"223"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai Iterator dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/trait-iterator"},"Trait \u279c Iterator"))),(0,i.kt)("h2",{id:"a292-keyword-use-untuk-re-export-path"},"A.29.2. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"use")," untuk re-export path"),(0,i.kt)("p",null,"Re-export item adalah sebuah cara untuk mem-",(0,i.kt)("em",{parentName:"p"},"bypass")," pengaksesan item yang secara hirarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module."),(0,i.kt)("p",null,"Item yang di-re-export akan menjadi item milik ",(0,i.kt)("em",{parentName:"p"},"current module")," dimana statement re-export tersebut ditulis."),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub use")," digunakan untuk operasi re-export. Notasi penulisannya bisa dilihat di bawah ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// pub use the_path\npub use self::sub_module::say_hello_message;\n\n// pub use the_path as exported_name;\npub use self::sub_module::say_hello_message as say_hello;\n")),(0,i.kt)("p",null,"Contoh penerapan bisa dilihat pada kode berikut. Submodule ",(0,i.kt)("inlineCode",{parentName:"p"},"sub_module")," milik module ",(0,i.kt)("inlineCode",{parentName:"p"},"messaging")," adalah private module, yang di dalamnya ada item dengan visibility publik."),(0,i.kt)("p",null,"Agar ",(0,i.kt)("inlineCode",{parentName:"p"},"say_hello_message")," tidak bisa diakses dari ",(0,i.kt)("em",{parentName:"p"},"crate root")," karena ",(0,i.kt)("inlineCode",{parentName:"p"},"sub_module")," yang merupakan module scope item tersebut adalah private. Agar item tersebut bisa diakses dari publik, maka bisa dengan menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"re-export"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::sub_module::say_hello_message;\n\nmod sub_module {\n\n pub fn say_hello_message() {\n println!("hello rust")\n }\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello_message();\n}\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Visibility & Privacy",src:t(2201).Z,width:"466",height:"109"})),(0,i.kt)("p",null,"Bisa dilihat item ",(0,i.kt)("inlineCode",{parentName:"p"},"say_hello_message")," sekarang bisa diakses dari fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," via path ",(0,i.kt)("inlineCode",{parentName:"p"},"messaging::say_hello_message")," setelah di-re-export."),(0,i.kt)("p",null,"O iya, jika suatu item ingin di-re-export dengan nama berbeda, tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"as")," diikuti alias atau nama item export. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::sub_module::say_hello_message as say_hello;\n\nmod sub_module {\n\n pub fn say_hello_message() {\n println!("hello rust")\n }\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello();\n}\n")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/use"},"github.com/novalagung/dasarpemrogramanrust-example/../use")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.use.html"},"https://doc.rust-lang.org/std/keyword.use.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items/use-declarations.html"},"https://doc.rust-lang.org/reference/items/use-declarations.html"))))}d.isMDXComponent=!0},9772:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzIAAABoCAIAAAClqlJ2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTEtMTZUMTQ6MzE6NDArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjQwOjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjQwOjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZiYWZlMThkLWYxNzEt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"},4887:(e,a,t)=>{t.d(a,{Z:()=>n});const n=t.p+"assets/images/use-2-14040eb5ebbc4bd6148eec31b7d9f2e7.png"},2201:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdIAAABtCAIAAACa6Xd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTEtMTRUMTM6MjI6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBmNDI1NTJiLTNmYTgt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"}}]); \ No newline at end of file diff --git a/assets/js/eb2a6637.570a9def.js b/assets/js/eb2a6637.570a9def.js new file mode 100644 index 00000000..4102ce1a --- /dev/null +++ b/assets/js/eb2a6637.570a9def.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[6388],{3905:(e,a,t)=>{t.d(a,{Zo:()=>s,kt:()=>A});var n=t(7294);function i(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function r(e,a){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);a&&(n=n.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),t.push.apply(t,n)}return t}function l(e){for(var a=1;a=0||(i[t]=e[t]);return i}(e,a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}var u=n.createContext({}),m=function(e){var a=n.useContext(u),t=a;return e&&(t="function"==typeof e?e(a):l(l({},a),e)),t},s=function(e){var a=m(e.components);return n.createElement(u.Provider,{value:a},e.children)},d={inlineCode:"code",wrapper:function(e){var a=e.children;return n.createElement(n.Fragment,{},a)}},k=n.forwardRef((function(e,a){var t=e.components,i=e.mdxType,r=e.originalType,u=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),k=m(t),A=i,o=k["".concat(u,".").concat(A)]||k[A]||d[A]||r;return t?n.createElement(o,l(l({ref:a},s),{},{components:t})):n.createElement(o,l({ref:a},s))}));function A(e,a){var t=arguments,i=a&&a.mdxType;if("string"==typeof e||i){var r=t.length,l=new Array(r);l[0]=k;var p={};for(var u in a)hasOwnProperty.call(a,u)&&(p[u]=a[u]);p.originalType=e,p.mdxType="string"==typeof e?e:i,l[1]=p;for(var m=2;m{t.r(a),t.d(a,{assets:()=>u,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>m});var n=t(7462),i=(t(7294),t(3905));const r={sidebar_position:29,title:"A.29. Module System \u279c Use, Import, Re-export",sidebar_label:"A.29. Module System \u279c Use, Import, Re-export"},l=void 0,p={unversionedId:"basic/use",id:"basic/use",title:"A.29. Module System \u279c Use, Import, Re-export",description:"Keyword use digunakan untuk dua hal, yaitu import path dan re-export path. Sebenarnya kita telah mempelajari kedua penerapan tersebut pada beberapa chapter sebelumnya. Pada chapter ini kita akan ulang lagi pembahasan agar lebih jelas.",source:"@site/docs/basic/use.md",sourceDirName:"basic",slug:"/basic/use",permalink:"/basic/use",draft:!1,tags:[],version:"current",sidebarPosition:29,frontMatter:{sidebar_position:29,title:"A.29. Module System \u279c Use, Import, Re-export",sidebar_label:"A.29. Module System \u279c Use, Import, Re-export"},sidebar:"tutorialSidebar",previous:{title:"A.28. Module System \u279c Visibility & Privacy",permalink:"/basic/visibility-privacy"},next:{title:"A.30. Block Expression",permalink:"/basic/block-expression"}},u={},m=[{value:"A.29.1. Keyword use untuk import path",id:"a291-keyword-use-untuk-import-path",level:2},{value:"\u25c9 Import items dari module yang sama",id:"-import-items-dari-module-yang-sama",level:3},{value:"A.29.2. Keyword use untuk re-export path",id:"a292-keyword-use-untuk-re-export-path",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],s={toc:m};function d(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},s,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," digunakan untuk dua hal, yaitu ",(0,i.kt)("em",{parentName:"p"},"import")," path dan ",(0,i.kt)("em",{parentName:"p"},"re-export")," path. Sebenarnya kita telah mempelajari kedua penerapan tersebut pada beberapa chapter sebelumnya. Pada chapter ini kita akan ulang lagi pembahasan agar lebih jelas."),(0,i.kt)("h2",{id:"a291-keyword-use-untuk-import-path"},"A.29.1. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"use")," untuk import path"),(0,i.kt)("p",null,"Untuk bisa menggunakan sebuah item dari crate lain, entah itu dari rust standard library crate maupun 3rd-party, caranya cukup dengan menuliskan path item. Contohnya bisa dilihat di bawah ini, fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"current_dir")," digunakan untuk mengambil path dari current directory. Fungsi tersebut merupakan item dari module ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env"),", maka untuk mengaksesnya kita harus menuliskan path secara lengkap."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let package_path = std::env::current_dir().unwrap();\nprintln!("package_path: {:?}", package_path);\n')),(0,i.kt)("p",null,"Selain cara di atas, bisa juga gunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"use")," untuk meng-import fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"current_dir")," ke kode program, dengannya kita tidak perlu menulis path secara lengkap. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::env::current_dir;\n\nfn main() {\n let package_path = current_dir().unwrap();\n println!("package_path: {:?}", package_path);\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Rust use",src:t(9772).Z,width:"818",height:"104"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Di contoh, pengaksesan current directory di-chain dengan method ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," karena nilai balik fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"current_dir")," adalah bertipe ",(0,i.kt)("inlineCode",{parentName:"p"},"std::io::Result"),"."),(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai tipe tersebut dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/result-type"},"Tipe Data \u279c Result"))),(0,i.kt)("h3",{id:"-import-items-dari-module-yang-sama"},"\u25c9 Import items dari module yang sama"),(0,i.kt)("p",null,"Pada contoh selanjutnya ini, kita akan coba praktikkan penerapan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env::args")," untuk mengambil ",(0,i.kt)("em",{parentName:"p"},"argument")," saat eksekusi program, kemudian menampilkannya ke layar."),(0,i.kt)("p",null,"Ok, berarti akan ada 2 path yang akan di-import:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::env::current_dir;\nuse std::env::args;\n")),(0,i.kt)("p",null,"Ada notasi penulisan import path lainnya yang bisa digunakan jika path-nya memiliki parent segment yang sama. Contohnya seperti di atas, kedua fungsi tersebut memiliki parent segment path yang sama yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env"),". Yang seperti ini bisa dituliskan juga dengan notasi penulisan import berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"use std::env::{current_dir, args};\n")),(0,i.kt)("p",null,"Ok, lanjut ke praktik. Silakan tulis kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'use std::env::{current_dir, args};\n\nfn main() {\n let package_path = current_dir().unwrap();\n println!("package_path: {:?}", package_path);\n\n for i in 1..=args().len() {\n let each_arg = args().nth(i);\n if each_arg != None {\n println!("arg{}: {:?}", i, each_arg.unwrap());\n }\n }\n}\n')),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::env::args")," digunakan untuk mengambil argument eksekusi program baik eksekusi via ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run")," ataupun via pemanggilan binary. Fungsi tersebut nilai baliknya adalah iterator, jadi bisa digunakan dalam blok kode ",(0,i.kt)("inlineCode",{parentName:"p"},"for in")," dengan mudah."),(0,i.kt)("p",null,"Statement ",(0,i.kt)("inlineCode",{parentName:"p"},"args().nth(i)")," mengembalikan nilai argument pada index ke-",(0,i.kt)("inlineCode",{parentName:"p"},"i")," dalam tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Option"),", dan nilai tersebut bisa saja tidak ada (direpresentasikan dengan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),"). Oleh karena itu penting untuk dicek terlebih dahulu menggunakan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"if"),". Jika memang nilainya adalah selain ",(0,i.kt)("inlineCode",{parentName:"p"},"None"),", gunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"unwrap")," untuk mengambil nilainya dalam tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"."),(0,i.kt)("blockquote",null,(0,i.kt)("ul",{parentName:"blockquote"},(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai Iterator akan dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"li",href:"/basic/trait-iterator"},"Trait \u279c Iterator"),"."),(0,i.kt)("li",{parentName:"ul"},"Lebih jelasnya mengenai tipe ",(0,i.kt)("inlineCode",{parentName:"li"},"Option")," akan dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"li",href:"/basic/option-type"},"Tipe Data \u279c Option"),"."))),(0,i.kt)("p",null,"Silakan coba jalankan menggunakan dua command, yang pertama ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run"),", kemudian ",(0,i.kt)("inlineCode",{parentName:"p"},"cargo run tulis argumen di sini dengan pembatas spasi"),"."),(0,i.kt)("p",null,"Bisa dilihat pada gambar berikut, jika ada argument disisipkan dalam eksekusi program, maka ditampilkan. Pada gambar berikut dicontohkan argument yang dipakai adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"hello")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"world"),"."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Rust use",src:t(4887).Z,width:"793",height:"223"})),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai Iterator dibahas pada chapter terpisah, ",(0,i.kt)("a",{parentName:"p",href:"/basic/trait-iterator"},"Trait \u279c Iterator"))),(0,i.kt)("h2",{id:"a292-keyword-use-untuk-re-export-path"},"A.29.2. Keyword ",(0,i.kt)("inlineCode",{parentName:"h2"},"use")," untuk re-export path"),(0,i.kt)("p",null,"Re-export item adalah sebuah cara untuk mem-",(0,i.kt)("em",{parentName:"p"},"bypass")," pengaksesan item yang secara hirarki memang tidak bisa diakses dari luar module (bisa jadi karena visibility item ataupun parent module nya adalah private). Dengan teknik ini, maka item pasti bisa diakses dari luar module."),(0,i.kt)("p",null,"Item yang di-re-export akan menjadi item milik ",(0,i.kt)("em",{parentName:"p"},"current module")," di mana statement re-export tersebut ditulis."),(0,i.kt)("p",null,"Keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"pub use")," digunakan untuk operasi re-export. Notasi penulisannya bisa dilihat di bawah ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},"// pub use the_path\npub use self::sub_module::say_hello_message;\n\n// pub use the_path as exported_name;\npub use self::sub_module::say_hello_message as say_hello;\n")),(0,i.kt)("p",null,"Contoh penerapan bisa dilihat pada kode berikut. Submodule ",(0,i.kt)("inlineCode",{parentName:"p"},"sub_module")," milik module ",(0,i.kt)("inlineCode",{parentName:"p"},"messaging")," adalah private module, yang di dalamnya ada item dengan visibility publik."),(0,i.kt)("p",null,"Agar ",(0,i.kt)("inlineCode",{parentName:"p"},"say_hello_message")," tidak bisa diakses dari ",(0,i.kt)("em",{parentName:"p"},"crate root")," karena ",(0,i.kt)("inlineCode",{parentName:"p"},"sub_module")," yang merupakan module scope item tersebut adalah private. Agar item tersebut bisa diakses dari publik, maka bisa dengan menggunakan teknik ",(0,i.kt)("em",{parentName:"p"},"re-export"),"."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::sub_module::say_hello_message;\n\nmod sub_module {\n\n pub fn say_hello_message() {\n println!("hello rust")\n }\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello_message();\n}\n")),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Visibility & Privacy",src:t(2201).Z,width:"466",height:"109"})),(0,i.kt)("p",null,"Bisa dilihat item ",(0,i.kt)("inlineCode",{parentName:"p"},"say_hello_message")," sekarang bisa diakses dari fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"main")," via path ",(0,i.kt)("inlineCode",{parentName:"p"},"messaging::say_hello_message")," setelah di-re-export."),(0,i.kt)("p",null,"O iya, jika suatu item ingin di-re-export dengan nama berbeda, tambahkan keyword ",(0,i.kt)("inlineCode",{parentName:"p"},"as")," diikuti alias atau nama item export. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/messaging.rs"',title:'"src/messaging.rs"'},'pub use self::sub_module::say_hello_message as say_hello;\n\nmod sub_module {\n\n pub fn say_hello_message() {\n println!("hello rust")\n }\n}\n')),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="src/main.rs"',title:'"src/main.rs"'},"mod messaging;\n\nfn main() {\n messaging::say_hello();\n}\n")),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/use"},"github.com/novalagung/dasarpemrogramanrust-example/../use")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/std/keyword.use.html"},"https://doc.rust-lang.org/std/keyword.use.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/items/use-declarations.html"},"https://doc.rust-lang.org/reference/items/use-declarations.html"))))}d.isMDXComponent=!0},9772:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzIAAABoCAIAAAClqlJ2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTEtMTZUMTQ6MzE6NDArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjQwOjA1KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjQwOjA1KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmZiYWZlMThkLWYxNzEt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"},4887:(e,a,t)=>{t.d(a,{Z:()=>n});const n=t.p+"assets/images/use-2-14040eb5ebbc4bd6148eec31b7d9f2e7.png"},2201:(e,a,t)=>{t.d(a,{Z:()=>n});const n="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdIAAABtCAIAAACa6Xd1AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTEtMTRUMTM6MjI6NDMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTA1VDE4OjM0OjA4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjBmNDI1NTJiLTNmYTgt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"}}]); \ No newline at end of file diff --git a/assets/js/f8d4e457.88f7a231.js b/assets/js/f8d4e457.88f7a231.js deleted file mode 100644 index 1bc90308..00000000 --- a/assets/js/f8d4e457.88f7a231.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[740],{3905:(a,e,n)=>{n.d(e,{Zo:()=>p,kt:()=>o});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var d=i.createContext({}),u=function(a){var e=i.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},p=function(a){var e=u(a.components);return i.createElement(d.Provider,{value:e},a.children)},s={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},k=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,d=a.parentName,p=m(a,["components","mdxType","originalType","parentName"]),k=u(n),o=t,g=k["".concat(d,".").concat(o)]||k[o]||s[o]||l;return n?i.createElement(g,r(r({ref:e},p),{},{components:n})):i.createElement(g,r({ref:e},p))}));function o(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=k;var m={};for(var d in e)hasOwnProperty.call(e,d)&&(m[d]=e[d]);m.originalType=a,m.mdxType="string"==typeof a?a:t,r[1]=m;for(var u=2;u{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>s,frontMatter:()=>l,metadata:()=>m,toc:()=>u});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:42,title:"A.42. Lifetime",sidebar_label:"A.42. Lifetime"},r=void 0,m={unversionedId:"basic/lifetime",id:"basic/lifetime",title:"A.42. Lifetime",description:"Pada chapter ini kita akan belajar tentang lifetime. Lifetime adalah yang digunakan oleh Rust compiler untuk memonitor umur dari references agar tetap dianggap valid.",source:"@site/docs/basic/lifetime.md",sourceDirName:"basic",slug:"/basic/lifetime",permalink:"/basic/lifetime",draft:!1,tags:[],version:"current",sidebarPosition:42,frontMatter:{sidebar_position:42,title:"A.42. Lifetime",sidebar_label:"A.42. Lifetime"},sidebar:"tutorialSidebar",previous:{title:"A.41. Static Item",permalink:"/basic/static"},next:{title:"A.43. Slice Memory Management",permalink:"/basic/slice-memory-management"}},d={},u=[{value:"A.42.1. Konsep Lifetime",id:"a421-konsep-lifetime",level:2},{value:"A.42.2. Relasi antara lifetime dengan owner dan borrower",id:"a422-relasi-antara-lifetime-dengan-owner-dan-borrower",level:2},{value:"A.42.3. Lifetime annotation dan penerapannya pada return value",id:"a423-lifetime-annotation-dan-penerapannya-pada-return-value",level:2},{value:"A.42.4. Lifetime pada parameter",id:"a424-lifetime-pada-parameter",level:2},{value:"A.42.5. Lifetime elision",id:"a425-lifetime-elision",level:2},{value:"A.42.6. Lifetime pada struct",id:"a426-lifetime-pada-struct",level:2},{value:"A.42.7. Lifetime pada method",id:"a427-lifetime-pada-method",level:2},{value:"A.42.8. Generic parameter + trait bounds + lifetime",id:"a428-generic-parameter--trait-bounds--lifetime",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:u};function s(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},p,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Pada chapter ini kita akan belajar tentang lifetime. Lifetime adalah yang digunakan oleh Rust compiler untuk memonitor umur dari references agar tetap dianggap valid."),(0,t.kt)("p",null,"Normalnya kita tidak perlu berurusan dengan lifetime, karena Rust-lah yang mengelola lifetime sebuah reference. Namun di luar itu, pada beberapa case kita bisa me-manage lifetime data dengan memanfaatkan ",(0,t.kt)("em",{parentName:"p"},"annotation"),"."),(0,t.kt)("p",null,"Ketika berurusan dengan data primitif maupun non-primitif tak perlu khawatir perihal urusan lifetime. Aspek lifetime hanya perlu diperhatikan sewaktu berurusan dengan data pointer/reference, apalagi kalau data tersebut keluar masuk block scope."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Topik lifetime adalah salah satu yang paling membingungkan di Rust. Wajar jika membutuhkan waktu lebih lama untuk menguasainya. ",(0,t.kt)("em",{parentName:"p"},"Take your time"),", pelajari pelan-pelan dan ulangi berkali-kali jika perlu.")),(0,t.kt)("h2",{id:"a421-konsep-lifetime"},"A.42.1. Konsep Lifetime"),(0,t.kt)("p",null,"Lifetime adalah yang digunakan oleh Rust compiler untuk memonitor umur dari references agar tetap valid. Lifetime menempel di variabel, lebih tepatnya di reference variabel."),(0,t.kt)("p",null,"Rust menerapkan default lifetime dalam pengecekan reference. Beberapa aturan pada default lifetime sudah kita pelajari pada chapter sebelumnya, seperti variabel yang hanya akan valid di dalam block dan invalid di luar block dan data yang akan di-dealokasi ketika sudah tidak ada reference-nya."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Rust mengidentifikasi default lifetime menggunakan ",(0,t.kt)("strong",{parentName:"p"},"lifetime elision"),", yang juga akan dibahas pada chapter ini.")),(0,t.kt)("p",null,"Agar mudah memahami konsep default lifetime, mari mulai dengan kode sederhana berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let r;\n {\n let x = 5;\n r = &x;\n }\n println!("r: {}", r);\n}\n')),(0,t.kt)("p",null,"Kode di atas kalau di jalankan hasilnya error, karena ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," di-dealokasi ketika block expression selesai dieksekusi, meskipun data tersebut dipinjamkan pada ",(0,t.kt)("inlineCode",{parentName:"p"},"r")," yang scope-nya berada di atasnya."),(0,t.kt)("p",null,"Kalau diilustrasikan, lifetime variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"r")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," kurang lebih seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n let r; // -----------+-- 'lf1\n { // |\n let x = 5; // -+-- 'lf2 |\n r = &x; // | |\n } // -+ |\n println!(\"r: {}\", r); // |\n} // -----------+\n")),(0,t.kt)("p",null,"Setiap data memiliki default lifetime."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"r")," memiliki lifetime yang pada contoh di atas diilustrasikan sebagai ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf1"),"."),(0,t.kt)("li",{parentName:"ul"},"Variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"x")," memiliki lifetime yang pada contoh di atas diilustrasikan sebagai ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf2"),"."),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf2")," milik variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"x")," menjadikan umur variabel tersebut valid mulai variabel tersebut dideklarasikan, hingga block expression selesai."),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf2")," sudah tidak valid di luar block expression. Inilah kenapa program di atas menjadi error."),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf1")," milik variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"r")," menjadikan umur variabel tersebut valid mulai variabel tersebut dideklarasikan, hingga block fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"main")," selesai.")),(0,t.kt)("p",null,"Default lifetime bisa di-override menggunakan lifetime yang kita definisikan sendiri."),(0,t.kt)("h2",{id:"a422-relasi-antara-lifetime-dengan-owner-dan-borrower"},"A.42.2. Relasi antara lifetime dengan owner dan borrower"),(0,t.kt)("p",null,"Lifetime menjadi salah satu hal yang wajib diperhatikan ketika bermain dengan references. Operasi seperti melempar reference ke luar scope, atau memasukan reference ke block scope baru berpotensi memunculkan error yang berhubungan dengan lifetime."),(0,t.kt)("p",null,"Setelah ini kita akan praktik penerapan pembuatan lifetime, namun sebelum itu mari pelajari dulu pembahasan pada section berikut agar tau kenapa dan kapan kita harus menerapkan lifetime yang kita buat sendiri."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let message = String::from("darkspear is better than zandalari");\n print_mesage(&message)\n}\n\nfn print_mesage(m: &String) {\n println!("the message: {m}")\n}\n')),(0,t.kt)("p",null,"Program di atas menampilkan pesan string via fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"print_message"),". Data string didapat dari parameter pointer ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," milik fungsi tersebut."),(0,t.kt)("p",null,"Pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", ada string bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"message"),", niainya dipinjamkan sebagai argument pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"print_message"),"."),(0,t.kt)("p",null,"Setelah eksekusi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"print_message")," selesai, yang terjadi di block kode fungsi tersebut adalah data ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," di-dealokasi. Hasil dari dealokasi sendiri adalah nilai sebenarnya dikembalikan ke owner (pemilik aslinya). Sampai sini harusnya cukup jelas."),(0,t.kt)("p",null,"Sekarang lanjut ke contoh ke-2 berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let m: &String = get_message();\n println!("the message: {m}");\n}\n\nfn get_message() -> &String {\n let message = String::from("darkspear is better than zandalari");\n &message\n}\n')),(0,t.kt)("p",null,"Esensi program ke-2 ini sama seperti program sebelumnya, yaitu menampilkan pesan string yang sama persis. Perbedaannya, pesan string datanya ada di dalam fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_message"),". Fungsi tersebut dipanggil kemudian reference dari pesan string dipinjamkan, maka dengan ini variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," nilainya adalah data pinjaman (borrowing)."),(0,t.kt)("p",null,"Ketika di-run, hasilnya error."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(8116).Z,width:"779",height:"275"})),(0,t.kt)("p",null,"Error tersebut muncul karena setelah eksekusi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_message")," selesai, semua data dalam fungsi tersebut di-dealokasi. Termasuk variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message")," yang merupakan owner dari data yang dipinjamkan ke variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m"),"."),(0,t.kt)("p",null,"Ok, jadi owner-nya sudah di-dealokasi, lalu bagaimana nasib dari peminjam data (variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m"),")? Variabel tersebut menjadi bermasalah, karena owner data aslinya sudah tidak ada di memory, dan itulah kenapa muncul error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Error ini disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"dangling reference"),", muncul ketika data di-share ke variabel lain tapi owner-nya sudah tidak ada di-memory."),(0,t.kt)("p",{parentName:"blockquote"},"Di pemrograman Rust, error jenis ini bisa di-identifikasi saat kompilasi.")),(0,t.kt)("p",null,"Solusi pada error di atas, salah satunya adalah dengan tidak menggunakan tipe data pointer sebagai nilai balik. Gunakan saja tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"String"),". Solusi ini aman, karena tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," owner-nya selalu berpindah saat ada operasi asignment, dengan ini maka manajemen memory menjadi efisien."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'// ganti kode berikut ...\nfn get_message() -> &String {\n let message = String::from("darkspear is better than zandalari");\n message\n}\n\n// ... menjadi ...\nfn get_message() -> String {\n let message = String::from("darkspear is better than zandalari");\n message\n}\n')),(0,t.kt)("p",null,"Ok, bagaimana dengan tipe data lain yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),", misalnya ada kebutuhan untuk share reference data tersebut ke block lain. Mari kita coba."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let n = get_number();\n println!("the number: {n}");\n}\n\nfn get_number() -> &i32 {\n let number = 13;\n &number\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(5384).Z,width:"782",height:"276"})),(0,t.kt)("p",null,"Bisa dilihat, ada error, karena kondisi tersebut menimbulkan dangling reference (sama seperti contoh sebelumnya). Namun pada contoh ini kita tidak bisa menerapkan solusi yang sama, karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"number")," mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),", bukan ",(0,t.kt)("em",{parentName:"p"},"move semantics"),"."),(0,t.kt)("p",null,"Di Rust error dangling reference diantisipasi saat kompilasi, menjadikan kode tidak bisa sukses dikompilasi."),(0,t.kt)("p",null,"Solusi yang bisa diambil adalah dengan menjadikan data tersebut tidak memiliki owner (atau owner-nya adalah program), caranya dengan langsung mengembalikan reference data tanpa perlu menampungnya terlebih dahulu ke variabel, seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let n = get_number();\n println!("the number: {n}");\n}\n\nfn get_number() -> &i32 {\n &13\n}\n')),(0,t.kt)("p",null,"Ok, tapi entah kenapa ketika dilihat masih muncul error."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(6875).Z,width:"777",height:"260"})),(0,t.kt)("p",null,"Error tersebut muncul karena meskipun owner data ",(0,t.kt)("inlineCode",{parentName:"p"},"&13")," adalah program, ketika eksekusi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number")," selesai, data borrow tersebut langsung di-dealokasi, dan tidak ada variabel lain di-luar scope yang menampung reference data tersebut."),(0,t.kt)("p",null,"Agar tidak terjadi proses dealokasi, harus ada variabel yang menampung reference tersebut di-luar scope, tapi cara ini tidak bisa dilakukan karena data-nya saja baru dideklarasikan dalam block fungsi, tidak mungkin tiba-tiba ada yang menampung di-luar scope."),(0,t.kt)("p",null,"Solusi dari masalah ini adalah menggunakan lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," (yang detailnya sudah dibahas pada chapter sebelumnya). Dengan ini maka data reference ",(0,t.kt)("inlineCode",{parentName:"p"},"&13")," hidup lebih lama dari umur yang sebenarnya sudah ditakdirkan untuk data data tersebut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn get_number() -> &'static i32 {\n &13\n}\n")),(0,t.kt)("p",null,"Namun perlu diingat, bahwa data efek dari lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," adalah data tidak akan pernah di-dealokasi. Data tersebut akan hidup selamanya di program hingga kecuali program dimatikan. Karena alasan itulah penggunaan ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," pada contoh ini bisa disebut berlebihan."),(0,t.kt)("p",null,"Solusi yang lebih pas adalah dengan membuat lifetime sendiri dengan cara menerapkan ",(0,t.kt)("strong",{parentName:"p"},"lifetime annotation")," (tidak menggunakan lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static"),")."),(0,t.kt)("h2",{id:"a423-lifetime-annotation-dan-penerapannya-pada-return-value"},"A.42.3. Lifetime annotation dan penerapannya pada return value"),(0,t.kt)("p",null,"Lifetime dituliskan dengan notasi ",(0,t.kt)("inlineCode",{parentName:"p"},"'nama_lifetime"),". Dengan notasi tersebut, kita bisa menciptakan lifetime baru misalnya ",(0,t.kt)("inlineCode",{parentName:"p"},"'a"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"'b"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"'ini_lifetime"),", dst."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"&i32 // => tipe data reference i32\n&'a i32 // => tipe data reference i32 dengan lifetime 'a\n&'a mut i32 // => tipe data mutable reference i32 dengan lifetime 'a\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lifetime dan block label memiliki bentuk literal yang sama, keduanya diawali tanda kutip ",(0,t.kt)("inlineCode",{parentName:"p"},"'"),". Yang membedakan hanya pada tempat dimana syntax tersebut ditulis.")),(0,t.kt)("p",null,"Kegunaan dari lifetime annotation adalah untuk menginformasikan compiler agar reference tidak langsung didealokasikan setelah eksekusi block selesai. Agar lebih jelas mari kita langsung terapkan saja pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number")," yang sudah ditulis. Silakan tambahkan lifetime dengan nama bebas. Di sini penulis gunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"'my_lifetime"),".nnnn"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn get_number() -> &'my_lifetime i32 {\n &13\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(4982).Z,width:"689",height:"184"})),(0,t.kt)("p",null,"Meski sudah ditambahkan, error tetap muncul, karena lifetime tersebut tidak dikenal. Berbeda dengan lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," yang memang sudah disediakan oleh Rust."),(0,t.kt)("p",null,"Step selanjutnya adalah mengenalkan lifetime tersebut, caranya dengan menambahkannya dalam notasi parameter generic fungsi, seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn get_number<'my_lifetime>() -> &'my_lifetime i32 {\n &13\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number")," sekarang tidak menghasilkan error, karena reference yang dikembalikan memiliki umur ",(0,t.kt)("inlineCode",{parentName:"p"},"'my_lifetime")," yang membuatnya tetap valid sampai menjadi return value, meski eksekusi block fungsi-nya sendiri sudah selesai. Efeknya, data yang di-return bisa ditampung di luar scope fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number"),"."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(4734).Z,width:"460",height:"104"})),(0,t.kt)("p",null,"Tanpa adanya lifetime pada return value, maka data return value akan langsung di-dealokasi setelah block fungsi selesai dieksekusi. Tapi karena hal ini ",(0,t.kt)("em",{parentName:"p"},"by default")," sudah di-handle Rust, maka kita tidak perlu memikirkannya."),(0,t.kt)("h2",{id:"a424-lifetime-pada-parameter"},"A.42.4. Lifetime pada parameter"),(0,t.kt)("p",null,"Pada praktik ini kita akan bahas penerapan lifetime pada parameter."),(0,t.kt)("p",null,"Silakan perhatikan kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v1(x: &str) -> &str {\n x\n}\n")),(0,t.kt)("p",null,"Kode di atas tidak menghasilkan error, karena kalau dilihat dari sudut pandang lifetime (sesuai dengan aturan lifetime elision), yang sebenarnya terjadi adalah kurang lebih seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v2<'a>(x: &'a str) -> &'a str {\n x\n}\n")),(0,t.kt)("p",null,"Pada saat parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," masuk ke fungsi, ",(0,t.kt)("em",{parentName:"p"},"by default")," variabel tersebut memiliki lifetime (yang pada contoh di atas diilustrasikan dengan `'a'). Lifetime tersebut akan aktif hingga menjadi return value karena lifetime yang sama digunakan juga pada return value. Dengan ini nantinya setelah fungsi selesai dieksekusi, nilai baliknya tetap bisa ditampung."),(0,t.kt)("p",null,"Beda lagi jika lifetime lain digunakan pada nilai balik fungsi, misalnya:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v3<'a, 'b>(x: &'a str) -> &'b str {\n x\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(5109).Z,width:"736",height:"204"})),(0,t.kt)("p",null,"Error muncul dengan keterangan kurang lebih: data yang dijadikan return value pada block fungsi akan valid untuk lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'b"),", namun data yang dijadikan return value hanya valid untuk lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'a"),"."),(0,t.kt)("p",null,"Dari sini bisa ditarik kesimpulan: data yang didapat dari luar scope (yang memiliki lifetime sendiri) ketika digunakan sebagai nilai balik, lifetime-nya harus sama."),(0,t.kt)("p",null,"Sekarang mari kita modifikasi lagi fungsi menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v4<'a, 'b, 'c>(x: &'a str, y: &'b str) -> &'c str {\n \"hello\"\n}\n")),(0,t.kt)("p",null,"Fungsi di atas memiliki 2 buah lifetime, yaitu:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'a"),", digunakan pada parameter ",(0,t.kt)("inlineCode",{parentName:"li"},"x")),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'b"),", digunakan pada parameter ",(0,t.kt)("inlineCode",{parentName:"li"},"y")),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'c"),", digunakan pada return value")),(0,t.kt)("p",null,"Karena yang dikembalikan ada data baru, yaitu string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello"),", maka kode di atas tidak error. Data tersebut lifetime-nya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"'c"),", dan akan tetap valid setelah pemanggilan fungsi selesai."),(0,t.kt)("p",null,"Beda situasi jika yang dikembalikan adalah data dari parameter, misalnya, ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),". Jika seperti ini, maka lifetime yang sama dengan lifetime parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," harus digunakan, yaitu lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'b"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v5<'a, 'b, 'c>(x: &'a str, y: &'b str) -> &'b str {\n y\n}\n")),(0,t.kt)("p",null,"Pada kode di atas, lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'c")," tidak dipergunakan sama sekali, maka lifetime tersebut boleh dihapus dari fungsi. Silakan cukup definisikan lifetime yang hanya digunakan saja pada block parameter generic."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v6<'a, 'b>(x: &'a str, y: &'b str) -> &'b str {\n y\n}\n")),(0,t.kt)("p",null,"Dimisalkan ada seleksi kondisi, jadi return value bisa saja ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),", bisa juga ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),". Jika seperti ini, maka ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),", dan juga return value harus memiliki lifetime yang sama."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v7<'a>(x: &'a str, y: &'a str) -> &'a str {\n if x.len() < y.len() {\n x\n } else {\n y\n }\n}\n")),(0,t.kt)("h2",{id:"a425-lifetime-elision"},"A.42.5. Lifetime elision"),(0,t.kt)("p",null,"Sampai section ini kita telah mempelajari kurang lebih 4 point berikut:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Setiap data, lebih tepatnya setiap reference memiliki lifetime."),(0,t.kt)("li",{parentName:"ol"},"Lifetime digunakan oleh Rust dalam penentuan kapan reference tersebut di-dealokasi."),(0,t.kt)("li",{parentName:"ol"},"Pada beberapa case, lifetime perlu di-urus secara eksplisit (contohnya seperti pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"do_something_vx")," di atas)."),(0,t.kt)("li",{parentName:"ol"},"Pengecekan lifetime terjadi saat kompilasi.")),(0,t.kt)("p",null,"Rust memiliki sesuatu yang disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"lifetime elision"),", isinya adalah aturan yang digunakan oleh Rust dalam menganalisa reference untuk menentukan lifetime ",(0,t.kt)("em",{parentName:"p"},"default"),"-nya."),(0,t.kt)("p",null,"Namun, bukan berarti Rust akan selalu tau lifetime tiap reference. Pada beberapa case, Rust membutuhkan bantuan kita selaku programmer untuk menginformasikan lifetime reference kode yang ditulis, contohnya seperti pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something_v7")," di atas."),(0,t.kt)("p",null,"Meskipun demikian, tak usah terlalu khawatir, karena pengecekan lifetime reference terjadi saat kompilasi, dan ketika ada reference yang perlu dikasih ",(0,t.kt)("em",{parentName:"p"},"annotication"),", Rust akan menginformasikan ke kita via pesan error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Untuk sekarang, pembahasan detail mengenai lifetime elision tidak dibahas pada ebook ini. Silakan gunakan dokumentasi official Rust untuk ",(0,t.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/nomicon/lifetime-elision.html"},"lifetime elision")," jika berminat untuk pengkajian yang lebih dalam.")),(0,t.kt)("p",null,"Jika kawan-kawan menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"rust-analyzer")," extension di VSCode, tak perlu meng-compiler program untuk memunculkan error-nya, karena langsung muncul saat penulisan kode program."),(0,t.kt)("h2",{id:"a426-lifetime-pada-struct"},"A.42.6. Lifetime pada struct"),(0,t.kt)("p",null,"Tak hanya pada parameter fungsi dan return value fungsi, lifetime juga bisa diterapkan pada (property) struct."),(0,t.kt)("p",null,"Ketika menggunakan tipe data reference sebagai tipe property struct, Rust langsung menginformasikan kita via error message jika tidak ada anotasi lifetime pada field tersebut."),(0,t.kt)("p",null,"Contohnya bisa dilihat pada kode di bawah ini. Pesan error muncul karena tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"&str")," pada property struct tidak ada lifetime annotation-nya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book {\n title: &str,\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(7106).Z,width:"725",height:"160"})),(0,t.kt)("p",null,"Solusinya, tambahkan anotasi lifetime pada tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"&str"),", dan juga daftarkan lifetime tersebut pada struct. Notasi penulisannya seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// struct NamaStruct<'lifetime_annotication> {\n// field: &'lifetime_annotication tipe_data,\n// }\n\nstruct Book<'abc> {\n title: &'abc str,\n}\n")),(0,t.kt)("p",null,"Contoh jika ada lebih dari 1 field dengan lifetime sama:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book<'abc> {\n title: &'abc str,\n description: &'abc str,\n}\n")),(0,t.kt)("p",null,"Contoh jika ada beberapa field yang di antaranya memiliki lifetime berbeda (artinya ada lebih dari 1 lifetime):"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book<'abc, 'def> {\n title: &'abc str,\n description: &'abc str,\n price: &'def i32,\n}\n\nfn main() {\n let book = Book {\n title: \"The Silmarillion\",\n description: \"Good story, 10/10, would read again\",\n price: &99,\n };\n}\n")),(0,t.kt)("h2",{id:"a427-lifetime-pada-method"},"A.42.7. Lifetime pada method"),(0,t.kt)("p",null,"Ada 2 hal yang perlu diketahui dalam penerapan lifetime pada method. Yang pertama, lifetime annotication harus ditulis pada block ",(0,t.kt)("inlineCode",{parentName:"p"},"impl")," meskipun pada block method tidak digunakan secara langsung."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book<'abc, 'def> {\n title: &'abc str,\n description: &'abc str,\n price: &'def i32,\n}\n\nimpl<'abc, 'def> Book<'abc, 'def> {\n\n fn get_info(&self) -> String {\n let info = format!(\"{} (${}), {}\", self.title, self.price, self.description);\n info\n }\n}\n")),(0,t.kt)("p",null,"Bisa dilihat statement block ",(0,t.kt)("inlineCode",{parentName:"p"},"impl<'abc, 'def> Book<'abc, 'def>"),", lifetime annotation-nya sama persis dengan yang ada di struct. Jika ingin mengetes, silakan coba saja hapus syntax lifetime dari statement itu, pasti muncul error."),(0,t.kt)("p",null,"Hal ke-2 yang penting diketahui, pada block kode method, tidak perlu menuliskan lifetime annotation, karena sudah ditulis di block kode ",(0,t.kt)("inlineCode",{parentName:"p"},"impl"),"."),(0,t.kt)("p",null,"Sebagai contoh, dua method berikut tidak memunculkan error:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// ...\n\nimpl<'abc, 'def> Book<'abc, 'def> {\n\n fn get_info(&self) -> String {\n let info = format!(\"{} (${}), {}\", self.title, self.price, self.description);\n info\n }\n\n fn get_price(&self) -> &i32 {\n self.price\n }\n}\n")),(0,t.kt)("p",null,"Bandingkan dengan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_book_price")," berikut, error muncul karena lifetime annotation tidak ditambahkan ke block fungsi (meskipun fungsi tersebut mengembalikan property ",(0,t.kt)("inlineCode",{parentName:"p"},"price")," milik struct ",(0,t.kt)("inlineCode",{parentName:"p"},"Book")," yang sudah memiliki lifetime sendiri). Hal ini karena data ",(0,t.kt)("inlineCode",{parentName:"p"},"&i32")," yang dikembalikan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"book.get_price()")," langsung didealokasi setelah block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_book_price")," selesai dieksekusi."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(378).Z,width:"813",height:"223"})),(0,t.kt)("p",null,"Agar error tidak muncul, tambahkan lifetime:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"ke return value (karena tipe data return value adalah reference)"),(0,t.kt)("li",{parentName:"ol"},"lalu pada parameter ",(0,t.kt)("inlineCode",{parentName:"li"},"book")," (karena di block fungsi return value berasal dari data milik property variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"book"),"),"),(0,t.kt)("li",{parentName:"ol"},"dan juga tak lupa daftarkan lifetime annotation pada block fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"get_book_price"),".")),(0,t.kt)("p",null,"Kurang kode menjadi seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'// ...\n\nfn get_book_price<\'ghi>(book: &\'ghi Book) -> &\'ghi i32 {\n book.get_price()\n}\n\nfn main() {\n let book = Book {\n title: "The Silmarillion",\n description: "Good story, 10/10, would read again",\n price: &99,\n };\n\n println!("{}", book.get_info());\n println!("the price: {}", get_book_price(&book));\n}\n')),(0,t.kt)("p",null,"Run program, hasilnya sukses."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(7146).Z,width:"473",height:"127"})),(0,t.kt)("h2",{id:"a428-generic-parameter--trait-bounds--lifetime"},"A.42.8. Generic parameter + trait bounds + lifetime"),(0,t.kt)("p",null,"Lalu bagaimana jika ada fungsi yang disitu ada penerapan trait bounds, ada juga generic parameter, dan lifetime annotation. Cara penulisannya seperti apa? Silakan lihat contoh berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_greater_number<'a, T>(\n x: &'a T,\n y: &'a T,\n) -> &'a T\nwhere\n T: std::cmp::PartialOrd,\n{\n if x > y {\n x\n } else {\n y\n }\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_greater_number")," di atas digunakan untuk mencari angka terbesar dari dua inputan parameter (",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),"), dengan tipe data yang digunakan adalah generic ",(0,t.kt)("inlineCode",{parentName:"p"},"T"),". Dari sini maka nantinya fungsi ini bisa digunakan pada data bertipe ",(0,t.kt)("inlineCode",{parentName:"p"},"i32"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"f64"),", dan data numerik lainnya."),(0,t.kt)("p",null,"Tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"T")," diasosiasikan dengan trait ",(0,t.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd")," agar variabel dengan tipe tersebut bisa digunakan dalam seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," yang ada dalam block fungsi tersebut."),(0,t.kt)("p",null,"Ok, sampai sini semoga cukup jelas. Lalu bagaimana dengan lifetime annotation-nya? Karena lifetime annotation definisinya berada pada tempat yang sama dengan definisi tipe generic, maka langsung saja tulis disitu tanpa memperhatikan urutan. Sebagai contoh, dua definisi block fungsi berikut adalah ekuivalen."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn say_hello_v1<'abc, T>()\nfn say_hello_v2()\n")),(0,t.kt)("p",null,"Sekarang kembali ke pembahasan di atas. Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_greater_number")," mengembalikan tipe data reference ",(0,t.kt)("inlineCode",{parentName:"p"},"&T")," yang nilainya bisa saja dari ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),". Dari sini maka wajib hukumnya untuk return value memiliki lifetime yang sama dengan ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),". Itulah kenapa definisi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_greater_number")," agak panjang."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_greater_number<'a, T>(x: &'a T, y: &'a T) -> &'a T\n")),(0,t.kt)("p",null,"Lanjut, mari kita panggil fungsi tersebut pada dua block expression. Block pertama untuk pengecekan data numerik ",(0,t.kt)("inlineCode",{parentName:"p"},"i32"),", dan yang kedua untuk tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"f64"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n\n {\n // i32 comparison test\n let x = 13;\n let y = 20;\n let result = find_greater_number::(&x, &y); // atau cukup `find_greater_number(&x, &y)`\n println!("result: {}", result);\n }\n \n {\n // f64 comparison test\n let x = 3.14;\n let y = 2.11;\n let result = find_greater_number::(&x, &y); // atau cukup `find_greater_number(&x, &y)`\n println!("result: {}", result);\n }\n}\n')),(0,t.kt)("p",null,"Jalankan program, hasilnya sesuai harapan, tidak ada error."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(757).Z,width:"1072",height:"200"})),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/lifetime"},"github.com/novalagung/dasarpemrogramanrust-example/../lifetime")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html"},"https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/lifetimes.html"},"https://doc.rust-lang.org/nomicon/lifetimes.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://dev.to/takaakifuruse/rust-lifetimes-a-high-wall-for-rust-newbies-3ap"},"https://dev.to/takaakifuruse/rust-lifetimes-a-high-wall-for-rust-newbies-3ap")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://anooppoommen.medium.com/lifetimes-in-rust-7f2331be998b"},"https://anooppoommen.medium.com/lifetimes-in-rust-7f2331be998b")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://blog.logrocket.com/understanding-lifetimes-in-rust/"},"https://blog.logrocket.com/understanding-lifetimes-in-rust/")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://educative.io/answers/what-are-generic-lifetime-parameters-in-a-rust-function"},"https://educative.io/answers/what-are-generic-lifetime-parameters-in-a-rust-function"))))}s.isMDXComponent=!0},8116:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-1-49980dd171b372c65a19ab2c8bd2334f.png"},5384:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-2-1116463c388b09c1a8822e3b1ff4682c.png"},6875:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-3-d0688570ad7d667d603cde8665c863fc.png"},4982:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArEAAAC4CAIAAAB7KCObAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTJUMTc6MzU6NDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjIyOjEwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjIyOjEwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE0ZDEzNGZmLTRmNGMt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"},4734:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcwAAABoCAIAAADzQ1edAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTJUMTc6Mzk6MzMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjMzOjM5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjMzOjM5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJjMjY1OTU1LWQxZDMtN2U0Ni1hMDQ4LTIwYzJlZDYwY2JmNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyOThmZTg3MC0yODcyLTdiNDItYjQ3Ni0xOWI0NjY3MGY1ZTEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyOThmZTg3MC0yODcyLTdiNDItYjQ3Ni0xOWI0NjY3MGY1ZTEiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjI5OGZlODcwLTI4NzItN2I0Mi1iNDc2LTE5YjQ2NjcwZjVlMTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OGZlODcwLTI4NzItN2I0Mi1iNDc2LTE5YjQ2NjcwZjVlMSIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMlQxNzozOTozMyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyYzI2NTk1NS1kMWQzLTdlNDYtYTA0OC0yMGMyZWQ2MGNiZjQiIHN0RXZ0OndoZW49IjIwMjItMTItMTNUMTc6MzM6MzkrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6lLSLPAAAP+UlEQVR42u2dO5LUSBRFWUk1eNjYgNsejYMxRuMRuMREdMR4LIQlsAp8FjVVUpWUn/syX+pXqu5zYyKYUqdS+dPRUyp19eqAEEJoNb2i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"},5109:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-6-661acde878a7b7fc851b9e76b22e60a7.png"},7106:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtUAAACgCAIAAABMoQdnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTNUMTU6MzI6MzIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE3OjQ5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE3OjQ5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM1NTU3NTczLTE3NWUtNDc0Ni1hM2Y3LTM1NzYyZWYxN2NjNSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDozNTU1NzU3My0xNzVlLTQ3NDYtYTNmNy0zNTc2MmVmMTdjYzUiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozNTU1NzU3My0xNzVlLTQ3NDYtYTNmNy0zNTc2MmVmMTdjYzUiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM1NTU3NTczLTE3NWUtNDc0Ni1hM2Y3LTM1NzYyZWYxN2NjNSIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xM1QxNTozMjozMiswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pj/VErsAAB5jSURBVHja7Z3Pix3Xlce9nlUgi1kMmFlYcezoF0KyjA2xNTiYeGLLWozIDMKWZGQEJmSntEx6oKXEcttaeKEMNLygsUOIQ7rBntiL4IVpyMQjp7MaMYFg/Q+x/4BobtWtunXuvedW3apX7/V73Z8vX5ruevVu3bpV/c6nzrlV74EHEUIIIYTmqwcYAoQQQgjBHwghhBCCPxBCCCGE4A+EEEIIwR8IIYQQQvAHQgghhOAPhBBCCCH4AyGEEELwB0IIIYTgDyT1HYQQQgj1FPwxAn8cOPANjDHGGGca/oA/MMYYY/gD/sAYY4zhDwR/YIwxxvAH/IExxhjDH/AH/IExxhjDH/AHxhhjDH/AHxhjjDGGPxaEPy5Otnd2drbWpjqKozSieG1zx2p7cjF8dW1LX37gWv0m9dX87X46Ob90/07JA7HWDMrGhaXfTYwxhj/gj1nyhwuT+fxRxNTNa3ktG1LRo+9e449irFJQAn9gjOEP+IP6Sz5/pAPw5tqBKfljj/nC5NNsJsMYY/gD/hiHP0yU3ZqYCFRkC66V18d10C1TCEFOPihhyJculI1YNTFeb6TY6Nr5je34Jbe+vukc/rBX+X43RM9j/oiqD00L4R65PsuEgVm4vTHZtKvZwXGv9iv3ND1p0Cc9Vk1ngp3SDlDyaGo5IXU3k5Waiurql0iZYIzhD5TFH2X4KeOTjSJepDTL/Yil5xuKiJWusISNyCAtmaD5vaSZrJJNIv/hpzpEqN7xI2uxobpvfiRO5z+CnS0bN30o+2ze4jZd/FL3TUef1lGKxyrRYNEByStp1vE2kcasxDFNjFXVjt1onwoXxhjDH/uaP8rQVUemHP5QwmQZg5PxVeGPJrQ3W5QTEbyYOjV/JPMfZjWxFS/i9uKP4s+6kFFvusyLXMgvcxS7H2/R60bTiFlZtOYGQSJCJuIkiSHkj9RYlfzhWtApCmOM4Q/4Yzr+SBY40hn+XP4QENMRR0fjD1GqCCsOU/NHUEva6U4MNDWsRBrGDYusdsn6Tkf6YSr+SI1Vr1k1GGMMf8AfA/mjI+ehJEgy+cOLcLnTCKbmj9SGxuCPgZkAmVHQ8x+pbEpHlmVa/lAHBP7AGMMfaJ78kZjToKQu8vhj2I0Y0/FHopwUTrYYxB/tUzE6J6LG/CGBL1Xw6lcI68UfqbGCPzDG8Acajz/Wgmx7FXi8JLwLrn45oAla6UY68x+dKZCwHCCLOIk5lV33vwQlkugGk6jqUe5pkj/CTrYHaa8bTZhPt+DtaTAzI2wncSB0/tB3MzlW8AfGGP5Ay/z8jyD/kT8FZE97vzyGBGOM4Q/4Y3fsX4j7d1XAH3wWYIwx/AF/zCzW9rhbBP7AGGMMf8AfGGOMMfyB4A+MMcYY/oA/MMYYY/gD/sAYY4wx/AF/YIwxxvAH/IExxhjDH/DHvuePxfl61YyeuKeFKk9hL7+dTlkePXR1gMvtctfuUvnEicdWV1fPnTvXvtrBf/7h0cvvGx/6l5+oLz3y1L92bOuRI4fPvWNW7tfD8l2pTU/phw8/fuTixDbe0rFmtUvvffPx59xy87tZYpabV806u34o4wMxtx6aQyMH0G539OM107FK+dSpfzL/IOYn/AF/TO2hD+1eKv5wNJDNH+kvnVGcfDTIvuCPxTkTYl+58qPXXnut71uMM6Oy+XPO/GHWN+8y751R1MyPkWZYDr/8H5I/XKw1yxeTP+bWwwXlj/KUU8/MfP4wNv9TBkEMqcMf8Af8MRV/9ESKqVeGPxaYP86dO3f9+k/ktZ2NHC6WfOvZyzLiqvzRKxj05Y8gsM0nOC0pf6Q8f/5YFPc8xOOSPfyx4Pwhvm/MfdNY+SjS+gmk5Qo21JnlW2uuRiACgNZIWFCwDYbfhSbTAInqg/eNaO1Rx7RgViizC8FDVEUj4htltzcmm3Zz9umrdeen70mSP8pHy6sVlmKjMVI0j4Wt22laCL+arum2/w29PXcztSOba27Tsp/iwbXNgFs8cuurX2JXLTSjuj3ZqDpmj51rJ+5h9BWD4Xkb1rySPdE/3YzWS9lqiMGCtbW1F188E38CmhXWa9mF7r1OMqshX3WlFrXy0p4SCPgjVZgIkihVAkPwh321uyigIYvSsog0pntqf1JVFS84+eEq3tnp+cOVseTFd7yw2JHvv1UUni69ZxDQ/LR7WvSh7KGtqrjdbzkQag/VFJdd7ZuPfde+1J12EqUx2U51CLTkWbWy6KTsiXsptZupAVSXu24EPex30tYvmX9D8884tyoM/DFz/ig+7psw0MRU903uXlCU0UsUCzobycp/iO+nlRsVjXdf9drgZNeRjZzf2JTf1tusUOxCDViuV2P0pCP/4Y+AA6YQbmRFJvj+3nT+o/5KXjkmPXazdTpL81XAzZfreuE/+O7f8k/vVHG74L7xR3asaLbpf7qHyvinxirRE5U/HDG4ZG+KP4LlnVdpZkmQ5Eh9pCohuZU/UoHZthNeENcwob+anpnhBS1JJOXvVX/qWGhfaqcoNyvCuSKhGfOHaTBGLrM5t9BGXNNg8UsZR00HzKuGCeymPW6L4Cy3hxEI2l2uhqUmgPYzIRjkOP8RV2QMSMU1NdeI3brdotxN2RN1rNoOQTr/kXvS9pwmBX8sC3+UF7WJkFZ+xE8240tJkQyoUxpqI/F3u7fxh9mcWLkO21Gc7uYPFw4TVR63Tv1LvSP1+qP0pBd/pPIfNp1zIBzw/vyRv5t5OxJsQlmniPrbkvniM6Eew7BjrvGWHsbjnxyrjJ44bnAFZocFLfxheELNBsf8YVdWPzfNwqCqPRZ/6JM2bNg78++d8NGS/5ARyAs8kkXK1Tov3+ec/9DHNtpBG7Zd/+2fbtNBH4b10Px56PtvyYxCTACdJZWgzU7+UN/rjYlPRXJHqqYSYxX3fBh/dM40mmcJBv6YMX/EmXwvpBUA4X3KR/xRvJpqpOVaU4m+XmmjSaGPxR9BJ9v4Y5yejMIfcV5kPP5I7GY+f8i0UNxIqnv+twy28kdbD+PxT45V9kQZ9aOtpf5iFr7xxo319fUgsRG3Y9Y066jJknhW3Vj8oacfXLo+ozjSwh8ySAT80avSP2f+MKsdufjz8O1Rt/vyhxyNzB7a5Iq044/8QlJv/vCLNTKF47buxqeFP+KxCnbKY4g+/NE5Gdn8vwQzteGPpeaPVOHfRgU/h6HmP5KNpC+pE/yhXJiOwx8eSHXlP8bpyVj8kdzKGPzR50uG9fyHX2Lz8x9x90oKdBvtyn+09VDlD32sZsYfqdqKmv9IFWvi/EeQRZgm/5HiD/OSWoYYlv9o/lx4/tDfHuxg/edM8x+p5NBM+cP86TYq3ytnabj1s/IfienMckN98x/t/EH+Yy/VX8pLTG1GXhMLg1K6mLwpZwOojRSXpOl7RIPQkpgs0qwp53YM4I9qczYR0lp/GaUno/CHXzvIvVk3s/6SnJ3TuSMCI6JESCd/yAJNR/2lpYc9xmpq/nClEzuBNF4nuIFFvVFQFnfa53+460j3kZ1z/0v8Ua7nw0XA8IJEH/7wivTRXJBR+MM2aMdh3Pkf6l5LGnM4lcMf8SBn9jA10aEXf8jRs3M/O/lDztSxu5naos4fibFqv2E7ldXIPWmZ/7Ev7n/ZCSZmyhXcjMWdXjeGyKy4BxzarQrerQ3BpNcSGvwaf4/6i7yNYtI1/2OUngSFBreb0e0bzTB23f8S3qUS3RsSFSyG7WbH49SCQ9ks92YLJaJ+cz58Opl0zf9o7WHyvq1wrKbjD3mfi31Kh11H3vzyxhs3ZG7DfkrG97/Y+a3q/S/xdmV+Xkb3OGMfZvJFYUXO8Yzvf6ka7CzEdN3/0oSWUfhDdNu09q0XftS+m/Kei8xnfMnLfeX+l7rlFv6Q03JdC317qLbT9zZdt1HbyfDuEv8UkueDGVg1/yFvUVH5I3UTjdzN4CjEd/r0O2m5/4Xnf/DMif3tPg8ywX0cP/8DL7JTGY4ldTwxVpkis7RP9oM/4A8Mf+B+zz/F8Md8HNRQekwMmq95/in8AX/AH3h8z7mwjeGPVEFqMeGD73+BPzDGGON9YfgD/sB4f/nwv70dPBkC433rI6/8J/wBf2CMMcbkP+AP+ANjjDGGP+APjDHGGP5A8AfGGGMMf8AfGGOMMfwBf2CMMcYY/oA/MMYYY/gD/sAYY4zhD/gD/sAYY4zhD/gDY4wxhj8Q/IExxhjDH/AHxhhjDH/AH9P64Utfnrx1/8iZuZ8QZ744+cZnD+/mGfmbI7e+eGTR/23WNnd2dj6dnNdfvTD5dGfz2sgbPb+xbbY5erM5Xtva2d64MJux2mvOGKtyQAptTy7mjpU9+qU214b17eKkaGJrjZg3pq+VB7PfqBZHeYp/qOLjRTt5ep+oyc+TYqemab9HD+EP+KP2k58du/XlwSclCtw/6TwNlxQt3z955Tdi4ZsH36hb9paX+77LDLTs/DFyB+CPGYyVGZZs/ijQITsemOChjva+4I+Z/OtlhdseAzslf4yCCM0poQzXKI3nNQJ/UH9pgODYpTdHT0VYnjh4xeMMs7DeVkE5/na/8ciVcAkfgrvYgen4Y395Ov7oiRTTrwx/zONaJTjQBX9kddIcyl3hxQIdhqbZqL8sFn+c+eLklc/Ka/0vD54p0wDNxb1IMDSx2S2UqQgDB+ZP91IXFhT5BrNOvb5IJ9jMirWXX1EqL2Pwh+lJuWuPXAnzHJI2wpeq/itJlGwucVlucUFpLwGt3D92+U/u8tsyeIikd/N50SwMPxrEFtX1xb+0jVLupa4PIz1jb95uGrF5VNeI+9Op2qNi300H6qZEiBJvke3bJKrfiBfbgg9WZcATY2XW3Fxzx0L0RA54RlpbbLHrY1odq3A3q56YJduTjSqvHqSpE3UQbax6hqX0eVW+FCPFtc3wqMnT2++k23HRtwG7mdqRzqPZ7Gn6zI+PZr8eJs98dazcyex6Hp6iY+SKysazzoemh9HJuRg0qR5N+GMZ+KOM9EWUrZigAotHrrgQW4CCX21pVhPVCrskTlQk6h3V+qJxNa4nUw5jTsXoxx/lPoblpx78oWY45WWHWEFWcCX4VwE7/d/ofTwVnxT1FsVFmGhQRpHqs7JsQY8u2RHLbtRvRLsKrD5nbQvNUMg3lg2KT/N6B5tr+iR/tKWUo7GykcZuSBwUUWUott41Jmtb7uh0X1Cmxur8xma9C+4I1h/6dfBo+t9yNOOxGpT/CMaqlSbrtwdXq+n8h9+33rvZSoF2ffFfcHGyWW8r58zXjuaAHqbOfG2sqpBf/hlWuMbgj7L9vGTM2qa8HPI/dsoRm1M2ogWk1KMJfywDf5R5hTrAB2CRCv8Kf7h4XOQwErFchmq3ftO4v7wj3nvzP5Q+j8MfBZ/lDEhPVI/+Q8KF7mM6FVNTxVE1pnqNNB+C5rPDv8LT4msr6HTwh+uD10iSP9zCOhQFkbt+o9+lTv5o/0jS+CO8IA4b6ZkB7oz66bGK1wkHwb1XP5qpsRqDP1Lns03n6EWHPvzRYzfzdkTtvxyinDO/7ueAHipnfnKsvAkKIxduSt4dlidQBnyK1mbCItvj8RD8sXv8UaZGnMfmj0Tqwm3Uq7bECZgsSpiWP5I8lLGP7VO71Q9xlRhaagouKarSTDd/eGl5mbocNKNiev6IPzWCNgfyhzrgfflDxoP2BuOUdWfVIzlWQc2ijT8SR3M3+CPOi4zHH8mTNpc/mjKWXgnSx0c5mgN6qJz5ybGa4USZ3reo+J1U+WN35w7rRxP+WFr+SKUoZs0fEggaBFHzHy31oDH4o7WeMm3+o+tDvPmzbU6D+HSILkAz+UO9qFok/ghr8APzH9Pzh4cCXR9wejqnL394ZaOu/EfiaO4SfyS3MgZ/9MkE6PmPVJ5D77l+NAf0UOePJPHMdGpFdv1F1j3jE2MR6i+D8rXwx6Lzh5cIGc4fNqUhl2TwR3Cba3u892ElmI8yiD86JnNMN/9DLZ14C0XczeAPNQHuxYlg7oKcXdGWYZ4Rf2j5g3Su25v/Uf3uTxDx5so0lf6dYbWqBH/0G5OwqD+cP8Tsk/b8R+poJsZqlvzRdnNj+mbdzPpL6qTt3hFxGogz0J4qnfwRH80hPVTO/NRYtfHHXOefRvNjvP+OXpDU9lSPKflDO5rwxxLXX8oZqVUp5KAL/35RRs45nZ4/5M0v4U00RSPxEv0RHX2eUOI/RKRuqtl3dX7J9Pe/yItp7f4Xb2586ppeuRyPcr/1h5S8g0bWp712xKdMj1jrp6Z31KxDiBfN3QT+/S/tuV9/GmO9g7KCLm4h8SOoMuCpscrJf3R/xjXd/nQyGTr/Q95GMema/5E6mqmx6nM0k+dVxv0v4VhF94asbSqTWPvvZuddSDLyiaO5udGV/9CP5rAeRmd+aqzmwB+5N1rLPk82JYr17UMGiw9/eF10NOEPnv8xu+d/dD0pdepJqS3JkmV+/gce4ckZWVNA8CI+3wLv7uTQRXsCCvwBfwx5/ml7SmNW8LEMzz/FM5ngJvhjjGdEYvhjn/0H7SwVfIzKHydfXd8o9darJ5SXrj4/MLg/f3X4e0eX6cz6qyf37vfP8f0veFcv3Xo+xQvDH3iJPRZ/NIH5+ZWN9UsnRg35s+aPE6++pVBF3qt7iz8wxhjjZeKP01c3Vp5vsh1xCgT+wBhjjPG4/HHi0rrIeUTE4Iik/OX5S+t1mcasWapil/KNp6tldYOiNVfiqZc8v7Jx9XTVyNXTRTfsWx0umBW81mQHqtUMXlTrlN2ou1S9JX617szpZkX4A2OMMV5s/qhRoCQDu5qr3ZSxv2ERt7BcTaZV6nRL04houaCQ+lUDJV4OQ1stkeFweyFfrRcW8NFQEfyBMcYYL3r+40T4FhfgvTfWK8iQL1S2IwjDz0wUYCFSF3WCxIOY5nePP+okikyQhPxh1qm3S/0FY4wxXsz5H2Pxx0o4D6SLP6KsRhd/aEkR+ANjjDFexvtfevCH5Imo/hLd+9rKH2V1JkCWLv5oOt9sLqv+cuLEYxhjjDHO9HjP/3D1kShL0Sv/cXVFlEtisPAmh3bwh1+CiSaR+J2pet48xeTqVZkUieafyjKNGcSDBw9hjDHGONML9fzThXrUWL/nn3ImYYwxxvAH/IExxhjDH/AHxhhjjBeSP5b4++c4kzDGGGP4A/7AGGOM4Q/4A2OMMcbwx3z44/DK/WNn5ZKbR298dfTUoUOXvzq5sjX8yJ29d/LW/crZ7ZiNHr98M2fhwC7duHOo2c37XrOn7hxvXu108Xa3g9UAul22++ttboiLQ5A5hqbzt+4dzjq+iWNUdtWsPMVQbx27VZw5bruy5dZ36T2PBzy5IxhjDH/stp459skHz/zsmR75DxOEZGzrF4YP5TSbH9VmyR8VVzW7uXLPi3zNjvtr5rTmRd8mUrbF/iz4aLpXhPNBONjBH9MgZvIwmaEQR/zUnaNnW0Y1kz/GOzMxxnhh+OPlEzf/76kXZ8MDj7/73OS3B7NWvfTEnQ9ecP71pTnxhx8Axkw2uNiWHedmyB8FcGzJNk1U9mLzlPwhomPT4cEBXsln5PRqF/nDdK/qcOJ4Tc0fQ0cAY4zhj27+eGI1/n3W/CFDVPMRL6JIU2s4FlzIihLD4RU/Nmj8UWzosoms1cVxnKIvN7pVb06JZ+4t1ZIy6h+2dYqikeLKW61W+EGxDpaykxVAiMJKxCvZ+Q/3Un5w7SaDKo0k0wDud7EwGCJ3cMvlfmeirVQrC/rJzV110FswqsWwHC2OmlkzGqKz91JbHA2OMcZ4vvxRcMbZiXXFBAdfd0sqP/fqy4Ibrj9ll99890BEKgde/ePZ16+71os/60bKder3Nv7jiccz+ePBR3/dYMRDP3vP5UUklJh16uXvHTsX84dNqLzzaOf8UxeHlIt4JZqKkPbV8epVJYrUsc2rR5yUYbIOfm6uyaEqJoULg1Da9OpUQDO2D95EBCUN0PRNdLs1gmr84eZ/1CuXnWmmg0xxya5OvqnGoZU/4jfaHddn80RzdNwoVdvKT5CoQ5rMXsgCTQ/+GLdghDHGc+KPABc68h8FfzhiKEiiXCHJHyV8aHmO4fmPGilW37EMUf9eLS+g5JPVhxpAses4/ihacwTTdf9LFQPk9WX9e51RkLG2CgNbx8rcQ3XFHAQGEdtk9kIAhIw6Sgeihd6UzyrMq1UPLepL/tB/1/kj3KiAqijfI9CqpSeD8x8Z/KHvuGFEPWyn8h/NjmcnbzzcVHc5lRZqfm/yYamJq/AHxnhZ+UNHgSR/uIUHX7d5kRR/OEAZbf5HjQ5hPaXOiwQFmmK18k+7/qqEj5z7b8vA4zGB4I84CJULT905ZsPhylaUHkhWEKbjjyiwDeGPgKjuR7mfzPyHt84UU0l6zv9o4w/lYFX8oc7cbOMPrV4z1XTjbv4g/4Ex3rPzP1y1pSqydPBHzA0J/ihWTtRWBuY/Cowop6A6sIj5w9VcQv7wKzJ5z/8oLt+/CmZouqxDHA8Or3x1bOWem+5w/EYUqDr4I11/ETwR11/CNrP5Iz0ntC7WTMcfas+Hz//wa1VVNqJpU5So/PpLPERN/SUjnZCsv1S/aAwU35xS1qFktSucNtSPP9Q5SRhjvJTzT4t0hUCQqfmjaHBc/ihLLUV5Jch/eOUVwSXuz2oFUZHJfP5YkRWQITa4nTJMiYtyQ3JuQSt/eKUNyRAr944rk1JvRtWQMmhl84c3B/Zsx7zO6sEbbZfaeopFGaUprte953+IGS1ueTFW4fzTZoiCSTNybk0HfxS1M8sENX128keIEeKckZQp5p8ezr3/xQ01979gjJeePwqMkCmQIi8STA1J80f1xhd/W6RS6ncVLVRzVBXWybu5Jsx/WOzwSELMBSkmn8r5H9XvzRvlCjz/dFei1zTP/9AqMvdP3lrcADzz5ATP/8AYLyd/yJtfItoQ96r497+o+YzqjpiD/oRWeSuNBxyWVPLuf1Gf/yHuf/GqKuL+F5fqkPkSW4sp3gJ/BDmbPbi53bdy29Go+MjzTzHGS5//4PnrGGOMMYY/4A+MMcYY/oA/MMYYY/gD/oA/MMYYY/hj2fgDIYQQQr00An88/fTT+5k//vHR46ohM4QQQmiA4A/4AyGEEII/4A+EEEII/oA/4A+EEEJo3/HHY7/46+SLv/34Ru6ahX/3q/H54/Iv79y1+vga/IEQQgjtCf64dvlPOmTo/HHjL5M//f6xFIWMzx8/uP2Hux+uF8xx7aO7d979QSd/1F+0ixBCCKEl5A9d8+aPtz+8+/ntyxV/3P3obfgDIYQQWm7+OP27v1V1k9o3f3GtfOVXP66W/PXyK/Xar/z+5hfB+n853c4fBlbidiz1/Nfdu3c/vNbNHxV2nH/387s1iFT8UXynbvU9duIbdz94QfkyvOIL7Z5Ydd97530ZHkIIIQR/zJU/LAmk8x+GQkJu6JH/KHilfnsBIh6s5PNHNf/jD788780/vfREAiO0/If9Qt1qeUEh4kt6EUIIIfhj7/CH+bPOpjzYu8rj+KOEjw8/+riafLr+sQWRkj/0OkuSPxxzrL7zwierD3EOIoQQgj/2Hn/ExZ0B/OHmnDZVmHIKSPHaudVnqjrLO49m8McTq5x1CCGE4I99wB8i/zFML7mbX+yNMEXNZj2cf1pO+2gQBP5ACCGEFp8/ykSFft+Kxh9yVkcrf5RzPvQ1H8ye/1GkPeqZH+UUVIU/yomoDX8UOBKWV9r4o+zJ3Q+vc04ihBCCP+bIH+Julzpj0dy3oty90jxtrJpSWmRQvPUdhXjtDJt/WqU97pZTUK/VCCJvfonuZ6lmm8b3v+i6/qFp887PX+KkRAghBH/Mkz8WV/N4/vr523fIfyCEEII/4I958cdLt/+b4gtCCCH4A/7wdfTQYxY4rj7+7S+/973Pv/OsXcIJhBBCCMEfs5JhDgMcBj7+99nvfvvIyTeffNou4QRCCCGE4I9ZyQKHsYEPmwixSziBEEIIoRnyB0IIIYQQ/IEQQggh+AMhhBBCCP5ACCGE0NLzx/Xbf3f/zw/c/5+v85QKhBBCCM2JP6ze//iBL2//AwOHEEIIofnxx4M//dr9j/+egUMIIYQQ/IEQQggh+AMhhBBCaDT+uPD1L//8tfcZOYQQQgjNjz8qBHmALAhCCCGE5sUfP/0at+AihBBCaO78QeYDIYQQQvAHQgghhOAPhBBCCKHx+IPnnyKEEEJofvxRff8LN98ihBBCaG78gRBCCCEEfyCEEEII/kAIIYQQgj8QQgghBH8ghBBCCMEfCCGEEII/EEIIIQR/IIQQQgjBHwghhBCCPxBCCCGE4A+EEEIIwR8IIYQQQvAHQgghhOAPhBBCCMEfCCGEEELwB0IIIYT2jP4fTuXrBQlA1EIAAAAASUVORK5CYII="},378:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-8-da413de408eba24af5e0d0db885af9fc.png"},757:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-9-fix-96c668297e128c0b8d548a6cf72dfd0c.png"},7146:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdkAAAB/CAIAAAAsFy8SAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTNUMTY6MDY6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjIxOjA5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjIxOjA5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2ODRkMDI1LTQ0MGEt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"}}]); \ No newline at end of file diff --git a/assets/js/f8d4e457.ba1644a0.js b/assets/js/f8d4e457.ba1644a0.js new file mode 100644 index 00000000..97e0bd37 --- /dev/null +++ b/assets/js/f8d4e457.ba1644a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[740],{3905:(a,e,n)=>{n.d(e,{Zo:()=>p,kt:()=>o});var i=n(7294);function t(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function l(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,i)}return n}function r(a){for(var e=1;e=0||(t[n]=a[n]);return t}(a,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(a);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(t[n]=a[n])}return t}var d=i.createContext({}),u=function(a){var e=i.useContext(d),n=e;return a&&(n="function"==typeof a?a(e):r(r({},e),a)),n},p=function(a){var e=u(a.components);return i.createElement(d.Provider,{value:e},a.children)},s={inlineCode:"code",wrapper:function(a){var e=a.children;return i.createElement(i.Fragment,{},e)}},k=i.forwardRef((function(a,e){var n=a.components,t=a.mdxType,l=a.originalType,d=a.parentName,p=m(a,["components","mdxType","originalType","parentName"]),k=u(n),o=t,g=k["".concat(d,".").concat(o)]||k[o]||s[o]||l;return n?i.createElement(g,r(r({ref:e},p),{},{components:n})):i.createElement(g,r({ref:e},p))}));function o(a,e){var n=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var l=n.length,r=new Array(l);r[0]=k;var m={};for(var d in e)hasOwnProperty.call(e,d)&&(m[d]=e[d]);m.originalType=a,m.mdxType="string"==typeof a?a:t,r[1]=m;for(var u=2;u{n.r(e),n.d(e,{assets:()=>d,contentTitle:()=>r,default:()=>s,frontMatter:()=>l,metadata:()=>m,toc:()=>u});var i=n(7462),t=(n(7294),n(3905));const l={sidebar_position:42,title:"A.42. Lifetime",sidebar_label:"A.42. Lifetime"},r=void 0,m={unversionedId:"basic/lifetime",id:"basic/lifetime",title:"A.42. Lifetime",description:"Pada chapter ini kita akan belajar tentang lifetime. Lifetime adalah yang digunakan oleh Rust compiler untuk memonitor umur dari references agar tetap dianggap valid.",source:"@site/docs/basic/lifetime.md",sourceDirName:"basic",slug:"/basic/lifetime",permalink:"/basic/lifetime",draft:!1,tags:[],version:"current",sidebarPosition:42,frontMatter:{sidebar_position:42,title:"A.42. Lifetime",sidebar_label:"A.42. Lifetime"},sidebar:"tutorialSidebar",previous:{title:"A.41. Static Item",permalink:"/basic/static"},next:{title:"A.43. Slice Memory Management",permalink:"/basic/slice-memory-management"}},d={},u=[{value:"A.42.1. Konsep Lifetime",id:"a421-konsep-lifetime",level:2},{value:"A.42.2. Relasi antara lifetime dengan owner dan borrower",id:"a422-relasi-antara-lifetime-dengan-owner-dan-borrower",level:2},{value:"A.42.3. Lifetime annotation dan penerapannya pada return value",id:"a423-lifetime-annotation-dan-penerapannya-pada-return-value",level:2},{value:"A.42.4. Lifetime pada parameter",id:"a424-lifetime-pada-parameter",level:2},{value:"A.42.5. Lifetime elision",id:"a425-lifetime-elision",level:2},{value:"A.42.6. Lifetime pada struct",id:"a426-lifetime-pada-struct",level:2},{value:"A.42.7. Lifetime pada method",id:"a427-lifetime-pada-method",level:2},{value:"A.42.8. Generic parameter + trait bounds + lifetime",id:"a428-generic-parameter--trait-bounds--lifetime",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],p={toc:u};function s(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},p,l,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Pada chapter ini kita akan belajar tentang lifetime. Lifetime adalah yang digunakan oleh Rust compiler untuk memonitor umur dari references agar tetap dianggap valid."),(0,t.kt)("p",null,"Normalnya kita tidak perlu berurusan dengan lifetime, karena Rust-lah yang mengelola lifetime sebuah reference. Namun di luar itu, pada beberapa case kita bisa me-manage lifetime data dengan memanfaatkan ",(0,t.kt)("em",{parentName:"p"},"annotation"),"."),(0,t.kt)("p",null,"Ketika berurusan dengan data primitif maupun non-primitif tak perlu khawatir perihal urusan lifetime. Aspek lifetime hanya perlu diperhatikan sewaktu berurusan dengan data pointer/reference, apalagi kalau data tersebut keluar masuk block scope."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Topik lifetime adalah salah satu yang paling membingungkan di Rust. Wajar jika membutuhkan waktu lebih lama untuk menguasainya. ",(0,t.kt)("em",{parentName:"p"},"Take your time"),", pelajari pelan-pelan dan ulangi berkali-kali jika perlu.")),(0,t.kt)("h2",{id:"a421-konsep-lifetime"},"A.42.1. Konsep Lifetime"),(0,t.kt)("p",null,"Lifetime adalah yang digunakan oleh Rust compiler untuk memonitor umur dari references agar tetap valid. Lifetime menempel di variabel, lebih tepatnya di reference variabel."),(0,t.kt)("p",null,"Rust menerapkan default lifetime dalam pengecekan reference. Beberapa aturan pada default lifetime sudah kita pelajari pada chapter sebelumnya, seperti variabel yang hanya akan valid di dalam block dan invalid di luar block dan data yang akan di-dealokasi ketika sudah tidak ada reference-nya."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Rust mengidentifikasi default lifetime menggunakan ",(0,t.kt)("strong",{parentName:"p"},"lifetime elision"),", yang juga akan dibahas pada chapter ini.")),(0,t.kt)("p",null,"Agar mudah memahami konsep default lifetime, mari mulai dengan kode sederhana berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let r;\n {\n let x = 5;\n r = &x;\n }\n println!("r: {}", r);\n}\n')),(0,t.kt)("p",null,"Kode di atas kalau di jalankan hasilnya error, karena ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," di-dealokasi ketika block expression selesai dieksekusi, meskipun data tersebut dipinjamkan pada ",(0,t.kt)("inlineCode",{parentName:"p"},"r")," yang scope-nya berada di atasnya."),(0,t.kt)("p",null,"Kalau diilustrasikan, lifetime variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"r")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," kurang lebih seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n let r; // -----------+-- 'lf1\n { // |\n let x = 5; // -+-- 'lf2 |\n r = &x; // | |\n } // -+ |\n println!(\"r: {}\", r); // |\n} // -----------+\n")),(0,t.kt)("p",null,"Setiap data memiliki default lifetime."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"r")," memiliki lifetime yang pada contoh di atas diilustrasikan sebagai ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf1"),"."),(0,t.kt)("li",{parentName:"ul"},"Variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"x")," memiliki lifetime yang pada contoh di atas diilustrasikan sebagai ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf2"),"."),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf2")," milik variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"x")," menjadikan umur variabel tersebut valid mulai variabel tersebut dideklarasikan, hingga block expression selesai."),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf2")," sudah tidak valid di luar block expression. Inilah kenapa program di atas menjadi error."),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'lf1")," milik variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"r")," menjadikan umur variabel tersebut valid mulai variabel tersebut dideklarasikan, hingga block fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"main")," selesai.")),(0,t.kt)("p",null,"Default lifetime bisa di-override menggunakan lifetime yang kita definisikan sendiri."),(0,t.kt)("h2",{id:"a422-relasi-antara-lifetime-dengan-owner-dan-borrower"},"A.42.2. Relasi antara lifetime dengan owner dan borrower"),(0,t.kt)("p",null,"Lifetime menjadi salah satu hal yang wajib diperhatikan ketika bermain dengan references. Operasi seperti melempar reference ke luar scope, atau memasukan reference ke block scope baru berpotensi memunculkan error yang berhubungan dengan lifetime."),(0,t.kt)("p",null,"Setelah ini kita akan praktik penerapan pembuatan lifetime, namun sebelum itu mari pelajari dulu pembahasan pada section berikut agar tau kenapa dan kapan kita harus menerapkan lifetime yang kita buat sendiri."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let message = String::from("darkspear is better than zandalari");\n print_mesage(&message)\n}\n\nfn print_mesage(m: &String) {\n println!("the message: {m}")\n}\n')),(0,t.kt)("p",null,"Program di atas menampilkan pesan string via fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"print_message"),". Data string didapat dari parameter pointer ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," milik fungsi tersebut."),(0,t.kt)("p",null,"Pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main"),", ada string bernama ",(0,t.kt)("inlineCode",{parentName:"p"},"message"),", niainya dipinjamkan sebagai argument pemanggilan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"print_message"),"."),(0,t.kt)("p",null,"Setelah eksekusi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"print_message")," selesai, yang terjadi di block kode fungsi tersebut adalah data ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," di-dealokasi. Hasil dari dealokasi sendiri adalah nilai sebenarnya dikembalikan ke owner (pemilik aslinya). Sampai sini harusnya cukup jelas."),(0,t.kt)("p",null,"Sekarang lanjut ke contoh ke-2 berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let m: &String = get_message();\n println!("the message: {m}");\n}\n\nfn get_message() -> &String {\n let message = String::from("darkspear is better than zandalari");\n &message\n}\n')),(0,t.kt)("p",null,"Esensi program ke-2 ini sama seperti program sebelumnya, yaitu menampilkan pesan string yang sama persis. Perbedaannya, pesan string datanya ada di dalam fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_message"),". Fungsi tersebut dipanggil kemudian reference dari pesan string dipinjamkan, maka dengan ini variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m")," pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"main")," nilainya adalah data pinjaman (borrowing)."),(0,t.kt)("p",null,"Ketika di-run, hasilnya error."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(8116).Z,width:"779",height:"275"})),(0,t.kt)("p",null,"Error tersebut muncul karena setelah eksekusi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_message")," selesai, semua data dalam fungsi tersebut di-dealokasi. Termasuk variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"message")," yang merupakan owner dari data yang dipinjamkan ke variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m"),"."),(0,t.kt)("p",null,"Ok, jadi owner-nya sudah di-dealokasi, lalu bagaimana nasib dari peminjam data (variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"m"),")? Variabel tersebut menjadi bermasalah, karena owner data aslinya sudah tidak ada di memory, dan itulah kenapa muncul error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Error ini disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"dangling reference"),", muncul ketika data di-share ke variabel lain tapi owner-nya sudah tidak ada di-memory."),(0,t.kt)("p",{parentName:"blockquote"},"Di pemrograman Rust, error jenis ini bisa di-identifikasi saat kompilasi.")),(0,t.kt)("p",null,"Solusi pada error di atas, salah satunya adalah dengan tidak menggunakan tipe data pointer sebagai nilai balik. Gunakan saja tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"String"),". Solusi ini aman, karena tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"String")," owner-nya selalu berpindah saat ada operasi asignment, dengan ini maka manajemen memory menjadi efisien."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'// ganti kode berikut ...\nfn get_message() -> &String {\n let message = String::from("darkspear is better than zandalari");\n message\n}\n\n// ... menjadi ...\nfn get_message() -> String {\n let message = String::from("darkspear is better than zandalari");\n message\n}\n')),(0,t.kt)("p",null,"Ok, bagaimana dengan tipe data lain yang mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),", misalnya ada kebutuhan untuk share reference data tersebut ke block lain. Mari kita coba."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let n = get_number();\n println!("the number: {n}");\n}\n\nfn get_number() -> &i32 {\n let number = 13;\n &number\n}\n')),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(5384).Z,width:"782",height:"276"})),(0,t.kt)("p",null,"Bisa dilihat, ada error, karena kondisi tersebut menimbulkan dangling reference (sama seperti contoh sebelumnya). Namun pada contoh ini kita tidak bisa menerapkan solusi yang sama, karena variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"number")," mengadopsi ",(0,t.kt)("em",{parentName:"p"},"copy semantics"),", bukan ",(0,t.kt)("em",{parentName:"p"},"move semantics"),"."),(0,t.kt)("p",null,"Di Rust error dangling reference diantisipasi saat kompilasi, menjadikan kode tidak bisa sukses dikompilasi."),(0,t.kt)("p",null,"Solusi yang bisa diambil adalah dengan menjadikan data tersebut tidak memiliki owner (atau owner-nya adalah program), caranya dengan langsung mengembalikan reference data tanpa perlu menampungnya terlebih dahulu ke variabel, seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let n = get_number();\n println!("the number: {n}");\n}\n\nfn get_number() -> &i32 {\n &13\n}\n')),(0,t.kt)("p",null,"Ok, tapi entah kenapa ketika dilihat masih muncul error."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(6875).Z,width:"777",height:"260"})),(0,t.kt)("p",null,"Error tersebut muncul karena meskipun owner data ",(0,t.kt)("inlineCode",{parentName:"p"},"&13")," adalah program, ketika eksekusi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number")," selesai, data borrow tersebut langsung di-dealokasi, dan tidak ada variabel lain di-luar scope yang menampung reference data tersebut."),(0,t.kt)("p",null,"Agar tidak terjadi proses dealokasi, harus ada variabel yang menampung reference tersebut di-luar scope, tapi cara ini tidak bisa dilakukan karena data-nya saja baru dideklarasikan dalam block fungsi, tidak mungkin tiba-tiba ada yang menampung di-luar scope."),(0,t.kt)("p",null,"Solusi dari masalah ini adalah menggunakan lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," (yang detailnya sudah dibahas pada chapter sebelumnya). Dengan ini maka data reference ",(0,t.kt)("inlineCode",{parentName:"p"},"&13")," hidup lebih lama dari umur yang sebenarnya sudah ditakdirkan untuk data data tersebut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn get_number() -> &'static i32 {\n &13\n}\n")),(0,t.kt)("p",null,"Namun perlu diingat, bahwa data efek dari lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," adalah data tidak akan pernah di-dealokasi. Data tersebut akan hidup selamanya di program hingga kecuali program dimatikan. Karena alasan itulah penggunaan ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," pada contoh ini bisa disebut berlebihan."),(0,t.kt)("p",null,"Solusi yang lebih pas adalah dengan membuat lifetime sendiri dengan cara menerapkan ",(0,t.kt)("strong",{parentName:"p"},"lifetime annotation")," (tidak menggunakan lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static"),")."),(0,t.kt)("h2",{id:"a423-lifetime-annotation-dan-penerapannya-pada-return-value"},"A.42.3. Lifetime annotation dan penerapannya pada return value"),(0,t.kt)("p",null,"Lifetime dituliskan dengan notasi ",(0,t.kt)("inlineCode",{parentName:"p"},"'nama_lifetime"),". Dengan notasi tersebut, kita bisa menciptakan lifetime baru misalnya ",(0,t.kt)("inlineCode",{parentName:"p"},"'a"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"'b"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"'ini_lifetime"),", dst."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"&i32 // => tipe data reference i32\n&'a i32 // => tipe data reference i32 dengan lifetime 'a\n&'a mut i32 // => tipe data mutable reference i32 dengan lifetime 'a\n")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Lifetime dan block label memiliki bentuk literal yang sama, keduanya diawali tanda kutip ",(0,t.kt)("inlineCode",{parentName:"p"},"'"),". Yang membedakan hanya pada tempat di mana syntax tersebut ditulis.")),(0,t.kt)("p",null,"Kegunaan dari lifetime annotation adalah untuk menginformasikan compiler agar reference tidak langsung didealokasikan setelah eksekusi block selesai. Agar lebih jelas mari kita langsung terapkan saja pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number")," yang sudah ditulis. Silakan tambahkan lifetime dengan nama bebas. Di sini penulis gunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"'my_lifetime"),".nnnn"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn get_number() -> &'my_lifetime i32 {\n &13\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(4982).Z,width:"689",height:"184"})),(0,t.kt)("p",null,"Meski sudah ditambahkan, error tetap muncul, karena lifetime tersebut tidak dikenal. Berbeda dengan lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'static")," yang memang sudah disediakan oleh Rust."),(0,t.kt)("p",null,"Step selanjutnya adalah mengenalkan lifetime tersebut, caranya dengan menambahkannya dalam notasi parameter generic fungsi, seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn get_number<'my_lifetime>() -> &'my_lifetime i32 {\n &13\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number")," sekarang tidak menghasilkan error, karena reference yang dikembalikan memiliki umur ",(0,t.kt)("inlineCode",{parentName:"p"},"'my_lifetime")," yang membuatnya tetap valid sampai menjadi return value, meski eksekusi block fungsi-nya sendiri sudah selesai. Efeknya, data yang di-return bisa ditampung di luar scope fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_number"),"."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(4734).Z,width:"460",height:"104"})),(0,t.kt)("p",null,"Tanpa adanya lifetime pada return value, maka data return value akan langsung di-dealokasi setelah block fungsi selesai dieksekusi. Tapi karena hal ini ",(0,t.kt)("em",{parentName:"p"},"by default")," sudah di-handle Rust, maka kita tidak perlu memikirkannya."),(0,t.kt)("h2",{id:"a424-lifetime-pada-parameter"},"A.42.4. Lifetime pada parameter"),(0,t.kt)("p",null,"Pada praktik ini kita akan bahas penerapan lifetime pada parameter."),(0,t.kt)("p",null,"Silakan perhatikan kode berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v1(x: &str) -> &str {\n x\n}\n")),(0,t.kt)("p",null,"Kode di atas tidak menghasilkan error, karena kalau dilihat dari sudut pandang lifetime (sesuai dengan aturan lifetime elision), yang sebenarnya terjadi adalah kurang lebih seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v2<'a>(x: &'a str) -> &'a str {\n x\n}\n")),(0,t.kt)("p",null,"Pada saat parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," masuk ke fungsi, ",(0,t.kt)("em",{parentName:"p"},"by default")," variabel tersebut memiliki lifetime (yang pada contoh di atas diilustrasikan dengan `'a'). Lifetime tersebut akan aktif hingga menjadi return value karena lifetime yang sama digunakan juga pada return value. Dengan ini nantinya setelah fungsi selesai dieksekusi, nilai baliknya tetap bisa ditampung."),(0,t.kt)("p",null,"Beda lagi jika lifetime lain digunakan pada nilai balik fungsi, misalnya:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v3<'a, 'b>(x: &'a str) -> &'b str {\n x\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(5109).Z,width:"736",height:"204"})),(0,t.kt)("p",null,"Error muncul dengan keterangan kurang lebih: data yang dijadikan return value pada block fungsi akan valid untuk lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'b"),", namun data yang dijadikan return value hanya valid untuk lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'a"),"."),(0,t.kt)("p",null,"Dari sini bisa ditarik kesimpulan: data yang didapat dari luar scope (yang memiliki lifetime sendiri) ketika digunakan sebagai nilai balik, lifetime-nya harus sama."),(0,t.kt)("p",null,"Sekarang mari kita modifikasi lagi fungsi menjadi seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v4<'a, 'b, 'c>(x: &'a str, y: &'b str) -> &'c str {\n \"hello\"\n}\n")),(0,t.kt)("p",null,"Fungsi di atas memiliki 2 buah lifetime, yaitu:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'a"),", digunakan pada parameter ",(0,t.kt)("inlineCode",{parentName:"li"},"x")),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'b"),", digunakan pada parameter ",(0,t.kt)("inlineCode",{parentName:"li"},"y")),(0,t.kt)("li",{parentName:"ul"},"Lifetime ",(0,t.kt)("inlineCode",{parentName:"li"},"'c"),", digunakan pada return value")),(0,t.kt)("p",null,"Karena yang dikembalikan ada data baru, yaitu string ",(0,t.kt)("inlineCode",{parentName:"p"},"hello"),", maka kode di atas tidak error. Data tersebut lifetime-nya adalah ",(0,t.kt)("inlineCode",{parentName:"p"},"'c"),", dan akan tetap valid setelah pemanggilan fungsi selesai."),(0,t.kt)("p",null,"Beda situasi jika yang dikembalikan adalah data dari parameter, misalnya, ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),". Jika seperti ini, maka lifetime yang sama dengan lifetime parameter ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," harus digunakan, yaitu lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'b"),". Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v5<'a, 'b, 'c>(x: &'a str, y: &'b str) -> &'b str {\n y\n}\n")),(0,t.kt)("p",null,"Pada kode di atas, lifetime ",(0,t.kt)("inlineCode",{parentName:"p"},"'c")," tidak dipergunakan sama sekali, maka lifetime tersebut boleh dihapus dari fungsi. Silakan cukup definisikan lifetime yang hanya digunakan saja pada block parameter generic."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v6<'a, 'b>(x: &'a str, y: &'b str) -> &'b str {\n y\n}\n")),(0,t.kt)("p",null,"Dimisalkan ada seleksi kondisi, jadi return value bisa saja ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),", bisa juga ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),". Jika seperti ini, maka ",(0,t.kt)("inlineCode",{parentName:"p"},"x"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),", dan juga return value harus memiliki lifetime yang sama."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn do_something_v7<'a>(x: &'a str, y: &'a str) -> &'a str {\n if x.len() < y.len() {\n x\n } else {\n y\n }\n}\n")),(0,t.kt)("h2",{id:"a425-lifetime-elision"},"A.42.5. Lifetime elision"),(0,t.kt)("p",null,"Sampai section ini kita telah mempelajari kurang lebih 4 point berikut:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Setiap data, lebih tepatnya setiap reference memiliki lifetime."),(0,t.kt)("li",{parentName:"ol"},"Lifetime digunakan oleh Rust dalam penentuan kapan reference tersebut di-dealokasi."),(0,t.kt)("li",{parentName:"ol"},"Pada beberapa case, lifetime perlu di-urus secara eksplisit (contohnya seperti pada fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"do_something_vx")," di atas)."),(0,t.kt)("li",{parentName:"ol"},"Pengecekan lifetime terjadi saat kompilasi.")),(0,t.kt)("p",null,"Rust memiliki sesuatu yang disebut dengan ",(0,t.kt)("strong",{parentName:"p"},"lifetime elision"),", isinya adalah aturan yang digunakan oleh Rust dalam menganalisa reference untuk menentukan lifetime ",(0,t.kt)("em",{parentName:"p"},"default"),"-nya."),(0,t.kt)("p",null,"Namun, bukan berarti Rust akan selalu tau lifetime tiap reference. Pada beberapa case, Rust membutuhkan bantuan kita selaku programmer untuk menginformasikan lifetime reference kode yang ditulis, contohnya seperti pada fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"do_something_v7")," di atas."),(0,t.kt)("p",null,"Meskipun demikian, tak usah terlalu khawatir, karena pengecekan lifetime reference terjadi saat kompilasi, dan ketika ada reference yang perlu dikasih ",(0,t.kt)("em",{parentName:"p"},"annotication"),", Rust akan menginformasikan ke kita via pesan error."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Untuk sekarang, pembahasan detail mengenai lifetime elision tidak dibahas pada ebook ini. Silakan gunakan dokumentasi official Rust untuk ",(0,t.kt)("a",{parentName:"p",href:"https://doc.rust-lang.org/nomicon/lifetime-elision.html"},"lifetime elision")," jika berminat untuk pengkajian yang lebih dalam.")),(0,t.kt)("p",null,"Jika kawan-kawan menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"rust-analyzer")," extension di VSCode, tak perlu meng-compiler program untuk memunculkan error-nya, karena langsung muncul saat penulisan kode program."),(0,t.kt)("h2",{id:"a426-lifetime-pada-struct"},"A.42.6. Lifetime pada struct"),(0,t.kt)("p",null,"Tak hanya pada parameter fungsi dan return value fungsi, lifetime juga bisa diterapkan pada (property) struct."),(0,t.kt)("p",null,"Ketika menggunakan tipe data reference sebagai tipe property struct, Rust langsung menginformasikan kita via error message jika tidak ada anotasi lifetime pada field tersebut."),(0,t.kt)("p",null,"Contohnya bisa dilihat pada kode di bawah ini. Pesan error muncul karena tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"&str")," pada property struct tidak ada lifetime annotation-nya."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book {\n title: &str,\n}\n")),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(7106).Z,width:"725",height:"160"})),(0,t.kt)("p",null,"Solusinya, tambahkan anotasi lifetime pada tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"&str"),", dan juga daftarkan lifetime tersebut pada struct. Notasi penulisannya seperti ini:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// struct NamaStruct<'lifetime_annotication> {\n// field: &'lifetime_annotication tipe_data,\n// }\n\nstruct Book<'abc> {\n title: &'abc str,\n}\n")),(0,t.kt)("p",null,"Contoh jika ada lebih dari 1 field dengan lifetime sama:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book<'abc> {\n title: &'abc str,\n description: &'abc str,\n}\n")),(0,t.kt)("p",null,"Contoh jika ada beberapa field yang di antaranya memiliki lifetime berbeda (artinya ada lebih dari 1 lifetime):"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book<'abc, 'def> {\n title: &'abc str,\n description: &'abc str,\n price: &'def i32,\n}\n\nfn main() {\n let book = Book {\n title: \"The Silmarillion\",\n description: \"Good story, 10/10, would read again\",\n price: &99,\n };\n}\n")),(0,t.kt)("h2",{id:"a427-lifetime-pada-method"},"A.42.7. Lifetime pada method"),(0,t.kt)("p",null,"Ada 2 hal yang perlu diketahui dalam penerapan lifetime pada method. Yang pertama, lifetime annotication harus ditulis pada block ",(0,t.kt)("inlineCode",{parentName:"p"},"impl")," meskipun pada block method tidak digunakan secara langsung."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"struct Book<'abc, 'def> {\n title: &'abc str,\n description: &'abc str,\n price: &'def i32,\n}\n\nimpl<'abc, 'def> Book<'abc, 'def> {\n\n fn get_info(&self) -> String {\n let info = format!(\"{} (${}), {}\", self.title, self.price, self.description);\n info\n }\n}\n")),(0,t.kt)("p",null,"Bisa dilihat statement block ",(0,t.kt)("inlineCode",{parentName:"p"},"impl<'abc, 'def> Book<'abc, 'def>"),", lifetime annotation-nya sama persis dengan yang ada di struct. Jika ingin mengetes, silakan coba saja hapus syntax lifetime dari statement itu, pasti muncul error."),(0,t.kt)("p",null,"Hal ke-2 yang penting diketahui, pada block kode method, tidak perlu menuliskan lifetime annotation, karena sudah ditulis di block kode ",(0,t.kt)("inlineCode",{parentName:"p"},"impl"),"."),(0,t.kt)("p",null,"Sebagai contoh, dua method berikut tidak memunculkan error:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"// ...\n\nimpl<'abc, 'def> Book<'abc, 'def> {\n\n fn get_info(&self) -> String {\n let info = format!(\"{} (${}), {}\", self.title, self.price, self.description);\n info\n }\n\n fn get_price(&self) -> &i32 {\n self.price\n }\n}\n")),(0,t.kt)("p",null,"Bandingkan dengan fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_book_price")," berikut, error muncul karena lifetime annotation tidak ditambahkan ke block fungsi (meskipun fungsi tersebut mengembalikan property ",(0,t.kt)("inlineCode",{parentName:"p"},"price")," milik struct ",(0,t.kt)("inlineCode",{parentName:"p"},"Book")," yang sudah memiliki lifetime sendiri). Hal ini karena data ",(0,t.kt)("inlineCode",{parentName:"p"},"&i32")," yang dikembalikan statement ",(0,t.kt)("inlineCode",{parentName:"p"},"book.get_price()")," langsung didealokasi setelah block fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"get_book_price")," selesai dieksekusi."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(378).Z,width:"813",height:"223"})),(0,t.kt)("p",null,"Agar error tidak muncul, tambahkan lifetime:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"ke return value (karena tipe data return value adalah reference)"),(0,t.kt)("li",{parentName:"ol"},"lalu pada parameter ",(0,t.kt)("inlineCode",{parentName:"li"},"book")," (karena di block fungsi return value berasal dari data milik property variabel ",(0,t.kt)("inlineCode",{parentName:"li"},"book"),"),"),(0,t.kt)("li",{parentName:"ol"},"dan juga tak lupa daftarkan lifetime annotation pada block fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"get_book_price"),".")),(0,t.kt)("p",null,"Kurang kode menjadi seperti berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'// ...\n\nfn get_book_price<\'ghi>(book: &\'ghi Book) -> &\'ghi i32 {\n book.get_price()\n}\n\nfn main() {\n let book = Book {\n title: "The Silmarillion",\n description: "Good story, 10/10, would read again",\n price: &99,\n };\n\n println!("{}", book.get_info());\n println!("the price: {}", get_book_price(&book));\n}\n')),(0,t.kt)("p",null,"Run program, hasilnya sukses."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(7146).Z,width:"473",height:"127"})),(0,t.kt)("h2",{id:"a428-generic-parameter--trait-bounds--lifetime"},"A.42.8. Generic parameter + trait bounds + lifetime"),(0,t.kt)("p",null,"Lalu bagaimana jika ada fungsi yang di situ ada penerapan trait bounds, ada juga generic parameter, dan lifetime annotation. Cara penulisannya seperti apa? Silakan lihat contoh berikut:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_greater_number<'a, T>(\n x: &'a T,\n y: &'a T,\n) -> &'a T\nwhere\n T: std::cmp::PartialOrd,\n{\n if x > y {\n x\n } else {\n y\n }\n}\n")),(0,t.kt)("p",null,"Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_greater_number")," di atas digunakan untuk mencari angka terbesar dari dua inputan parameter (",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),"), dengan tipe data yang digunakan adalah generic ",(0,t.kt)("inlineCode",{parentName:"p"},"T"),". Dari sini maka nantinya fungsi ini bisa digunakan pada data bertipe ",(0,t.kt)("inlineCode",{parentName:"p"},"i32"),", ",(0,t.kt)("inlineCode",{parentName:"p"},"f64"),", dan data numerik lainnya."),(0,t.kt)("p",null,"Tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"T")," diasosiasikan dengan trait ",(0,t.kt)("inlineCode",{parentName:"p"},"std::cmp::PartialOrd")," agar variabel dengan tipe tersebut bisa digunakan dalam seleksi kondisi ",(0,t.kt)("inlineCode",{parentName:"p"},"if")," yang ada dalam block fungsi tersebut."),(0,t.kt)("p",null,"Ok, sampai sini semoga cukup jelas. Lalu bagaimana dengan lifetime annotation-nya? Karena lifetime annotation definisinya berada pada tempat yang sama dengan definisi tipe generic, maka langsung saja tulis di situ tanpa memperhatikan urutan. Sebagai contoh, dua definisi block fungsi berikut adalah ekuivalen."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn say_hello_v1<'abc, T>()\nfn say_hello_v2()\n")),(0,t.kt)("p",null,"Sekarang kembali ke pembahasan di atas. Fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_greater_number")," mengembalikan tipe data reference ",(0,t.kt)("inlineCode",{parentName:"p"},"&T")," yang nilainya bisa saja dari ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," atau ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),". Dari sini maka wajib hukumnya untuk return value memiliki lifetime yang sama dengan ",(0,t.kt)("inlineCode",{parentName:"p"},"x")," dan ",(0,t.kt)("inlineCode",{parentName:"p"},"y"),". Itulah kenapa definisi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"find_greater_number")," agak panjang."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn find_greater_number<'a, T>(x: &'a T, y: &'a T) -> &'a T\n")),(0,t.kt)("p",null,"Lanjut, mari kita panggil fungsi tersebut pada dua block expression. Block pertama untuk pengecekan data numerik ",(0,t.kt)("inlineCode",{parentName:"p"},"i32"),", dan yang kedua untuk tipe ",(0,t.kt)("inlineCode",{parentName:"p"},"f64"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n\n {\n // i32 comparison test\n let x = 13;\n let y = 20;\n let result = find_greater_number::(&x, &y); // atau cukup `find_greater_number(&x, &y)`\n println!("result: {}", result);\n }\n \n {\n // f64 comparison test\n let x = 3.14;\n let y = 2.11;\n let result = find_greater_number::(&x, &y); // atau cukup `find_greater_number(&x, &y)`\n println!("result: {}", result);\n }\n}\n')),(0,t.kt)("p",null,"Jalankan program, hasilnya sesuai harapan, tidak ada error."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Lifetime",src:n(757).Z,width:"1072",height:"200"})),(0,t.kt)("hr",null),(0,t.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,t.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,t.kt)("pre",null,(0,t.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/lifetime"},"github.com/novalagung/dasarpemrogramanrust-example/../lifetime")),(0,t.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html"},"https://doc.rust-lang.org/book/ch10-03-lifetime-syntax.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/nomicon/lifetimes.html"},"https://doc.rust-lang.org/nomicon/lifetimes.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://dev.to/takaakifuruse/rust-lifetimes-a-high-wall-for-rust-newbies-3ap"},"https://dev.to/takaakifuruse/rust-lifetimes-a-high-wall-for-rust-newbies-3ap")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://anooppoommen.medium.com/lifetimes-in-rust-7f2331be998b"},"https://anooppoommen.medium.com/lifetimes-in-rust-7f2331be998b")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://blog.logrocket.com/understanding-lifetimes-in-rust/"},"https://blog.logrocket.com/understanding-lifetimes-in-rust/")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://educative.io/answers/what-are-generic-lifetime-parameters-in-a-rust-function"},"https://educative.io/answers/what-are-generic-lifetime-parameters-in-a-rust-function"))))}s.isMDXComponent=!0},8116:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-1-49980dd171b372c65a19ab2c8bd2334f.png"},5384:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-2-1116463c388b09c1a8822e3b1ff4682c.png"},6875:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-3-d0688570ad7d667d603cde8665c863fc.png"},4982:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAArEAAAC4CAIAAAB7KCObAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTJUMTc6MzU6NDErMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjIyOjEwKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjIyOjEwKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE0ZDEzNGZmLTRmNGMt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"},4734:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcwAAABoCAIAAADzQ1edAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTJUMTc6Mzk6MzMrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjMzOjM5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjMzOjM5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjJjMjY1OTU1LWQxZDMtN2U0Ni1hMDQ4LTIwYzJlZDYwY2JmNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyOThmZTg3MC0yODcyLTdiNDItYjQ3Ni0xOWI0NjY3MGY1ZTEiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyOThmZTg3MC0yODcyLTdiNDItYjQ3Ni0xOWI0NjY3MGY1ZTEiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjI5OGZlODcwLTI4NzItN2I0Mi1iNDc2LTE5YjQ2NjcwZjVlMTwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OGZlODcwLTI4NzItN2I0Mi1iNDc2LTE5YjQ2NjcwZjVlMSIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMlQxNzozOTozMyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoyYzI2NTk1NS1kMWQzLTdlNDYtYTA0OC0yMGMyZWQ2MGNiZjQiIHN0RXZ0OndoZW49IjIwMjItMTItMTNUMTc6MzM6MzkrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6lLSLPAAAP+UlEQVR42u2dO5LUSBRFWUk1eNjYgNsejYMxRuMRuMREdMR4LIQlsAp8FjVVUpWUn/syX+pXqu5zYyKYUqdS+dPRUyp19eqAEEJoNb2i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"},5109:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-6-661acde878a7b7fc851b9e76b22e60a7.png"},7106:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtUAAACgCAIAAABMoQdnAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTNUMTU6MzI6MzIrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjE3OjQ5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjE3OjQ5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjM1NTU3NTczLTE3NWUt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"},378:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-8-da413de408eba24af5e0d0db885af9fc.png"},757:(a,e,n)=>{n.d(e,{Z:()=>i});const i=n.p+"assets/images/lifetime-9-fix-96c668297e128c0b8d548a6cf72dfd0c.png"},7146:(a,e,n)=>{n.d(e,{Z:()=>i});const i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdkAAAB/CAIAAAAsFy8SAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFGGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTNUMTY6MDY6MDcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjIxOjA5KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjIxOjA5KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ2ODRkMDI1LTQ0MGEt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"}}]); \ No newline at end of file diff --git a/assets/js/fb18633e.5c83c6b6.js b/assets/js/fb18633e.5c83c6b6.js new file mode 100644 index 00000000..09ed60a2 --- /dev/null +++ b/assets/js/fb18633e.5c83c6b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7310],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>k});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var s=t.createContext({}),u=function(a){var e=t.useContext(s),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},m=function(a){var e=u(a.components);return t.createElement(s.Provider,{value:e},a.children)},p={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},d=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,s=a.parentName,m=o(a,["components","mdxType","originalType","parentName"]),d=u(n),k=i,g=d["".concat(s,".").concat(k)]||d[k]||p[k]||r;return n?t.createElement(g,l(l({ref:e},m),{},{components:n})):t.createElement(g,l({ref:e},m))}));function k(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=d;var o={};for(var s in e)hasOwnProperty.call(e,s)&&(o[s]=e[s]);o.originalType=a,o.mdxType="string"==typeof a?a:i,l[1]=o;for(var u=2;u{n.r(e),n.d(e,{assets:()=>s,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>u});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:35,title:"A.35. Borrowing",sidebar_label:"A.35. Borrowing"},l=void 0,o={unversionedId:"basic/borrowing",id:"basic/borrowing",title:"A.35. Borrowing",description:"Pada chapter ini kita akan belajar tentang apa itu borrowing dalam Rust programming.",source:"@site/docs/basic/borrowing.md",sourceDirName:"basic",slug:"/basic/borrowing",permalink:"/basic/borrowing",draft:!1,tags:[],version:"current",sidebarPosition:35,frontMatter:{sidebar_position:35,title:"A.35. Borrowing",sidebar_label:"A.35. Borrowing"},sidebar:"tutorialSidebar",previous:{title:"A.34. Ownership",permalink:"/basic/ownership"},next:{title:"A.36. Traits",permalink:"/basic/traits"}},s={},u=[{value:"A.35.1. Konsep borrowing",id:"a351-konsep-borrowing",level:2},{value:"A.35.2. Rust Borrow Checker",id:"a352-rust-borrow-checker",level:2},{value:"A.35.3. Aturan borrowing",id:"a353-aturan-borrowing",level:2},{value:"A.35.4. Borrowing mutable/immutable reference",id:"a354-borrowing-mutableimmutable-reference",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"\u25c9 Contoh ke-3",id:"-contoh-ke-3",level:3},{value:"A.35.5. Borrowing valid/invalid reference",id:"a355-borrowing-validinvalid-reference",level:2},{value:"A.35.6. Borrowing pada block",id:"a356-borrowing-pada-block",level:2},{value:"\u25c9 Method contains milik String",id:"-method-contains-milik-string",level:3},{value:"A.35.7. Owner dan borrower data literal",id:"a357-owner-dan-borrower-data-literal",level:2},{value:"A.35.8. Borrowing pada macro println",id:"a358-borrowing-pada-macro-println",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:u};function p(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang apa itu borrowing dalam Rust programming."),(0,i.kt)("p",null,"Sebelum masuk ke pembelajaran, penulis anjurkan untuk paham terlebih dahulu tentang ",(0,i.kt)("a",{parentName:"p",href:"/basic/basic-memory-management"},"Basic Memory Management"),", ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),", dan juga konsep ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"),". Ketiga topik tersebut dipelajari pada chapter sebelum ini."),(0,i.kt)("h2",{id:"a351-konsep-borrowing"},"A.35.1. Konsep borrowing"),(0,i.kt)("p",null,"Pada chapter sebelumnya kita telah belajar bahwa tipe data yang mengadopsi ",(0,i.kt)("em",{parentName:"p"},"move semantics")," (seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"), ketika digunakan pada operasi assignment maka owner-nya berpindah. Variabel yang sebelumnya adalah owner, setelah proses assignment menjadi invalid, karena owner data tersebut telah berpindah ke variabel baru. Efeknya, semua operasi yang dilakukan pada variabel owner sebelumnya menghasilkan error."),(0,i.kt)("p",null,"Sekarang perhatikan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let msg_1 = String::from("hello");\nlet msg_2 = msg_1;\n\nprintln!("{:?}", msg_2);\nprintln!("{:?}", msg_1);\n')),(0,i.kt)("p",null,"Pada contoh di atas, statement print ",(0,i.kt)("inlineCode",{parentName:"p"},"msg_1")," menghasilkan error karena variabel tersebut telah invalid setelah statement ",(0,i.kt)("inlineCode",{parentName:"p"},"let msg_2 = msg_1"),"."),(0,i.kt)("p",null,"Programmer harus ekstra hati-hati dan bijak dalam pengelolaan owner data, agar memory ter-manage dengan baik. Tapi kalau dipikir-pikir, repot juga kalau owner harus dilempar-lempar setiap selesai digunakan agar tidak error."),(0,i.kt)("p",null,"Salah satu cara yang bisa digunakan agar tidak terlalu repot adalah dengan menerapkan cloning (seperti yang sudah dibahas pada chapter sebelumnya). Namun ini bukan opsi yang baik karena boros memory, sedangkan di sisi lain programmer dianjurkan untuk efisien dalam penggunaan memory."),(0,i.kt)("p",null,"Solusi yang paling pas adalah dengan menerapkan ",(0,i.kt)("strong",{parentName:"p"},"borrowing"),". Borrowing artinya adalah meminjam. Pada konteks Rust programming, borrowing berarti meminjam data milik owner, dipinjam agar bisa diakses tanpa perlu memindah owner-nya. Kemudian setelah peminjaman selesai, data dikembalikan."),(0,i.kt)("p",null,"Cara meminjam data di Rust sangat mudah, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Untuk borrowing dengan level akses immutable/read-only, gunakan operator reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let msg_3 = String::from("hello rust");\nlet msg_4 = &msg_3; // <----- borrow operation\n\nprintln!("{:?}", msg_4); // output => hello rust\nprintln!("{:?}", msg_3); // output => hello rust\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Untuk borrowing dengan level akses mutable, gunakan operator reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_3 = String::from("hello");\nlet msg_4 = &mut msg_3; // <----- mutable borrow operation\n\n*msg_4 = String::from("hello rust");\n\nprintln!("{:?}", msg_4); // output => hello rust\nprintln!("{:?}", msg_3); // output => hello rust\n')))),(0,i.kt)("p",null,"Di Rust, semua statement reference (baik mutable ataupun immutable) adalah operasi ",(0,i.kt)("em",{parentName:"p"},"borrowing"),". Yang terjadi pada statement reference adalah data milik owner dipinjam dalam bentuk pointer. Pointer itu sendiri merupakan alamat memory yang mengarah ke data sebenarnya (milik owner)."),(0,i.kt)("p",null,"Dari contoh di atas, bisa ditarik kesimpulan bahwa data string ",(0,i.kt)("inlineCode",{parentName:"p"},"hello rust")," memiliki dua reference:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Yang pertama adalah owner data, yaitu variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"msg_3")),(0,i.kt)("li",{parentName:"ul"},"Yang kedua adalah peminjam data, yaitu variabel pointer ",(0,i.kt)("inlineCode",{parentName:"li"},"msg_4"))),(0,i.kt)("h2",{id:"a352-rust-borrow-checker"},"A.35.2. Rust Borrow Checker"),(0,i.kt)("p",null,"Rust compiler memiliki 1 bagian bernama ",(0,i.kt)("strong",{parentName:"p"},"borrow checker"),", tugasnya untuk melakukan pengecekan pada source code apakah ada kode yang berhubungan dengan ownership dan borrowing, dan apakah kode tersebut mengikuti aturan borrowing yang sudah ditetapkan oleh Rust, atau tidak. Jika ada yang menyalahi aturan, maka borrow checker memunculkan error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Borrow checker sangat galak, pastikan kode yang ditulis mengikuti aturan yang berlaku di pemrograman Rust.")),(0,i.kt)("h2",{id:"a353-aturan-borrowing"},"A.35.3. Aturan borrowing"),(0,i.kt)("p",null,"Aturan borrowing atau reference sempat disinggung pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),", yang kurang lebih adalah:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Dalam waktu yang sama, hanya boleh ada satu mutable reference atau banyak immutable reference (keduanya tidak bisa bersamaan, harus salah satu)."),(0,i.kt)("li",{parentName:"ul"},"Reference harus selalu valid.")),(0,i.kt)("p",null,"Dua aturan tersebut wajib dipatuhi, jika tidak maka pasti muncul error."),(0,i.kt)("p",null,"Ok, selanjutnya mari kita test aturan tersebut."),(0,i.kt)("h2",{id:"a354-borrowing-mutableimmutable-reference"},"A.35.4. Borrowing mutable/immutable reference"),(0,i.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,i.kt)("p",null,"Pada contoh berikut kita simulasikan 1 data memiliki banyak immutable reference. Jika mengacu ke aturan di atas, maka hal seperti ini adalah boleh dan tidak menghasilkan error."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let msg_5 = String::from("hello rust");\n\nlet msg_6 = &msg_5;\nlet msg_7 = &msg_5;\nlet msg_8 = &msg_5;\n\nprintln!("{:?} {:?} {:?}", msg_6, msg_7, msg_8);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(9470).Z,width:"470",height:"301"})),(0,i.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,i.kt)("p",null,"Pada contoh ke-2 ini, kita coba simulasikan 1 data memiliki 1 mutable reference. Harusnya tidak muncul error karena diperbolehkan di aturan yang tertulis."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_9 = String::from("hello rust");\n\nlet msg_10 = &mut msg_9;\n\nprintln!("{:?}", msg_10);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(5982).Z,width:"497",height:"272"})),(0,i.kt)("p",null,"Bagaimana jika ada lebih dari 1 mutable reference? mari kita test."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_9 = String::from("hello rust");\n\nlet msg_10 = &mut msg_9;\nlet msg_11 = &mut msg_9;\n\nprintln!("{:?} {:?}", msg_10, msg_11);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(8301).Z,width:"652",height:"613"})),(0,i.kt)("p",null,"Hasilnya error. Hal seperti ini tidak diperbolehkan. Sebuah data tidak boleh memiliki lebih dari 1 mutable reference."),(0,i.kt)("h3",{id:"-contoh-ke-3"},"\u25c9 Contoh ke-3"),(0,i.kt)("p",null,"Sekarang mari kita coba test lagi aturan di atas dengan skenario: dalam waktu yang sama, 1 data memiliki 1 mutable reference dan 1 immutable reference. Hasilnya seperti apa, (jika mengacu ke aturan, hal seperti ini adalah tidak diperbolehkan)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_12 = String::from("hello rust");\n\nlet msg_13 = &msg_12;\nlet msg_14 = &mut msg_12;\n\nprintln!("{:?} {:?}", msg_13, msg_14);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(6389).Z,width:"652",height:"486"})),(0,i.kt)("p",null,"Hasilnya error, kenapa? karena memang tidak boleh."),(0,i.kt)("p",null,"Jadi sampai sini cukup jelas ya. Sebuah data dalam waktu yang sama hanya diperbolehkan memiliki satu atau lebih immutable reference, atau hanya 1 mutable reference, dan keduanya tidak bisa bersamaan dalam satu waktu (harus pilih salah satu)."),(0,i.kt)("h2",{id:"a355-borrowing-validinvalid-reference"},"A.35.5. Borrowing valid/invalid reference"),(0,i.kt)("p",null,"Kita telah belajar tentang ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership#a333-variable-scope"},"valid/invalid variable dan juga variable scope")," pada chapter sebelumnya. Sekarang kita akan coba gabungkan dua aspek tersebut dengan borrowing."),(0,i.kt)("p",null,"Silakan praktikkan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut fact_one = String::from("Arthas is the true lich king");\n\n change_value(&mut fact_one);\n\n let fact_two = &mut fact_one;\n println!("{:?}", fact_two);\n}\n\nfn change_value(txt: &mut String) {\n *txt = String::from("Bolvar is better lich king");\n}\n')),(0,i.kt)("p",null,"Pada kode di atas, ada satu buah mutable string bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one"),". String tersebut dipinjam menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," (yang berarti adalah mutable borrow) sebagai argumen pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value")," yang isinya kurang lebih adalah perubahan isi data string pada variabel pointer."),(0,i.kt)("p",null,"Kemudian, ada operasi peminjaman lagi (yang juga mutable borrow) dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one"),"."),(0,i.kt)("p",null,"Ketika program di-run, hasilnya sukses. Kok bisa? padahal jelas di aturan tertulis bahwa dalam waktu yang sama tidak boleh ada lebih dari satu mutable borrow."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(538).Z,width:"449",height:"88"})),(0,i.kt)("p",null,"Kata ",(0,i.kt)("strong",{parentName:"p"},"dalam waktu yang sama")," di sini adalah yang penting untuk dipahami. Arti ",(0,i.kt)("em",{parentName:"p"},"dalam waktu yang sama")," adalah dalam 1 scope yang sama. Jika ada 2 scope, maka itu sudah bukan dalam waktu yang sama lagi."),(0,i.kt)("p",null,"Pada contoh di atas, statement ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut fact_one")," terjadi pada block fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", lebih tepatnya pada parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," fungsi tersebut."),(0,i.kt)("p",null,"Kemudian setelah eksekusi fungsi tersebut selesai, yang terjadi adalah: reference yang tadinya dipinjam, sekarang dikembalikan. Tepat setelah eksekusi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", state data ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one")," adalah tidak dipinjam siapapun. Tadinya memang ada yang meminjam (yaitu parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),"), tapi setelah eksekusi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value")," selesai, data dikembalikan lagi ke owner."),(0,i.kt)("p",null,"Proses dealokasi pada variable scope, jika terjadi pada variable reference maka yang sebenarnya terjadi adalah pengembalian data hasil operasi borrow ke pemilik aslinya."),(0,i.kt)("p",null,"Kemudian, ada operasi pinjam lagi, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"let fact_two = &mut fact_one"),". Statement borrow ini tidak menghasilkan error karena memang kondisi data ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one")," sudah tidak ada yang meminjam. Bisa dibilang statement peminjaman ke-2 ini tidak terjadi dalam waktu yang sama dengan statement peminjaman pertama (pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),")."),(0,i.kt)("p",null,"Pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," adalah valid saat fungsi dijalankan. Setelah pemanggilan fungsi selesai, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," di-dealokasi. Namun karena variabel tersebut bukanlah owner, melainkan hanya borrower yang meminjam data dari owner ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one"),", maka yang terjadi adalah: data yang dipinjam sekarang dikembalikan lagi ke pemilik aslinya."),(0,i.kt)("p",null,"Ok sampai sini semoga cukup jelas ya. Jika perlu silakan ulang-ulang penjelasan di atas."),(0,i.kt)("h2",{id:"a356-borrowing-pada-block"},"A.35.6. Borrowing pada block"),(0,i.kt)("p",null,"Kita sudah cukup paham kapan waktu terjadinya alokasi alamat memory dan juga kapan proses dealokasi terjadi, yaitu ketika variabel ",(0,i.kt)("strong",{parentName:"p"},"into scope")," dan ketika variabel ",(0,i.kt)("strong",{parentName:"p"},"out of scope"),"."),(0,i.kt)("p",null,"Scope di sini adalah variable scope, yang maksudnya adalah block scope, bisa berupa block expression, fungsi, block seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"if"),", dan juga jenis block lainnya."),(0,i.kt)("p",null,"Ok, sekarang mari kita praktikkan beberapa jenis block untuk isolasi operasi borrowing. Dengan ini maka klausul ",(0,i.kt)("strong",{parentName:"p"},"dalam satu waktu")," akan terpenuhi."),(0,i.kt)("p",null,"Silakan modifikasi program sebelumnya menjadi seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut fact_one = String::from("Arthas is the true lich king");\n println!("{:?}", fact_one);\n\n change_value(&mut fact_one);\n println!("{:?}", fact_one);\n\n {\n let fact_two = &mut fact_one;\n *fact_two = String::from("There must always be a lich king");\n println!("{:?}", fact_one);\n }\n\n if fact_one.contains("lich king") {\n let fact_three = &mut fact_one;\n *fact_three = String::from("Who is the real jailer?");\n println!("{:?}", fact_one);\n }\n\n for _ in 0..1 {\n let fact_four = &mut fact_one;\n *fact_four = String::from("Is it Zovaal or Primus?");\n println!("{:?}", fact_one);\n }\n}\n\nfn change_value(txt: &mut String) {\n *txt = String::from("Bolvar is better lich king");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(2751).Z,width:"459",height:"175"})),(0,i.kt)("p",null,"Bisa dilihat, hasilnya tidak error, meskipun terjadi beberapa kali operasi mutable borrow, tapi karena kesemuanya terjadi di waktu yang berbeda (di scope yang berbeda) maka tidak error."),(0,i.kt)("p",null,"Pada kode di atas, mutable borrow terjadi di banyak tempat, yaitu di block fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", block expression, block seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"if"),", dan juga block perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"for"),". Variabel pointer yang menampung data pinjaman akan valid di masing-masing block, kemudian menjadi invalid setelah eksekusi block selesai, dan yang terjadi setelah itu adalah pengembalian data yang telah dipinjam."),(0,i.kt)("h3",{id:"-method-contains-milik-string"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"contains")," milik ",(0,i.kt)("inlineCode",{parentName:"h3"},"String")),(0,i.kt)("p",null,"Pada contoh di atas kita menerapkan method baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"contains"),". Method ini tersedia untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", gunanya adalah untuk mengecek apakah string memiliki substring ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),", yang mana ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," sendiri adalah argumen pemanggilan method. Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"bool"),"."),(0,i.kt)("p",null,"Contoh penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"contains"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let fact = String::from("There must always be a lich king");\nprintln!("{:?}", fact.contains("lich king")); // output => true\nprintln!("{:?}", fact.contains("bolvar")); // output => false\n')),(0,i.kt)("p",null,"O iya, pengecekan string-nya adalah case sensitive ya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let fact = String::from("There must always be a lich king");\nprintln!("{:?}", fact.contains("lich king")); // output => true\nprintln!("{:?}", fact.contains("Lich King")); // output => false\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai tipe data string dan method yang tersedia pada tipe tersebut akan dibahas terpisah pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/string-slice-vs-string-literal"},"Tipe Data \u279c String Custom Type vs &str"),".")),(0,i.kt)("h2",{id:"a357-owner-dan-borrower-data-literal"},"A.35.7. Owner dan borrower data literal"),(0,i.kt)("p",null,"Perhatikan statement berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let number = 12;\nlet a = &number;\n\nlet text = String::from("hello");\nlet b = &text;\n')),(0,i.kt)("p",null,"Pada kode di atas, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"number")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"text")," adalah ",(0,i.kt)("em",{parentName:"p"},"owner")," data masing-masing. Sedangkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"a")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"b")," adalah ",(0,i.kt)("em",{parentName:"p"},"borrower")," atau peminjam data (yang lebih jelasnya akan dibahas pada chapter ). Sampai sini penulis rasa cukup jelas."),(0,i.kt)("p",null,"Selanjutnya, bagaimana dengan contoh ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let c = &24;\nlet d = &false;\nlet e = &String::from("rust");\n')),(0,i.kt)("p",null,"Ketiga variabel, semuanya adalah ",(0,i.kt)("em",{parentName:"p"},"borrower")," atau peminjam data. Lalu siapa ",(0,i.kt)("em",{parentName:"p"},"owner"),"-nya? jawabannya adalah tidak ada, atau silakan juga simpulkan bawah data tersebut owner-nya adalah program."),(0,i.kt)("p",null,"Yang lebih penting untuk diurusi pada contoh di atas bukan siapa owner-nya, melainkan bagaimana caranya agar data pinjaman tersebut tidak di-dealokasi saat block kode selesai."),(0,i.kt)("p",null,"Untuk sekarang sampai sini dulu. Kita akan bahas topik ini lebih mendetail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/static"},"Static item")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/lifetime"},"Lifetime"),"."),(0,i.kt)("h2",{id:"a358-borrowing-pada-macro-println"},"A.35.8. Borrowing pada macro ",(0,i.kt)("inlineCode",{parentName:"h2"},"println")),(0,i.kt)("p",null,"Pada pemanggilan macro println untuk menampilkan data yang mengadopsi ",(0,i.kt)("em",{parentName:"p"},"move semantics"),", operasi borrowing tidak perlu dilakukan sewaktu pengisian argument. Karena macro tersebut secara cerdas akan melakukan opearsi peminjaman tanpa memindah owner-nya. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("luwe");\nprintln!("{:?}", str1);\n')),(0,i.kt)("p",null,"... adalah ekuivalen dengan ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str2 = String::from("ngelak");\nprintln!("{:?}", &str2);\n')),(0,i.kt)("p",null,"Lebih jelasnya mengenai macro dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/borrowing"},"github.com/novalagung/dasarpemrogramanrust-example/../borrowing")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("p",null,"Beberapa referensi terkait chapter ini:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html"},"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/57225055/in-rust-can-you-own-a-string-literal"},"https://stackoverflow.com/questions/57225055/in-rust-can-you-own-a-string-literal"))))}p.isMDXComponent=!0},9470:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-1-6abee77c6350f8a390a807adac852003.png"},5982:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-2-cf66c8ef1c4b76c209f6d8c7d3339a3f.png"},8301:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-3-55cc0f7a0b551f62c748a9bf0396a671.png"},6389:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-4-c806f4e6787a069015fe56b40e97b3ca.png"},538:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAABYCAIAAAACx9uAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTBUMjM6MjU6MjArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjU4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjU4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ1ZjkzMTk0LTNmMGMtZTM0Zi05OGVkLTg4MGRjMDEyMGQ0OCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5YTg1OGYwOC03MjFmLWNkNDktYTU0NS03MmJkMzgyMzdhNzAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5YTg1OGYwOC03MjFmLWNkNDktYTU0NS03MmJkMzgyMzdhNzAiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjlhODU4ZjA4LTcyMWYtY2Q0OS1hNTQ1LTcyYmQzODIzN2E3MDwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjlhODU4ZjA4LTcyMWYtY2Q0OS1hNTQ1LTcyYmQzODIzN2E3MCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMFQyMzoyNToyMCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NWY5MzE5NC0zZjBjLWUzNGYtOThlZC04ODBkYzAxMjBkNDgiIHN0RXZ0OndoZW49IjIwMjItMTItMTNUMTc6MDc6NTgrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7RRLJYAAAOl0lEQVR42u1du3LkNhDUl0jnzLFj+VJllhMHF+xlKqcqV23VZfch+gR9xeX6KO/yCWB6BgMS4HJX3eUqn7h4zQBoDgCyeXdPEARBLMUd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"},2751:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcsAAACvCAIAAAAdcmLoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTBUMjM6NTE6MjcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjIxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjIxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmI0ZWE3OTFhLWQyYzQtOTY0ZC05M2I5LTAzMjE0Mjg1YjkyYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1ZDE1NTJlMy0wN2EwLWM3NGEtOWViZC1jMTAyY2FkZDdiN2MiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1ZDE1NTJlMy0wN2EwLWM3NGEtOWViZC1jMTAyY2FkZDdiN2MiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjVkMTU1MmUzLTA3YTAtYzc0YS05ZWJkLWMxMDJjYWRkN2I3YzwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjVkMTU1MmUzLTA3YTAtYzc0YS05ZWJkLWMxMDJjYWRkN2I3YyIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMFQyMzo1MToyNyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNGVhNzkxYS1kMmM0LTk2NGQtOTNiOS0wMzIxNDI4NWI5MmEiIHN0RXZ0OndoZW49IjIwMjItMTItMTNUMTc6MDc6MjErMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6+wuB7AAAZMklEQVR42u2dvXLcNheGcyXrpHOdOnHrLkqTwoXcadJ6MuOZr9OF+BJ8Fep1UZ92ueTi5z3AAQlyuavnnUwsUSQIgMDDAxB8+csBIYTQ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"}}]); \ No newline at end of file diff --git a/assets/js/fb18633e.b4caf1fa.js b/assets/js/fb18633e.b4caf1fa.js deleted file mode 100644 index 0decacf4..00000000 --- a/assets/js/fb18633e.b4caf1fa.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7310],{3905:(a,e,n)=>{n.d(e,{Zo:()=>m,kt:()=>k});var t=n(7294);function i(a,e,n){return e in a?Object.defineProperty(a,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):a[e]=n,a}function r(a,e){var n=Object.keys(a);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(a);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),n.push.apply(n,t)}return n}function l(a){for(var e=1;e=0||(i[n]=a[n]);return i}(a,e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(a,n)&&(i[n]=a[n])}return i}var u=t.createContext({}),s=function(a){var e=t.useContext(u),n=e;return a&&(n="function"==typeof a?a(e):l(l({},e),a)),n},m=function(a){var e=s(a.components);return t.createElement(u.Provider,{value:e},a.children)},p={inlineCode:"code",wrapper:function(a){var e=a.children;return t.createElement(t.Fragment,{},e)}},d=t.forwardRef((function(a,e){var n=a.components,i=a.mdxType,r=a.originalType,u=a.parentName,m=o(a,["components","mdxType","originalType","parentName"]),d=s(n),k=i,g=d["".concat(u,".").concat(k)]||d[k]||p[k]||r;return n?t.createElement(g,l(l({ref:e},m),{},{components:n})):t.createElement(g,l({ref:e},m))}));function k(a,e){var n=arguments,i=e&&e.mdxType;if("string"==typeof a||i){var r=n.length,l=new Array(r);l[0]=d;var o={};for(var u in e)hasOwnProperty.call(e,u)&&(o[u]=e[u]);o.originalType=a,o.mdxType="string"==typeof a?a:i,l[1]=o;for(var s=2;s{n.r(e),n.d(e,{assets:()=>u,contentTitle:()=>l,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>s});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:35,title:"A.35. Borrowing",sidebar_label:"A.35. Borrowing"},l=void 0,o={unversionedId:"basic/borrowing",id:"basic/borrowing",title:"A.35. Borrowing",description:"Pada chapter ini kita akan belajar tentang apa itu borrowing dalam Rust programming.",source:"@site/docs/basic/borrowing.md",sourceDirName:"basic",slug:"/basic/borrowing",permalink:"/basic/borrowing",draft:!1,tags:[],version:"current",sidebarPosition:35,frontMatter:{sidebar_position:35,title:"A.35. Borrowing",sidebar_label:"A.35. Borrowing"},sidebar:"tutorialSidebar",previous:{title:"A.34. Ownership",permalink:"/basic/ownership"},next:{title:"A.36. Traits",permalink:"/basic/traits"}},u={},s=[{value:"A.35.1. Konsep borrowing",id:"a351-konsep-borrowing",level:2},{value:"A.35.2. Rust Borrow Checker",id:"a352-rust-borrow-checker",level:2},{value:"A.35.3. Aturan borrowing",id:"a353-aturan-borrowing",level:2},{value:"A.35.4. Borrowing mutable/immutable reference",id:"a354-borrowing-mutableimmutable-reference",level:2},{value:"\u25c9 Contoh ke-1",id:"-contoh-ke-1",level:3},{value:"\u25c9 Contoh ke-2",id:"-contoh-ke-2",level:3},{value:"\u25c9 Contoh ke-3",id:"-contoh-ke-3",level:3},{value:"A.35.5. Borrowing valid/invalid reference",id:"a355-borrowing-validinvalid-reference",level:2},{value:"A.35.6. Borrowing pada block",id:"a356-borrowing-pada-block",level:2},{value:"\u25c9 Method contains milik String",id:"-method-contains-milik-string",level:3},{value:"A.35.7. Owner dan borrower data literal",id:"a357-owner-dan-borrower-data-literal",level:2},{value:"A.35.8. Borrowing pada macro println",id:"a358-borrowing-pada-macro-println",level:2},{value:"Catatan chapter \ud83d\udcd1",id:"catatan-chapter-",level:2},{value:"\u25c9 Source code praktik",id:"-source-code-praktik",level:3},{value:"\u25c9 Referensi",id:"-referensi",level:3}],m={toc:s};function p(a){let{components:e,...r}=a;return(0,i.kt)("wrapper",(0,t.Z)({},m,r,{components:e,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Pada chapter ini kita akan belajar tentang apa itu borrowing dalam Rust programming."),(0,i.kt)("p",null,"Sebelum masuk ke pembelajaran, penulis anjurkan untuk paham terlebih dahulu tentang ",(0,i.kt)("a",{parentName:"p",href:"/basic/basic-memory-management"},"Basic Memory Management"),", ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),", dan juga konsep ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership"},"Ownership"),". Ketiga topik tersebut dipelajari pada chapter sebelum ini."),(0,i.kt)("h2",{id:"a351-konsep-borrowing"},"A.35.1. Konsep borrowing"),(0,i.kt)("p",null,"Pada chapter sebelumnya kita telah belajar bahwa tipe data yang mengadopsi ",(0,i.kt)("em",{parentName:"p"},"move semantics")," (seperti ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),"), ketika digunakan pada operasi assignment maka owner-nya berpindah. Variabel yang sebelumnya adalah owner, setelah proses assignment menjadi invalid, karena owner data tersebut telah berpindah ke variabel baru. Efeknya, semua operasi yang dilakukan pada variabel owner sebelumnya menghasilkan error."),(0,i.kt)("p",null,"Sekarang perhatikan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let msg_1 = String::from("hello");\nlet msg_2 = msg_1;\n\nprintln!("{:?}", msg_2);\nprintln!("{:?}", msg_1);\n')),(0,i.kt)("p",null,"Pada contoh di atas, statement print ",(0,i.kt)("inlineCode",{parentName:"p"},"msg_1")," menghasilkan error karena variabel tersebut telah invalid setelah statement ",(0,i.kt)("inlineCode",{parentName:"p"},"let msg_2 = msg_1"),"."),(0,i.kt)("p",null,"Programmer harus ekstra hati-hati dan bijak dalam pengelolaan owner data, agar memory ter-manage dengan baik. Tapi kalau dipikir-pikir, repot juga kalau owner harus dilempar-lempar setiap selesai digunakan agar tidak error."),(0,i.kt)("p",null,"Salah satu cara yang bisa digunakan agar tidak terlalu repot adalah dengan menerapkan cloning (seperti yang sudah dibahas pada chapter sebelumnya). Namun ini bukan opsi yang baik karena boros memory, sedangkan di sisi lain programmer dianjurkan untuk efisien dalam penggunaan memory."),(0,i.kt)("p",null,"Solusi yang paling pas adalah dengan menerapkan ",(0,i.kt)("strong",{parentName:"p"},"borrowing"),". Borrowing artinya adalah meminjam. Pada konteks Rust programming, borrowing berarti meminjam data milik owner, dipinjam agar bisa diakses tanpa perlu memindah owner-nya. Kemudian setelah peminjaman selesai, data dikembalikan."),(0,i.kt)("p",null,"Cara meminjam data di Rust sangat mudah, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Untuk borrowing dengan level akses immutable/read-only, gunakan operator reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let msg_3 = String::from("hello rust");\nlet msg_4 = &msg_3; // <----- borrow operation\n\nprintln!("{:?}", msg_4); // output => hello rust\nprintln!("{:?}", msg_3); // output => hello rust\n'))),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("p",{parentName:"li"},"Untuk borrowing dengan level akses mutable, gunakan operator reference ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")),(0,i.kt)("pre",{parentName:"li"},(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_3 = String::from("hello");\nlet msg_4 = &mut msg_3; // <----- mutable borrow operation\n\n*msg_4 = String::from("hello rust");\n\nprintln!("{:?}", msg_4); // output => hello rust\nprintln!("{:?}", msg_3); // output => hello rust\n')))),(0,i.kt)("p",null,"Di Rust, semua statement reference (baik mutable ataupun immutable) adalah operasi ",(0,i.kt)("em",{parentName:"p"},"borrowing"),". Yang terjadi pada statement reference adalah data milik owner dipinjam dalam bentuk pointer. Pointer itu sendiri merupakan alamat memory yang mengarah ke data sebenarnya (milik owner)."),(0,i.kt)("p",null,"Dari contoh di atas, bisa ditarik kesimpulan bahwa data string ",(0,i.kt)("inlineCode",{parentName:"p"},"hello rust")," memiliki dua reference:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Yang pertama adalah owner data, yaitu variabel ",(0,i.kt)("inlineCode",{parentName:"li"},"msg_3")),(0,i.kt)("li",{parentName:"ul"},"Yang kedua adalah peminjam data, yaitu variabel pointer ",(0,i.kt)("inlineCode",{parentName:"li"},"msg_4"))),(0,i.kt)("h2",{id:"a352-rust-borrow-checker"},"A.35.2. Rust Borrow Checker"),(0,i.kt)("p",null,"Rust compiler memiliki 1 bagian bernama ",(0,i.kt)("strong",{parentName:"p"},"borrow checker"),", tugasnya untuk melakukan pengecekan pada source code apakah ada kode yang berhubungan dengan ownership dan borrowing, dan apakah kode tersebut mengikuti aturan borrowing yang sudah ditetapkan oleh Rust, atau tidak. Jika ada yang menyalahi aturan, maka borrow checker memunculkan error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Borrow checker sangat galak, pastikan kode yang ditulis mengikuti aturan yang berlaku di pemrograman Rust.")),(0,i.kt)("h2",{id:"a353-aturan-borrowing"},"A.35.3. Aturan borrowing"),(0,i.kt)("p",null,"Aturan borrowing atau reference sempat disinggung pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/pointer-references"},"Pointer & References"),", yang kurang lebih adalah:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Dalam waktu yang sama, hanya boleh ada satu mutable reference atau banyak immutable reference (keduanya tidak bisa bersamaan, harus salah satu)."),(0,i.kt)("li",{parentName:"ul"},"Reference harus selalu valid.")),(0,i.kt)("p",null,"Dua aturan tersebut wajib dipatuhi, jika tidak maka pasti muncul error."),(0,i.kt)("p",null,"Ok, selanjutnya mari kita test aturan tersebut."),(0,i.kt)("h2",{id:"a354-borrowing-mutableimmutable-reference"},"A.35.4. Borrowing mutable/immutable reference"),(0,i.kt)("h3",{id:"-contoh-ke-1"},"\u25c9 Contoh ke-1"),(0,i.kt)("p",null,"Pada contoh berikut kita simulasikan 1 data memiliki banyak immutable reference. Jika mengacu ke aturan di atas, maka hal seperti ini adalah boleh dan tidak menghasilkan error."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let msg_5 = String::from("hello rust");\n\nlet msg_6 = &msg_5;\nlet msg_7 = &msg_5;\nlet msg_8 = &msg_5;\n\nprintln!("{:?} {:?} {:?}", msg_6, msg_7, msg_8);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(9470).Z,width:"470",height:"301"})),(0,i.kt)("h3",{id:"-contoh-ke-2"},"\u25c9 Contoh ke-2"),(0,i.kt)("p",null,"Pada contoh ke-2 ini, kita coba simulasikan 1 data memiliki 1 mutable reference. Harusnya tidak muncul error karena diperbolehkan di aturan yang tertulis."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_9 = String::from("hello rust");\n\nlet msg_10 = &mut msg_9;\n\nprintln!("{:?}", msg_10);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(5982).Z,width:"497",height:"272"})),(0,i.kt)("p",null,"Bagaimana jika ada lebih dari 1 mutable reference? mari kita test."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_9 = String::from("hello rust");\n\nlet msg_10 = &mut msg_9;\nlet msg_11 = &mut msg_9;\n\nprintln!("{:?} {:?}", msg_10, msg_11);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(8301).Z,width:"652",height:"613"})),(0,i.kt)("p",null,"Hasilnya error. Hal seperti ini tidak diperbolehkan. Sebuah data tidak boleh memiliki lebih dari 1 mutable reference."),(0,i.kt)("h3",{id:"-contoh-ke-3"},"\u25c9 Contoh ke-3"),(0,i.kt)("p",null,"Sekarang mari kita coba test lagi aturan di atas dengan skenario: dalam waktu yang sama, 1 data memiliki 1 mutable reference dan 1 immutable reference. Hasilnya seperti apa, (jika mengacu ke aturan, hal seperti ini adalah tidak diperbolehkan)."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let mut msg_12 = String::from("hello rust");\n\nlet msg_13 = &msg_12;\nlet msg_14 = &mut msg_12;\n\nprintln!("{:?} {:?}", msg_13, msg_14);\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(6389).Z,width:"652",height:"486"})),(0,i.kt)("p",null,"Hasilnya error, kenapa? karena memang tidak boleh."),(0,i.kt)("p",null,"Jadi sampai sini cukup jelas ya. Sebuah data dalam waktu yang sama hanya diperbolehkan memiliki satu atau lebih immutable reference, atau hanya 1 mutable reference, dan keduanya tidak bisa bersamaan dalam satu waktu (harus pilih salah satu)."),(0,i.kt)("h2",{id:"a355-borrowing-validinvalid-reference"},"A.35.5. Borrowing valid/invalid reference"),(0,i.kt)("p",null,"Kita telah belajar tentang ",(0,i.kt)("a",{parentName:"p",href:"/basic/ownership#a333-variable-scope"},"valid/invalid variable dan juga variable scope")," pada chapter sebelumnya. Sekarang kita akan coba gabungkan dua aspek tersebut dengan borrowing."),(0,i.kt)("p",null,"Silakan praktikkan kode berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut fact_one = String::from("Arthas is the true lich king");\n\n change_value(&mut fact_one);\n\n let fact_two = &mut fact_one;\n println!("{:?}", fact_two);\n}\n\nfn change_value(txt: &mut String) {\n *txt = String::from("Bolvar is better lich king");\n}\n')),(0,i.kt)("p",null,"Pada kode di atas, ada satu buah mutable string bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one"),". String tersebut dipinjam menggunakan ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut")," (yang berarti adalah mutable borrow) sebagai argumen pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value")," yang isinya kurang lebih adalah perubahan isi data string pada variabel pointer."),(0,i.kt)("p",null,"Kemudian, ada operasi peminjaman lagi (yang juga mutable borrow) dari variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one")," ke ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one"),"."),(0,i.kt)("p",null,"Ketika program di-run, hasilnya sukses. Kok bisa? padahal jelas di aturan tertulis bahwa dalam waktu yang sama tidak boleh ada lebih dari satu mutable borrow."),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(538).Z,width:"449",height:"88"})),(0,i.kt)("p",null,"Kata ",(0,i.kt)("strong",{parentName:"p"},"dalam waktu yang sama")," di sini adalah yang penting untuk dipahami. Arti ",(0,i.kt)("em",{parentName:"p"},"dalam waktu yang sama")," adalah dalam 1 scope yang sama. Jika ada 2 scope, maka itu sudah bukan dalam waktu yang sama lagi."),(0,i.kt)("p",null,"Pada contoh di atas, statement ",(0,i.kt)("inlineCode",{parentName:"p"},"&mut fact_one")," terjadi pada block fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", lebih tepatnya pada parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," fungsi tersebut."),(0,i.kt)("p",null,"Kemudian setelah eksekusi fungsi tersebut selesai, yang terjadi adalah: reference yang tadinya dipinjam, sekarang dikembalikan. Tepat setelah eksekusi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", state data ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one")," adalah tidak dipinjam siapapun. Tadinya memang ada yang meminjam (yaitu parameter ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," di fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),"), tapi setelah eksekusi fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value")," selesai, data dikembalikan lagi ke owner."),(0,i.kt)("p",null,"Proses dealokasi pada variable scope, jika terjadi pada variable reference maka yang sebenarnya terjadi adalah pengembalian data hasil operasi borrow ke pemilik aslinya."),(0,i.kt)("p",null,"Kemudian, ada operasi pinjam lagi, yaitu ",(0,i.kt)("inlineCode",{parentName:"p"},"let fact_two = &mut fact_one"),". Statement borrow ini tidak menghasilkan error karena memang kondisi data ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one")," sudah tidak ada yang meminjam. Bisa dibilang statement peminjaman ke-2 ini tidak terjadi dalam waktu yang sama dengan statement peminjaman pertama (pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),")."),(0,i.kt)("p",null,"Pada fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," adalah valid saat fungsi dijalankan. Setelah pemanggilan fungsi selesai, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"txt")," di-dealokasi. Namun karena variabel tersebut bukanlah owner, melainkan hanya borrower yang meminjam data dari owner ",(0,i.kt)("inlineCode",{parentName:"p"},"fact_one"),", maka yang terjadi adalah: data yang dipinjam sekarang dikembalikan lagi ke pemilik aslinya."),(0,i.kt)("p",null,"Ok sampai sini semoga cukup jelas ya. Jika perlu silakan ulang-ulang penjelasan di atas."),(0,i.kt)("h2",{id:"a356-borrowing-pada-block"},"A.35.6. Borrowing pada block"),(0,i.kt)("p",null,"Kita sudah cukup paham kapan waktu terjadinya alokasi alamat memory dan juga kapan proses dealokasi terjadi, yaitu ketika variabel ",(0,i.kt)("strong",{parentName:"p"},"into scope")," dan ketika variabel ",(0,i.kt)("strong",{parentName:"p"},"out of scope"),"."),(0,i.kt)("p",null,"Scope di sini adalah variable scope, yang maksudnya adalah block scope, bisa berupa block expression, fungsi, block seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"if"),", dan juga jenis block lainnya."),(0,i.kt)("p",null,"Ok, sekarang mari kita praktikkan beberapa jenis block untuk isolasi operasi borrowing. Dengan ini maka klausul ",(0,i.kt)("strong",{parentName:"p"},"dalam satu waktu")," akan terpenuhi."),(0,i.kt)("p",null,"Silakan modifikasi program sebelumnya menjadi seperti berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let mut fact_one = String::from("Arthas is the true lich king");\n println!("{:?}", fact_one);\n\n change_value(&mut fact_one);\n println!("{:?}", fact_one);\n\n {\n let fact_two = &mut fact_one;\n *fact_two = String::from("There must always be a lich king");\n println!("{:?}", fact_one);\n }\n\n if fact_one.contains("lich king") {\n let fact_three = &mut fact_one;\n *fact_three = String::from("Who is the real jailer?");\n println!("{:?}", fact_one);\n }\n\n for _ in 0..1 {\n let fact_four = &mut fact_one;\n *fact_four = String::from("Is it Zovaal or Primus?");\n println!("{:?}", fact_one);\n }\n}\n\nfn change_value(txt: &mut String) {\n *txt = String::from("Bolvar is better lich king");\n}\n')),(0,i.kt)("p",null,(0,i.kt)("img",{alt:"Borrowing",src:n(2751).Z,width:"459",height:"175"})),(0,i.kt)("p",null,"Bisa dilihat, hasilnya tidak error, meskipun terjadi beberapa kali operasi mutable borrow, tapi karena kesemuanya terjadi di waktu yang berbeda (di scope yang berbeda) maka tidak error."),(0,i.kt)("p",null,"Pada kode di atas, mutable borrow terjadi di banyak tempat, yaitu di block fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"change_value"),", block expression, block seleksi kondisi ",(0,i.kt)("inlineCode",{parentName:"p"},"if"),", dan juga block perulangan ",(0,i.kt)("inlineCode",{parentName:"p"},"for"),". Variabel pointer yang menampung data pinjaman akan valid di masing-masing block, kemudian menjadi invalid setelah eksekusi block selesai, dan yang terjadi setelah itu adalah pengembalian data yang telah dipinjam."),(0,i.kt)("h3",{id:"-method-contains-milik-string"},"\u25c9 Method ",(0,i.kt)("inlineCode",{parentName:"h3"},"contains")," milik ",(0,i.kt)("inlineCode",{parentName:"h3"},"String")),(0,i.kt)("p",null,"Pada contoh di atas kita menerapkan method baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"contains"),". Method ini tersedia untuk tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"String"),", gunanya adalah untuk mengecek apakah string memiliki substring ",(0,i.kt)("inlineCode",{parentName:"p"},"x"),", dimana ",(0,i.kt)("inlineCode",{parentName:"p"},"x")," adalah argumen pemanggilan method. Method ini mengembalikan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"bool"),"."),(0,i.kt)("p",null,"Contoh penerapan method ",(0,i.kt)("inlineCode",{parentName:"p"},"contains"),":"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let fact = String::from("There must always be a lich king");\nprintln!("{:?}", fact.contains("lich king")); // output => true\nprintln!("{:?}", fact.contains("bolvar")); // output => false\n')),(0,i.kt)("p",null,"O iya, pengecekan string-nya adalah case sensitive ya."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let fact = String::from("There must always be a lich king");\nprintln!("{:?}", fact.contains("lich king")); // output => true\nprintln!("{:?}", fact.contains("Lich King")); // output => false\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih jelasnya mengenai tipe data string dan method yang tersedia pada tipe tersebut akan dibahas terpisah pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/string-slice-vs-string-literal"},"Tipe Data \u279c String Custom Type vs &str"),".")),(0,i.kt)("h2",{id:"a357-owner-dan-borrower-data-literal"},"A.35.7. Owner dan borrower data literal"),(0,i.kt)("p",null,"Perhatikan statement berikut:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let number = 12;\nlet a = &number;\n\nlet text = String::from("hello");\nlet b = &text;\n')),(0,i.kt)("p",null,"Pada kode di atas, variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"number")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"text")," adalah ",(0,i.kt)("em",{parentName:"p"},"owner")," data masing-masing. Sedangkan variabel ",(0,i.kt)("inlineCode",{parentName:"p"},"a")," dan ",(0,i.kt)("inlineCode",{parentName:"p"},"b")," adalah ",(0,i.kt)("em",{parentName:"p"},"borrower")," atau peminjam data (yang lebih jelasnya akan dibahas pada chapter ). Sampai sini penulis rasa cukup jelas."),(0,i.kt)("p",null,"Selanjutnya, bagaimana dengan contoh ini:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let c = &24;\nlet d = &false;\nlet e = &String::from("rust");\n')),(0,i.kt)("p",null,"Ketiga variabel, semuanya adalah ",(0,i.kt)("em",{parentName:"p"},"borrower")," atau peminjam data. Lalu siapa ",(0,i.kt)("em",{parentName:"p"},"owner"),"-nya? jawabannya adalah tidak ada, atau silakan juga simpulkan bawah data tersebut owner-nya adalah program."),(0,i.kt)("p",null,"Yang lebih penting untuk diurusi pada contoh di atas bukan siapa owner-nya, melainkan bagaimana caranya agar data pinjaman tersebut tidak di-dealokasi saat block kode selesai."),(0,i.kt)("p",null,"Untuk sekarang sampai sini dulu. Kita akan bahas topik ini lebih mendetail pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/static"},"Static item")," dan ",(0,i.kt)("a",{parentName:"p",href:"/basic/lifetime"},"Lifetime"),"."),(0,i.kt)("h2",{id:"a358-borrowing-pada-macro-println"},"A.35.8. Borrowing pada macro ",(0,i.kt)("inlineCode",{parentName:"h2"},"println")),(0,i.kt)("p",null,"Pada pemanggilan macro println untuk menampilkan data yang mengadopsi ",(0,i.kt)("em",{parentName:"p"},"move semantics"),", operasi borrowing tidak perlu dilakukan sewaktu pengisian argument. Karena macro tersebut secara cerdas akan melakukan opearsi peminjaman tanpa memindah owner-nya. Contoh:"),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str1 = String::from("luwe");\nprintln!("{:?}", str1);\n')),(0,i.kt)("p",null,"... adalah ekuivalen dengan ..."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'let str2 = String::from("ngelak");\nprintln!("{:?}", &str2);\n')),(0,i.kt)("p",null,"Lebih jelasnya mengenai macro dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#/wip/macro"},"Macro"),"."),(0,i.kt)("hr",null),(0,i.kt)("h2",{id:"catatan-chapter-"},"Catatan chapter \ud83d\udcd1"),(0,i.kt)("h3",{id:"-source-code-praktik"},"\u25c9 Source code praktik"),(0,i.kt)("pre",null,(0,i.kt)("a",{href:"https://github.com/novalagung/dasarpemrogramanrust-example/tree/master/borrowing"},"github.com/novalagung/dasarpemrogramanrust-example/../borrowing")),(0,i.kt)("h3",{id:"-referensi"},"\u25c9 Referensi"),(0,i.kt)("p",null,"Beberapa referensi terkait chapter ini:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html"},"https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://stackoverflow.com/questions/57225055/in-rust-can-you-own-a-string-literal"},"https://stackoverflow.com/questions/57225055/in-rust-can-you-own-a-string-literal"))))}p.isMDXComponent=!0},9470:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-1-6abee77c6350f8a390a807adac852003.png"},5982:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-2-cf66c8ef1c4b76c209f6d8c7d3339a3f.png"},8301:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-3-55cc0f7a0b551f62c748a9bf0396a671.png"},6389:(a,e,n)=>{n.d(e,{Z:()=>t});const t=n.p+"assets/images/borrowing-4-c806f4e6787a069015fe56b40e97b3ca.png"},538:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcEAAABYCAIAAAACx9uAAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTBUMjM6MjU6MjArMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjU4KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjU4KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjQ1ZjkzMTk0LTNmMGMtZTM0Zi05OGVkLTg4MGRjMDEyMGQ0OCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo5YTg1OGYwOC03MjFmLWNkNDktYTU0NS03MmJkMzgyMzdhNzAiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo5YTg1OGYwOC03MjFmLWNkNDktYTU0NS03MmJkMzgyMzdhNzAiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjlhODU4ZjA4LTcyMWYtY2Q0OS1hNTQ1LTcyYmQzODIzN2E3MDwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjlhODU4ZjA4LTcyMWYtY2Q0OS1hNTQ1LTcyYmQzODIzN2E3MCIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMFQyMzoyNToyMCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDo0NWY5MzE5NC0zZjBjLWUzNGYtOThlZC04ODBkYzAxMjBkNDgiIHN0RXZ0OndoZW49IjIwMjItMTItMTNUMTc6MDc6NTgrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7RRLJYAAAOl0lEQVR42u1du3LkNhDUl0jnzLFj+VJllhMHF+xlKqcqV23VZfch+gR9xeX6KO/yCWB6BgMS4HJX3eUqn7h4zQBoDgCyeXdPEARBLMUd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"},2751:(a,e,n)=>{n.d(e,{Z:()=>t});const t="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAcsAAACvCAIAAAAdcmLoAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGdWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4xLWMwMDAgMTE2LjM5YWJhZjcsIDIwMjIvMDIvMjUtMjE6NTc6MjEgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMTItMTBUMjM6NTE6MjcrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjIxKzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTEyLTEzVDE3OjA3OjIxKzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmI0ZWE3OTFhLWQyYzQtOTY0ZC05M2I5LTAzMjE0Mjg1YjkyYSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1ZDE1NTJlMy0wN2EwLWM3NGEtOWViZC1jMTAyY2FkZDdiN2MiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo1ZDE1NTJlMy0wN2EwLWM3NGEtOWViZC1jMTAyY2FkZDdiN2MiPiA8cGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8cmRmOkJhZz4gPHJkZjpsaT54bXAuZGlkOjVkMTU1MmUzLTA3YTAtYzc0YS05ZWJkLWMxMDJjYWRkN2I3YzwvcmRmOmxpPiA8L3JkZjpCYWc+IDwvcGhvdG9zaG9wOkRvY3VtZW50QW5jZXN0b3JzPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjVkMTU1MmUzLTA3YTAtYzc0YS05ZWJkLWMxMDJjYWRkN2I3YyIgc3RFdnQ6d2hlbj0iMjAyMi0xMi0xMFQyMzo1MToyNyswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjUgKFdpbmRvd3MpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpiNGVhNzkxYS1kMmM0LTk2NGQtOTNiOS0wMzIxNDI4NWI5MmEiIHN0RXZ0OndoZW49IjIwMjItMTItMTNUMTc6MDc6MjErMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6+wuB7AAAZMklEQVR42u2dvXLcNheGcyXrpHOdOnHrLkqTwoXcadJ6MuOZr9OF+BJ8Fep1UZ92ueTi5z3AAQlyuavnnUwsUSQIgMDDAxB8+csBIYTQ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"}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.36445933.js b/assets/js/runtime~main.36445933.js deleted file mode 100644 index 9e2cdc04..00000000 --- a/assets/js/runtime~main.36445933.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";var e,a,c,d,r,b={},t={};function f(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return b[e].call(c.exports,c,c.exports,f),c.exports}f.m=b,e=[],f.O=(a,c,d,r)=>{if(!c){var b=1/0;for(i=0;i=r)&&Object.keys(f.O).every((e=>f.O[e](c[o])))?c.splice(o--,1):(t=!1,r0&&e[i-1][2]>r;i--)e[i]=e[i-1];e[i]=[c,d,r]},f.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return f.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,f.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var r=Object.create(null);f.r(r);var b={};a=a||[null,c({}),c([]),c(c)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>b[a]=()=>e[a]));return b.default=()=>e,f.d(r,b),r},f.d=(e,a)=>{for(var c in a)f.o(a,c)&&!f.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce(((a,c)=>(f.f[c](e,a),a)),[])),f.u=e=>"assets/js/"+({53:"935f2afb",274:"016a0787",620:"2bc2e36b",623:"9e6fe7cf",740:"f8d4e457",909:"bd9b9d52",1059:"7d03ccaf",1422:"62b99870",2089:"0ae704f7",2107:"8e991452",2359:"48e2ebd6",2399:"8ad68633",2706:"4c7e7ada",2870:"5f289fb7",2959:"68ec37cc",3007:"04da11da",3257:"82a9b669",3306:"164327b9",4197:"7a2568c4",4248:"8333c691",4274:"7390b81e",4452:"bc4edc5c",4622:"d8837387",4729:"c76cc2e3",4738:"496dcc30",4758:"68e1906b",4790:"b97d8256",4861:"db8ccf76",4943:"dabee7bd",5572:"be3f5c40",5673:"fef7d16c",5729:"4513d9f5",5751:"fd4f5a0c",5758:"71880105",5989:"2452d5f5",6161:"3b1dfe68",6345:"a2bea3ed",6388:"eb2a6637",6403:"475d163e",6477:"05cc1716",6531:"c01cce30",6691:"cb962766",6794:"b28a365a",6971:"c377a04b",7310:"fb18633e",7386:"3aa512bf",7505:"8d193b98",7539:"e7bd9b37",7720:"bdfc7662",7742:"87499f15",7865:"9a3629a6",7918:"17896441",7920:"1a4e3797",7949:"0e6b6dd1",8051:"dadaca00",8308:"4232c3ed",8358:"7794a932",8469:"93422b31",8732:"e4904969",8784:"d47a3664",8794:"af6aab29",9157:"c526a898",9323:"8333ea4d",9514:"1be78505",9831:"5925ce9f",9886:"8b55bf27"}[e]||e)+"."+{53:"13143cb2",205:"e9ca4e1a",274:"0ab1d3ab",620:"876e08c0",623:"c549f588",740:"88f7a231",909:"8d109af6",1059:"46ca6fcc",1422:"4801cdae",2089:"5940e697",2107:"9f077664",2359:"0b6ce575",2399:"0a69a909",2706:"f4643a6f",2870:"e0fc9497",2959:"d3961cb0",3007:"b3ba07e3",3257:"bb49d726",3306:"ce557677",4197:"cb80d87b",4248:"54569977",4274:"686f428e",4452:"f0b380ec",4622:"e6bc9bd5",4729:"c1ae2c67",4738:"2c33b3bd",4758:"f87d9410",4790:"7eff2a81",4861:"f925a746",4943:"9e39dc43",4972:"ea87a18a",5572:"4baec74d",5673:"7198ddd5",5729:"6ce8fc47",5751:"7de9809a",5758:"a92b59bc",5989:"c8d9088c",6161:"84da4a4d",6345:"c14ec614",6388:"01009699",6403:"4cbfe654",6477:"272262df",6531:"1810b6cb",6691:"fe11400b",6780:"3e547342",6794:"28a71aca",6945:"19e06702",6971:"753abc35",7310:"b4caf1fa",7386:"a1c7a02b",7505:"c7232d69",7539:"38bdc3e5",7720:"e5ac5751",7742:"679ef493",7865:"fcabd2cf",7918:"062de7c5",7920:"615c0dbb",7949:"a5062737",8051:"d3047a10",8308:"0eade53f",8358:"0807e2e7",8469:"7d2d5eae",8732:"2c9c10d1",8784:"2e54129a",8794:"fff2a138",8894:"7d968ee6",9157:"e25aff7f",9323:"d3688653",9514:"fa7071eb",9831:"d25861ea",9886:"a01d27dd"}[e]+".js",f.miniCssF=e=>{},f.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),f.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},r="dasarpemrogramanrust:",f.l=(e,a,c,b)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var r=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),r&&r.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},f.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},f.p="/",f.gca=function(e){return e={17896441:"7918",71880105:"5758","935f2afb":"53","016a0787":"274","2bc2e36b":"620","9e6fe7cf":"623",f8d4e457:"740",bd9b9d52:"909","7d03ccaf":"1059","62b99870":"1422","0ae704f7":"2089","8e991452":"2107","48e2ebd6":"2359","8ad68633":"2399","4c7e7ada":"2706","5f289fb7":"2870","68ec37cc":"2959","04da11da":"3007","82a9b669":"3257","164327b9":"3306","7a2568c4":"4197","8333c691":"4248","7390b81e":"4274",bc4edc5c:"4452",d8837387:"4622",c76cc2e3:"4729","496dcc30":"4738","68e1906b":"4758",b97d8256:"4790",db8ccf76:"4861",dabee7bd:"4943",be3f5c40:"5572",fef7d16c:"5673","4513d9f5":"5729",fd4f5a0c:"5751","2452d5f5":"5989","3b1dfe68":"6161",a2bea3ed:"6345",eb2a6637:"6388","475d163e":"6403","05cc1716":"6477",c01cce30:"6531",cb962766:"6691",b28a365a:"6794",c377a04b:"6971",fb18633e:"7310","3aa512bf":"7386","8d193b98":"7505",e7bd9b37:"7539",bdfc7662:"7720","87499f15":"7742","9a3629a6":"7865","1a4e3797":"7920","0e6b6dd1":"7949",dadaca00:"8051","4232c3ed":"8308","7794a932":"8358","93422b31":"8469",e4904969:"8732",d47a3664:"8784",af6aab29:"8794",c526a898:"9157","8333ea4d":"9323","1be78505":"9514","5925ce9f":"9831","8b55bf27":"9886"}[e]||e,f.p+f.u(e)},(()=>{var e={1303:0,532:0};f.f.j=(a,c)=>{var d=f.o(e,a)?e[a]:void 0;if(0!==d)if(d)c.push(d[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var r=new Promise(((c,r)=>d=e[a]=[c,r]));c.push(d[2]=r);var b=f.p+f.u(a),t=new Error;f.l(b,(c=>{if(f.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var r=c&&("load"===c.type?"missing":c.type),b=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+r+": "+b+")",t.name="ChunkLoadError",t.type=r,t.request=b,d[1](t)}}),"chunk-"+a,a)}},f.O.j=a=>0===e[a];var a=(a,c)=>{var d,r,b=c[0],t=c[1],o=c[2],n=0;if(b.some((a=>0!==e[a]))){for(d in t)f.o(t,d)&&(f.m[d]=t[d]);if(o)var i=o(f)}for(a&&a(c);n{"use strict";var e,a,c,f,d,r={},t={};function b(e){var a=t[e];if(void 0!==a)return a.exports;var c=t[e]={exports:{}};return r[e].call(c.exports,c,c.exports,b),c.exports}b.m=r,e=[],b.O=(a,c,f,d)=>{if(!c){var r=1/0;for(i=0;i=d)&&Object.keys(b.O).every((e=>b.O[e](c[o])))?c.splice(o--,1):(t=!1,d0&&e[i-1][2]>d;i--)e[i]=e[i-1];e[i]=[c,f,d]},b.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return b.d(a,{a:a}),a},c=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,b.t=function(e,f){if(1&f&&(e=this(e)),8&f)return e;if("object"==typeof e&&e){if(4&f&&e.__esModule)return e;if(16&f&&"function"==typeof e.then)return e}var d=Object.create(null);b.r(d);var r={};a=a||[null,c({}),c([]),c(c)];for(var t=2&f&&e;"object"==typeof t&&!~a.indexOf(t);t=c(t))Object.getOwnPropertyNames(t).forEach((a=>r[a]=()=>e[a]));return r.default=()=>e,b.d(d,r),d},b.d=(e,a)=>{for(var c in a)b.o(a,c)&&!b.o(e,c)&&Object.defineProperty(e,c,{enumerable:!0,get:a[c]})},b.f={},b.e=e=>Promise.all(Object.keys(b.f).reduce(((a,c)=>(b.f[c](e,a),a)),[])),b.u=e=>"assets/js/"+({53:"935f2afb",274:"016a0787",620:"2bc2e36b",623:"9e6fe7cf",740:"f8d4e457",909:"bd9b9d52",1059:"7d03ccaf",1422:"62b99870",2089:"0ae704f7",2107:"8e991452",2359:"48e2ebd6",2399:"8ad68633",2706:"4c7e7ada",2870:"5f289fb7",2959:"68ec37cc",3007:"04da11da",3257:"82a9b669",3306:"164327b9",4197:"7a2568c4",4248:"8333c691",4274:"7390b81e",4452:"bc4edc5c",4622:"d8837387",4729:"c76cc2e3",4738:"496dcc30",4758:"68e1906b",4790:"b97d8256",4861:"db8ccf76",4943:"dabee7bd",5572:"be3f5c40",5673:"fef7d16c",5729:"4513d9f5",5751:"fd4f5a0c",5758:"71880105",5989:"2452d5f5",6161:"3b1dfe68",6345:"a2bea3ed",6388:"eb2a6637",6403:"475d163e",6477:"05cc1716",6531:"c01cce30",6691:"cb962766",6794:"b28a365a",6971:"c377a04b",7310:"fb18633e",7386:"3aa512bf",7505:"8d193b98",7539:"e7bd9b37",7720:"bdfc7662",7742:"87499f15",7865:"9a3629a6",7918:"17896441",7920:"1a4e3797",7949:"0e6b6dd1",8051:"dadaca00",8308:"4232c3ed",8358:"7794a932",8469:"93422b31",8732:"e4904969",8784:"d47a3664",8794:"af6aab29",9157:"c526a898",9323:"8333ea4d",9514:"1be78505",9831:"5925ce9f",9886:"8b55bf27"}[e]||e)+"."+{53:"13143cb2",205:"e9ca4e1a",274:"ddd4552f",620:"876e08c0",623:"c549f588",740:"ba1644a0",909:"c2ec587a",1059:"a18e440e",1422:"eac41936",2089:"12a11a9d",2107:"9f077664",2359:"0b6ce575",2399:"0a69a909",2706:"9f072125",2870:"c8228f07",2959:"d3961cb0",3007:"d61e5604",3257:"402fdaf8",3306:"ce557677",4197:"cb80d87b",4248:"d59a9952",4274:"18c2ce22",4452:"30092a0e",4622:"31f2a62c",4729:"978efe66",4738:"2c33b3bd",4758:"57a9a7b8",4790:"7eff2a81",4861:"0bea83f9",4943:"9e39dc43",4972:"ea87a18a",5572:"3675591d",5673:"7198ddd5",5729:"f78b137f",5751:"7de9809a",5758:"761a2054",5989:"c8d9088c",6161:"a3e9cea9",6345:"53e03a1b",6388:"570a9def",6403:"60520781",6477:"bb8cde02",6531:"1810b6cb",6691:"2d69a424",6780:"3e547342",6794:"28a71aca",6945:"19e06702",6971:"753abc35",7310:"5c83c6b6",7386:"35e7bf91",7505:"9b1c2896",7539:"6bffc9e2",7720:"5ed547e8",7742:"3255091a",7865:"035a9d13",7918:"062de7c5",7920:"615c0dbb",7949:"a5062737",8051:"64b4e275",8308:"32b73572",8358:"f8711f2e",8469:"2fa67f2b",8732:"d2252a8b",8784:"2e54129a",8794:"62e5b74a",8894:"7d968ee6",9157:"18163a59",9323:"79e6ada8",9514:"fa7071eb",9831:"9da92efc",9886:"c5401f96"}[e]+".js",b.miniCssF=e=>{},b.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),b.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),f={},d="dasarpemrogramanrust:",b.l=(e,a,c,r)=>{if(f[e])f[e].push(a);else{var t,o;if(void 0!==c)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var d=f[e];if(delete f[e],t.parentNode&&t.parentNode.removeChild(t),d&&d.forEach((e=>e(c))),a)return a(c)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},b.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},b.p="/",b.gca=function(e){return e={17896441:"7918",71880105:"5758","935f2afb":"53","016a0787":"274","2bc2e36b":"620","9e6fe7cf":"623",f8d4e457:"740",bd9b9d52:"909","7d03ccaf":"1059","62b99870":"1422","0ae704f7":"2089","8e991452":"2107","48e2ebd6":"2359","8ad68633":"2399","4c7e7ada":"2706","5f289fb7":"2870","68ec37cc":"2959","04da11da":"3007","82a9b669":"3257","164327b9":"3306","7a2568c4":"4197","8333c691":"4248","7390b81e":"4274",bc4edc5c:"4452",d8837387:"4622",c76cc2e3:"4729","496dcc30":"4738","68e1906b":"4758",b97d8256:"4790",db8ccf76:"4861",dabee7bd:"4943",be3f5c40:"5572",fef7d16c:"5673","4513d9f5":"5729",fd4f5a0c:"5751","2452d5f5":"5989","3b1dfe68":"6161",a2bea3ed:"6345",eb2a6637:"6388","475d163e":"6403","05cc1716":"6477",c01cce30:"6531",cb962766:"6691",b28a365a:"6794",c377a04b:"6971",fb18633e:"7310","3aa512bf":"7386","8d193b98":"7505",e7bd9b37:"7539",bdfc7662:"7720","87499f15":"7742","9a3629a6":"7865","1a4e3797":"7920","0e6b6dd1":"7949",dadaca00:"8051","4232c3ed":"8308","7794a932":"8358","93422b31":"8469",e4904969:"8732",d47a3664:"8784",af6aab29:"8794",c526a898:"9157","8333ea4d":"9323","1be78505":"9514","5925ce9f":"9831","8b55bf27":"9886"}[e]||e,b.p+b.u(e)},(()=>{var e={1303:0,532:0};b.f.j=(a,c)=>{var f=b.o(e,a)?e[a]:void 0;if(0!==f)if(f)c.push(f[2]);else if(/^(1303|532)$/.test(a))e[a]=0;else{var d=new Promise(((c,d)=>f=e[a]=[c,d]));c.push(f[2]=d);var r=b.p+b.u(a),t=new Error;b.l(r,(c=>{if(b.o(e,a)&&(0!==(f=e[a])&&(e[a]=void 0),f)){var d=c&&("load"===c.type?"missing":c.type),r=c&&c.target&&c.target.src;t.message="Loading chunk "+a+" failed.\n("+d+": "+r+")",t.name="ChunkLoadError",t.type=d,t.request=r,f[1](t)}}),"chunk-"+a,a)}},b.O.j=a=>0===e[a];var a=(a,c)=>{var f,d,r=c[0],t=c[1],o=c[2],n=0;if(r.some((a=>0!==e[a]))){for(f in t)b.o(t,f)&&(b.m[f]=t[f]);if(o)var i=o(b)}for(a&&a(c);n