From 7ac10ca0376a8daebb60cf099f0c2c913b2f837f Mon Sep 17 00:00:00 2001 From: novalagung Date: Wed, 31 Jul 2024 11:15:37 +0000 Subject: [PATCH] deploy: a8c23ea58fa2cc3f2b4747ecaaeb70bea995e70e --- 404.html | 8 +++---- CONTRIBUTING.html | 12 +++++------ LICENSE.html | 12 +++++------ ...ing-1-a60b09beaa6803045688abcf2a1f4762.png | Bin 0 -> 19501 bytes ...ing-2-4bb5c6b2c2f3dcc0eb5029fb2ab09519.png | Bin 0 -> 26928 bytes ...ing-3-9ac2af92e26692ae7be26b9c2a06ed71.png | Bin 0 -> 10490 bytes assets/js/388041ab.64babc7e.js | 1 + assets/js/388041ab.66c86ae4.js | 1 - assets/js/3d2f5b0c.1f148699.js | 1 + assets/js/3d2f5b0c.dbd56e0e.js | 1 - assets/js/7794a932.101ed56d.js | 1 - assets/js/7794a932.1399478f.js | 1 + assets/js/87499f15.3255091a.js | 1 - assets/js/87499f15.91f9bc09.js | 1 + assets/js/935f2afb.50cc2b72.js | 1 + assets/js/935f2afb.5bca681b.js | 1 - assets/js/9a3629a6.23affd87.js | 1 - assets/js/9a3629a6.8ffb3acb.js | 1 + assets/js/9ed3ab78.bfc8ff35.js | 1 + assets/js/main.0f82894c.js | 2 ++ ...CENSE.txt => main.0f82894c.js.LICENSE.txt} | 0 assets/js/main.577cbb9f.js | 2 -- assets/js/runtime~main.e0fb90a2.js | 1 - assets/js/runtime~main.f2ec353d.js | 1 + basic/advanced-traits.html | 12 +++++------ basic/array.html | 12 +++++------ basic/associated-function.html | 12 +++++------ basic/attributes.html | 12 +++++------ basic/basic-memory-management.html | 12 +++++------ basic/block-expression.html | 12 +++++------ basic/borrowing.html | 12 +++++------ basic/build-dan-run-program-rust.html | 12 +++++------ basic/closures.html | 12 +++++------ basic/datetime.html | 12 +++++------ basic/enum.html | 12 +++++------ basic/file-path-directory.html | 12 +++++------ basic/function.html | 12 +++++------ basic/generics.html | 12 +++++------ basic/hello-rust.html | 12 +++++------ basic/komentar.html | 12 +++++------ basic/konstanta.html | 12 +++++------ basic/lifetime.html | 12 +++++------ basic/method.html | 12 +++++------ basic/module-basic.html | 12 +++++------ basic/module-inline.html | 12 +++++------ basic/module-scope-item-access.html | 12 +++++------ basic/operator-tanda-tanya.html | 12 +++++------ basic/operator.html | 12 +++++------ basic/option-type.html | 12 +++++------ basic/ownership.html | 12 +++++------ basic/package-crate.html | 12 +++++------ basic/path-item.html | 12 +++++------ basic/pattern-matching.html | 12 +++++------ basic/perulangan-for-in.html | 12 +++++------ .../perulangan-loop-break-continue-label.html | 12 +++++------ basic/perulangan-while.html | 12 +++++------ basic/pointer-references.html | 12 +++++------ basic/recoverable-error-handling.html | 20 ++++++++++++++++++ basic/result-type.html | 12 +++++------ basic/seleksi-kondisi-if.html | 12 +++++------ basic/shadowing.html | 12 +++++------ basic/slice-memory-management.html | 12 +++++------ basic/slice.html | 12 +++++------ basic/static.html | 12 +++++------ basic/string-slice-vs-string-literal.html | 12 +++++------ basic/struct.html | 12 +++++------ basic/tipe-data-custom-type-string-slice.html | 12 +++++------ basic/tipe-data-primitive-scalar.html | 12 +++++------ basic/tipe-data-string-literal.html | 12 +++++------ basic/trait-function.html | 12 +++++------ basic/trait-iterator.html | 12 +++++------ basic/traits.html | 12 +++++------ basic/tuple.html | 12 +++++------ basic/type-alias-casting.html | 12 +++++------ basic/unrecoverable-panic-error.html | 12 +++++------ basic/use.html | 12 +++++------ basic/variabel.html | 12 +++++------ basic/vector.html | 12 +++++------ basic/visibility-privacy.html | 12 +++++------ download-pdf.html | 12 +++++------ index.html | 12 +++++------ installation/instalasi-rust.html | 12 +++++------ installation/rust-editor-plugin.html | 12 +++++------ intro.html | 10 ++++----- pengelanan-rust-programming.html | 12 +++++------ search.html | 8 +++---- sitemap.xml | 2 +- 87 files changed, 410 insertions(+), 389 deletions(-) create mode 100644 assets/images/recoverable-error-handling-1-a60b09beaa6803045688abcf2a1f4762.png create mode 100644 assets/images/recoverable-error-handling-2-4bb5c6b2c2f3dcc0eb5029fb2ab09519.png create mode 100644 assets/images/recoverable-error-handling-3-9ac2af92e26692ae7be26b9c2a06ed71.png create mode 100644 assets/js/388041ab.64babc7e.js delete mode 100644 assets/js/388041ab.66c86ae4.js create mode 100644 assets/js/3d2f5b0c.1f148699.js delete mode 100644 assets/js/3d2f5b0c.dbd56e0e.js delete mode 100644 assets/js/7794a932.101ed56d.js create mode 100644 assets/js/7794a932.1399478f.js delete mode 100644 assets/js/87499f15.3255091a.js create mode 100644 assets/js/87499f15.91f9bc09.js create mode 100644 assets/js/935f2afb.50cc2b72.js delete mode 100644 assets/js/935f2afb.5bca681b.js delete mode 100644 assets/js/9a3629a6.23affd87.js create mode 100644 assets/js/9a3629a6.8ffb3acb.js create mode 100644 assets/js/9ed3ab78.bfc8ff35.js create mode 100644 assets/js/main.0f82894c.js rename assets/js/{main.577cbb9f.js.LICENSE.txt => main.0f82894c.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.577cbb9f.js delete mode 100644 assets/js/runtime~main.e0fb90a2.js create mode 100644 assets/js/runtime~main.f2ec353d.js create mode 100644 basic/recoverable-error-handling.html diff --git a/404.html b/404.html index 59d61cdc..b4e0482f 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 9e76a407..394eb35b 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. ardiantovn
  4. Fal
  5. Fredianto
  6. I Putu Saputrayana
  7. Indra Sah Noeldy
  8. Khisby Al Ghofari
  9. Lori
  10. M. Zakiyuddin Munziri
  11. Opa Kholis Majid
  12. Rian
  13. Shandy Siswandi
  14. Theis Andatu
  15. ... 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. Indra Sah Noeldy
  8. Khisby Al Ghofari
  9. Lori
  10. M. Zakiyuddin Munziri
  11. Opa Kholis Majid
  12. Rian
  13. Shandy Siswandi
  14. Theis Andatu
  15. ... 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 52d6f960..72faa777 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

- - +
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/images/recoverable-error-handling-1-a60b09beaa6803045688abcf2a1f4762.png b/assets/images/recoverable-error-handling-1-a60b09beaa6803045688abcf2a1f4762.png new file mode 100644 index 0000000000000000000000000000000000000000..4f8d2efd6e91d70fdbb2c75b0741d0bd712cddf0 GIT binary patch literal 19501 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 KT-G@yGywpCKdo{A literal 0 HcmV?d00001 diff --git a/assets/images/recoverable-error-handling-2-4bb5c6b2c2f3dcc0eb5029fb2ab09519.png b/assets/images/recoverable-error-handling-2-4bb5c6b2c2f3dcc0eb5029fb2ab09519.png new file mode 100644 index 0000000000000000000000000000000000000000..72912f8b3e5c439cdd9cf8b6592413b24bfb3f8b GIT binary patch literal 26928 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 Q`kO|UW;Ui-+dWSG9r_&(umAu6 literal 0 HcmV?d00001 diff --git a/assets/images/recoverable-error-handling-3-9ac2af92e26692ae7be26b9c2a06ed71.png b/assets/images/recoverable-error-handling-3-9ac2af92e26692ae7be26b9c2a06ed71.png new file mode 100644 index 0000000000000000000000000000000000000000..e851b4a2a23497a0a66a494d9d857eed603fb472 GIT binary patch literal 10490 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 LUDe!6R(Jjn<`VPY literal 0 HcmV?d00001 diff --git a/assets/js/388041ab.64babc7e.js b/assets/js/388041ab.64babc7e.js new file mode 100644 index 00000000..21bea0ae --- /dev/null +++ b/assets/js/388041ab.64babc7e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[1494],{3905:(a,e,r)=>{r.d(e,{Zo:()=>s,kt:()=>d});var n=r(7294);function t(a,e,r){return e in a?Object.defineProperty(a,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[e]=r,a}function i(a,e){var r=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),r.push.apply(r,n)}return r}function l(a){for(var e=1;e=0||(t[r]=a[r]);return t}(a,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,r)&&(t[r]=a[r])}return t}var p=n.createContext({}),u=function(a){var e=n.useContext(p),r=e;return a&&(r="function"==typeof a?a(e):l(l({},e),a)),r},s=function(a){var e=u(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)}},m=n.forwardRef((function(a,e){var r=a.components,t=a.mdxType,i=a.originalType,p=a.parentName,s=o(a,["components","mdxType","originalType","parentName"]),m=u(r),d=t,c=m["".concat(p,".").concat(d)]||m[d]||k[d]||i;return r?n.createElement(c,l(l({ref:e},s),{},{components:r})):n.createElement(c,l({ref:e},s))}));function d(a,e){var r=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var i=r.length,l=new Array(i);l[0]=m;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=a,o.mdxType="string"==typeof a?a:t,l[1]=o;for(var u=2;u{r.r(e),r.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>k,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=r(7462),t=(r(7294),r(3905));const i={sidebar_position:54,title:"A.54. Error \u279c Unrecoverable Error / Panic",sidebar_label:"A.54. Error \u279c Unrecoverable Error / Panic"},l=void 0,o={unversionedId:"basic/unrecoverable-panic-error",id:"basic/unrecoverable-panic-error",title:"A.54. Error \u279c Unrecoverable Error / Panic",description:"Error handling atau penanganan error adalah salah satu aspek penting dalam pemrograman selalu umum. Rust mengenal 2 jenis error yaitu unrecoverable error (panic error) dan recoverable error. Pembahasan chapter ini fokus pada unrecoverable error atau panic error.",source:"@site/docs/basic/unrecoverable-panic-error.md",sourceDirName:"basic",slug:"/basic/unrecoverable-panic-error",permalink:"/basic/unrecoverable-panic-error",draft:!1,tags:[],version:"current",sidebarPosition:54,frontMatter:{sidebar_position:54,title:"A.54. Error \u279c Unrecoverable Error / Panic",sidebar_label:"A.54. Error \u279c Unrecoverable Error / Panic"},sidebar:"tutorialSidebar",previous:{title:"A.53. File, Path, Directory",permalink:"/basic/file-path-directory"},next:{title:"A.55. Error \u279c Recoverable Error & Error Handling",permalink:"/basic/recoverable-error-handling"}},p={},u=[{value:"A.54.1. Unrecoverable error (RUNTIME error & COMPILE-TIME error)",id:"a541-unrecoverable-error-runtime-error--compile-time-error",level:2},{value:"\u25c9 Perbedaan panic saat pengaksesan vector dan error saat pengaksesan array",id:"-perbedaan-panic-saat-pengaksesan-vector-dan-error-saat-pengaksesan-array",level:3},{value:"A.54.2. Macro panic!()",id:"a542-macro-panic",level:2},{value:"\u25c9 Statement io::stdout().flush()",id:"-statement-iostdoutflush",level:3},{value:"A.54.3. Kapan harus menggunakan panic error?",id:"a543-kapan-harus-menggunakan-panic-error",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:u};function k(a){let{components:e,...i}=a;return(0,t.kt)("wrapper",(0,n.Z)({},s,i,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Error handling atau penanganan error adalah salah satu aspek penting dalam pemrograman selalu umum. Rust mengenal 2 jenis error yaitu ",(0,t.kt)("strong",{parentName:"p"},"unrecoverable error (panic error)")," dan ",(0,t.kt)("strong",{parentName:"p"},"recoverable error"),". Pembahasan chapter ini fokus pada unrecoverable error atau panic error."),(0,t.kt)("h2",{id:"a541-unrecoverable-error-runtime-error--compile-time-error"},"A.54.1. Unrecoverable error (RUNTIME error & COMPILE-TIME error)"),(0,t.kt)("p",null,(0,t.kt)("em",{parentName:"p"},"Unrecoverable error")," adalah error yang tidak bisa ditangani, entah itu karena memang disengaja atau karena ada bug fatal yang menyebabkan program mendapati error jenis ini sehingga program ",(0,t.kt)("em",{parentName:"p"},"crash")," dan berhenti secara paksa."),(0,t.kt)("p",null,"Salah satu operasi yang menyebabkan panic adalah pengaksesan elemen vector menggunakan index di luar kapasitas vector. Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let data = vec![10, 11, 23];\n\n println!("data index 1: {}", data[1]);\n println!("data index 6: {}", data[6]);\n println!("data index 2: {}", data[2]);\n}\n')),(0,t.kt)("p",null,"Pengaksesan index ke-6 vector ",(0,t.kt)("inlineCode",{parentName:"p"},"data")," menghasilkan panic karena vector tersebut hanya berisi 3 elemen."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Error Handling, Panic, Operator ?",src:r(5767).Z,width:"727",height:"182"})),(0,t.kt)("p",null,"Apa yang bisa dilakukan ketika panic muncul?"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Jika panic muncul ketika program sudah di production, program akan crash karena bug pengaksesan error di atas."),(0,t.kt)("li",{parentName:"ul"},"Jika panic muncul saat pengembangan, maka bisa diperbaiki kodenya, bisa dengan menambahkan pengecekan kapasitas index vector atau lainnya.")),(0,t.kt)("h3",{id:"-perbedaan-panic-saat-pengaksesan-vector-dan-error-saat-pengaksesan-array"},"\u25c9 Perbedaan panic saat pengaksesan vector dan error saat pengaksesan array"),(0,t.kt)("p",null,"Coba ubah kode di atas, tipe data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data")," ubah dari vector ke array. Lalu jalankan ulang program."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let data = [10, 11, 23];\n\n println!("data index 1: {}", data[1]);\n println!("data index 6: {}", data[6]);\n println!("data index 2: {}", data[2]);\n}\n')),(0,t.kt)("p",null,"Error masih muncul, tapi pesan error-nya berbeda."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Error Handling, Panic, Operator ?",src:r(5594).Z,width:"764",height:"215"})),(0,t.kt)("p",null,"2 program yang dijalankan keduanya error tapi error-nya sangat berbeda."),(0,t.kt)("table",null,(0,t.kt)("tr",null,(0,t.kt)("td",null,"Pengaksesan elemen vector di luar kapastias memunculkan error saat ",(0,t.kt)("b",null,"RUNTIME"),". Penjelasannya:")),(0,t.kt)("tr",null,(0,t.kt)("td",null,(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("strong",{parentName:"li"},"RUNTIME error")," menandakan kode program sudah berhasil dikompilasi dan program juga berhasil di eksekusi.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Silakan lihat gambar pertama, ada keterangan ",(0,t.kt)("em",{parentName:"li"},"Finished")," dan ",(0,t.kt)("em",{parentName:"li"},"Running"),"."),(0,t.kt)("li",{parentName:"ul"},"Error ini masuk kategori ",(0,t.kt)("strong",{parentName:"li"},"panic-level error")," atau ",(0,t.kt)("strong",{parentName:"li"},"panic"),"."))),(0,t.kt)("li",{parentName:"ul"},"Error muncul ketika baris kode ",(0,t.kt)("inlineCode",{parentName:"li"},'println!("data index 6: {}", data[6]);')," dieksekusi."),(0,t.kt)("li",{parentName:"ul"},"Kode sebelum baris tersebut masih sempat dieksekusi.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Silakan lihat gambar pertama, output ",(0,t.kt)("inlineCode",{parentName:"li"},"data index 1: 11")," sempat muncul sebelum error."))),(0,t.kt)("li",{parentName:"ul"},"Tipe data vector tidak tidak mampu mengetahui kapasitas datanya saat kompilasi, inilah kenapa error bisa lolos kompilasi."))))),(0,t.kt)("table",null,(0,t.kt)("tr",null,(0,t.kt)("td",null,"Sedangkan pengaksesan elemen array di luar kapastias memunculkan error saat ",(0,t.kt)("b",null,"COMPILE TIME"),". Penjelasannya:")),(0,t.kt)("tr",null,(0,t.kt)("td",null,(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("strong",{parentName:"li"},"COMPILE TIME error")," menandakan kode program gagal dikompilasi dan tidak sampai dieksekusi.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Silakan lihat gambar ke-dua, ada keterangan ",(0,t.kt)("em",{parentName:"li"},"Compiling")," diikuti dengan error, dan keterangan ",(0,t.kt)("inlineCode",{parentName:"li"},"could not compile"),"."),(0,t.kt)("li",{parentName:"ul"},"Error ini masuk kategori ",(0,t.kt)("strong",{parentName:"li"},"compile-time-level error")," atau cukup ",(0,t.kt)("strong",{parentName:"li"},"error"),"."))),(0,t.kt)("li",{parentName:"ul"},"Error muncul saat compiler memproses baris kode ",(0,t.kt)("inlineCode",{parentName:"li"},'println!("data index 6: {}", data[6]);'),"."),(0,t.kt)("li",{parentName:"ul"},"Tipe data array kapasitasnya sudah bisa diketahui oleh compiler saat kompilasi, menyebabkan proses kompilasi gagal."))))),(0,t.kt)("h2",{id:"a542-macro-panic"},"A.54.2. Macro ",(0,t.kt)("inlineCode",{parentName:"h2"},"panic!()")),(0,t.kt)("p",null,"Telah kita pelajari bahwa panic muncul karena ",(0,t.kt)("em",{parentName:"p"},"flaw")," atau cacat program, disebabkan oleh bug di kode program. Selain itu, panic bisa dimunculkan dengan sengaja menggunakan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"panic!()"),"."),(0,t.kt)("p",null,"Cara penggunaannya cukup dengan memanggil macro tersebut diikuti dengan argument berisi string keterangan panic errornya."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Bisa dibilang macro ",(0,t.kt)("inlineCode",{parentName:"p"},"panic!()")," adalah media untuk membuat ",(0,t.kt)("em",{parentName:"p"},"recoverable error")," menjadi ",(0,t.kt)("em",{parentName:"p"},"unrecoverable error"),".")),(0,t.kt)("p",null,"Pada contoh berikut, program sederhana dibuat untuk menangkap inputan nama user untuk kemudian di-print. Jika user tidak menginputkan apapun, maka panic sengaja dimunculkan via pemanggilan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"panic!()"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'use std::io;\nuse std::io::Write;\n\nfn main() {\n print!("enter your name: ");\n let _ = io::stdout().flush();\n\n let name = read_entry();\n if name.is_empty() {\n panic!("unable to continue the program");\n }\n\n println!("hi {}", name);\n}\n\npub fn read_entry() -> String {\n let mut message = String::new();\n let reader_res = io::stdin().read_line(&mut message);\n\n if reader_res.is_err() {\n return message;\n }\n\n message.trim().to_string()\n}\n')),(0,t.kt)("p",null,"Output program:"),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Error Handling, Panic, Operator ?",src:r(4274).Z,width:"719",height:"284"})),(0,t.kt)("p",null,"Program dieksekusi 2 kali:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Eksekusi pertama, inputan ",(0,t.kt)("inlineCode",{parentName:"li"},"noval agung")," digunakan. Hasilnya program berjalan sesuai desain."),(0,t.kt)("li",{parentName:"ol"},"Pada eksekusi ke-2, tidak ada inputan yang ditulis, dan langsung tekan tombol enter, hasilnya panic sengaja dimunculkan via macro ",(0,t.kt)("inlineCode",{parentName:"li"},"panic!()")," dengan pesan ",(0,t.kt)("inlineCode",{parentName:"li"},"unable to continue the program"),".")),(0,t.kt)("h3",{id:"-statement-iostdoutflush"},"\u25c9 Statement ",(0,t.kt)("inlineCode",{parentName:"h3"},"io::stdout().flush()")),(0,t.kt)("p",null,"Dibanding dengan beberapa chapter sebelumnya yang juga ada praktek menangkap inputan user, kode program yang ditulis kali ini disisipi statement baru yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"io::stdout().flush()"),". Kode tersebut berguna untuk mem-",(0,t.kt)("em",{parentName:"p"},"flush")," output STDOUT yang muncul, karena default output STDOUT adalah di-",(0,t.kt)("em",{parentName:"p"},"buffer")," oleh Rust."),(0,t.kt)("p",null,"Jika tidak di-flush, ada kemungkinan text ",(0,t.kt)("inlineCode",{parentName:"p"},"enter your name: ")," muncul setelah user mengisi inputan lalu menekan tombol ",(0,t.kt)("em",{parentName:"p"},"enter"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Untuk menggunakan stdout flush, path ",(0,t.kt)("inlineCode",{parentName:"p"},"std::io::Write")," harus di-import terlebih dahulu.")),(0,t.kt)("h2",{id:"a543-kapan-harus-menggunakan-panic-error"},"A.54.3. Kapan harus menggunakan panic error?"),(0,t.kt)("p",null,"Tidak semua jenis recoverable error harus berakhir dengan panic, ini penting untuk selalu diingat. Adakalanya error perlu di-recover secara gentle, ada kalanya error harus diumumkan via panic agar program terhenti. Contohnya:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Error ketika ada inputan yang tidak valid, maka cukup direspon dengan pesan error saja."),(0,t.kt)("li",{parentName:"ul"},"Error karena ada operasi pembagian terhadap angka ",(0,t.kt)("inlineCode",{parentName:"li"},"0"),", maka tidak perlu menggunakan panic."),(0,t.kt)("li",{parentName:"ul"},"Error karena file konfigurasi yang tidak ditemukan saat eksekusi program, ideal menggunakan panic.")),(0,t.kt)("p",null,"Tergantung tingkat ",(0,t.kt)("em",{parentName:"p"},"severity")," atau keseriusan error, silakan tentukan prosedur penanganannya seperti apa sesuai kebutuhan, juga jangan lupa pertimbangkan implikasinya."),(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/unrecoverable_panic_error"},"github.com/novalagung/dasarpemrogramanrust-example/../unrecoverable_panic_error")),(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/recoverable-error-handling"},"Error \u279c Recoverable Error & Error Handling"))),(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/ch09-01-unrecoverable-errors-with-panic.html"},"https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html"},"https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html"))))}k.isMDXComponent=!0},5767:(a,e,r)=>{r.d(e,{Z:()=>n});const n=r.p+"assets/images/unrecoverable-panic-error-1-2a22152a19c4dfb91d4f55885880fc08.png"},5594:(a,e,r)=>{r.d(e,{Z:()=>n});const n=r.p+"assets/images/unrecoverable-panic-error-2-1ffea2a5a914b4b95bb2db06c1ac9b53.png"},4274:(a,e,r)=>{r.d(e,{Z:()=>n});const n=r.p+"assets/images/unrecoverable-panic-error-3-4d90d454da4c451e1d9b6c9499ba72c6.png"}}]); \ No newline at end of file diff --git a/assets/js/388041ab.66c86ae4.js b/assets/js/388041ab.66c86ae4.js deleted file mode 100644 index 41912f06..00000000 --- a/assets/js/388041ab.66c86ae4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[1494],{3905:(a,e,r)=>{r.d(e,{Zo:()=>s,kt:()=>d});var n=r(7294);function t(a,e,r){return e in a?Object.defineProperty(a,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):a[e]=r,a}function i(a,e){var r=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),r.push.apply(r,n)}return r}function l(a){for(var e=1;e=0||(t[r]=a[r]);return t}(a,e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(a);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(a,r)&&(t[r]=a[r])}return t}var p=n.createContext({}),u=function(a){var e=n.useContext(p),r=e;return a&&(r="function"==typeof a?a(e):l(l({},e),a)),r},s=function(a){var e=u(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 r=a.components,t=a.mdxType,i=a.originalType,p=a.parentName,s=o(a,["components","mdxType","originalType","parentName"]),k=u(r),d=t,c=k["".concat(p,".").concat(d)]||k[d]||m[d]||i;return r?n.createElement(c,l(l({ref:e},s),{},{components:r})):n.createElement(c,l({ref:e},s))}));function d(a,e){var r=arguments,t=e&&e.mdxType;if("string"==typeof a||t){var i=r.length,l=new Array(i);l[0]=k;var o={};for(var p in e)hasOwnProperty.call(e,p)&&(o[p]=e[p]);o.originalType=a,o.mdxType="string"==typeof a?a:t,l[1]=o;for(var u=2;u{r.r(e),r.d(e,{assets:()=>p,contentTitle:()=>l,default:()=>m,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var n=r(7462),t=(r(7294),r(3905));const i={sidebar_position:54,title:"A.54. Error \u279c Unrecoverable Error / Panic",sidebar_label:"A.54. Error \u279c Unrecoverable Error / Panic"},l=void 0,o={unversionedId:"basic/unrecoverable-panic-error",id:"basic/unrecoverable-panic-error",title:"A.54. Error \u279c Unrecoverable Error / Panic",description:"Error handling atau penanganan error adalah salah satu aspek penting dalam pemrograman selalu umum. Rust mengenal 2 jenis error yaitu unrecoverable error (panic error) dan recoverable error. Pembahasan chapter ini fokus pada unrecoverable error atau panic error.",source:"@site/docs/basic/unrecoverable-panic-error.md",sourceDirName:"basic",slug:"/basic/unrecoverable-panic-error",permalink:"/basic/unrecoverable-panic-error",draft:!1,tags:[],version:"current",sidebarPosition:54,frontMatter:{sidebar_position:54,title:"A.54. Error \u279c Unrecoverable Error / Panic",sidebar_label:"A.54. Error \u279c Unrecoverable Error / Panic"},sidebar:"tutorialSidebar",previous:{title:"A.53. File, Path, Directory",permalink:"/basic/file-path-directory"}},p={},u=[{value:"A.54.1. Unrecoverable error (RUNTIME error & COMPILE-TIME error)",id:"a541-unrecoverable-error-runtime-error--compile-time-error",level:2},{value:"\u25c9 Perbedaan panic saat pengaksesan vector dan error saat pengaksesan array",id:"-perbedaan-panic-saat-pengaksesan-vector-dan-error-saat-pengaksesan-array",level:3},{value:"A.54.2. Macro panic!()",id:"a542-macro-panic",level:2},{value:"\u25c9 Statement io::stdout().flush()",id:"-statement-iostdoutflush",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}],s={toc:u};function m(a){let{components:e,...i}=a;return(0,t.kt)("wrapper",(0,n.Z)({},s,i,{components:e,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Error handling atau penanganan error adalah salah satu aspek penting dalam pemrograman selalu umum. Rust mengenal 2 jenis error yaitu ",(0,t.kt)("strong",{parentName:"p"},"unrecoverable error (panic error)")," dan ",(0,t.kt)("strong",{parentName:"p"},"recoverable error"),". Pembahasan chapter ini fokus pada unrecoverable error atau panic error."),(0,t.kt)("h2",{id:"a541-unrecoverable-error-runtime-error--compile-time-error"},"A.54.1. Unrecoverable error (RUNTIME error & COMPILE-TIME error)"),(0,t.kt)("p",null,(0,t.kt)("em",{parentName:"p"},"Unrecoverable error")," adalah error yang tidak bisa ditangani, entah itu karena memang disengaja atau karena ada bug fatal yang menyebabkan program mendapati error jenis ini sehingga program ",(0,t.kt)("em",{parentName:"p"},"crash")," dan berhenti secara paksa."),(0,t.kt)("p",null,"Salah satu operasi yang menyebabkan panic adalah pengaksesan elemen vector menggunakan index di luar kapasitas vector. Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let data = vec![10, 11, 23];\n\n println!("data index 1: {}", data[1]);\n println!("data index 6: {}", data[6]);\n println!("data index 2: {}", data[2]);\n}\n')),(0,t.kt)("p",null,"Pengaksesan index ke-6 vector ",(0,t.kt)("inlineCode",{parentName:"p"},"data")," menghasilkan panic karena vector tersebut hanya berisi 3 elemen."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Error Handling, Panic, Operator ?",src:r(5767).Z,width:"727",height:"182"})),(0,t.kt)("p",null,"Apa yang bisa dilakukan ketika panic muncul?"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Jika panic muncul ketika program sudah di production, program akan crash karena bug pengaksesan error di atas."),(0,t.kt)("li",{parentName:"ul"},"Jika panic muncul saat pengembangan, maka bisa diperbaiki kodenya, bisa dengan menambahkan pengecekan kapasitas index vector atau lainnya.")),(0,t.kt)("h3",{id:"-perbedaan-panic-saat-pengaksesan-vector-dan-error-saat-pengaksesan-array"},"\u25c9 Perbedaan panic saat pengaksesan vector dan error saat pengaksesan array"),(0,t.kt)("p",null,"Coba ubah kode di atas, tipe data variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"data")," ubah dari vector ke array. Lalu jalankan ulang program."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n let data = [10, 11, 23];\n\n println!("data index 1: {}", data[1]);\n println!("data index 6: {}", data[6]);\n println!("data index 2: {}", data[2]);\n}\n')),(0,t.kt)("p",null,"Error masih muncul, tapi pesan error-nya berbeda."),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Error Handling, Panic, Operator ?",src:r(5594).Z,width:"764",height:"215"})),(0,t.kt)("p",null,"2 program yang dijalankan keduanya error tapi error-nya sangat berbeda."),(0,t.kt)("table",null,(0,t.kt)("tr",null,(0,t.kt)("td",null,"Pengaksesan elemen vector di luar kapastias memunculkan error saat ",(0,t.kt)("b",null,"RUNTIME"),". Penjelasannya:")),(0,t.kt)("tr",null,(0,t.kt)("td",null,(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("strong",{parentName:"li"},"RUNTIME error")," menandakan kode program sudah berhasil dikompilasi dan program juga berhasil di eksekusi.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Silakan lihat gambar pertama, ada keterangan ",(0,t.kt)("em",{parentName:"li"},"Finished")," dan ",(0,t.kt)("em",{parentName:"li"},"Running"),"."),(0,t.kt)("li",{parentName:"ul"},"Error ini masuk kategori ",(0,t.kt)("strong",{parentName:"li"},"panic-level error")," atau ",(0,t.kt)("strong",{parentName:"li"},"panic"),"."))),(0,t.kt)("li",{parentName:"ul"},"Error muncul ketika baris kode ",(0,t.kt)("inlineCode",{parentName:"li"},'println!("data index 6: {}", data[6]);')," dieksekusi."),(0,t.kt)("li",{parentName:"ul"},"Kode sebelum baris tersebut masih sempat dieksekusi.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Silakan lihat gambar pertama, output ",(0,t.kt)("inlineCode",{parentName:"li"},"data index 1: 11")," sempat muncul sebelum error."))),(0,t.kt)("li",{parentName:"ul"},"Tipe data vector tidak tidak mampu mengetahui kapasitas datanya saat kompilasi, inilah kenapa error bisa lolos kompilasi."))))),(0,t.kt)("table",null,(0,t.kt)("tr",null,(0,t.kt)("td",null,"Sedangkan pengaksesan elemen array di luar kapastias memunculkan error saat ",(0,t.kt)("b",null,"COMPILE TIME"),". Penjelasannya:")),(0,t.kt)("tr",null,(0,t.kt)("td",null,(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("strong",{parentName:"li"},"COMPILE TIME error")," menandakan kode program gagal dikompilasi dan tidak sampai dieksekusi.",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Silakan lihat gambar ke-dua, ada keterangan ",(0,t.kt)("em",{parentName:"li"},"Compiling")," diikuti dengan error, dan keterangan ",(0,t.kt)("inlineCode",{parentName:"li"},"could not compile"),"."),(0,t.kt)("li",{parentName:"ul"},"Error ini masuk kategori ",(0,t.kt)("strong",{parentName:"li"},"compile-time-level error")," atau cukup ",(0,t.kt)("strong",{parentName:"li"},"error"),"."))),(0,t.kt)("li",{parentName:"ul"},"Error muncul saat compiler memproses baris kode ",(0,t.kt)("inlineCode",{parentName:"li"},'println!("data index 6: {}", data[6]);'),"."),(0,t.kt)("li",{parentName:"ul"},"Tipe data array kapasitasnya sudah bisa diketahui oleh compiler saat kompilasi, menyebabkan proses kompilasi gagal."))))),(0,t.kt)("h2",{id:"a542-macro-panic"},"A.54.2. Macro ",(0,t.kt)("inlineCode",{parentName:"h2"},"panic!()")),(0,t.kt)("p",null,"Telah kita pelajari bahwa panic muncul karena ",(0,t.kt)("em",{parentName:"p"},"flaw")," atau cacat program, disebabkan oleh bug di kode program. Selain itu, panic bisa dimunculkan dengan sengaja menggunakan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"panic!()"),"."),(0,t.kt)("p",null,"Cara penggunaannya cukup dengan memanggil macro tersebut diikuti dengan argument berisi string keterangan panic errornya."),(0,t.kt)("p",null,"Pada contoh berikut, program sederhana dibuat untuk menangkap inputan nama user untuk kemudian di-print. Jika user tidak menginputkan apapun, maka panic sengaja dimunculkan via pemanggilan macro ",(0,t.kt)("inlineCode",{parentName:"p"},"panic!()"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},'use std::io;\nuse std::io::Write;\n\nfn main() {\n print!("enter your name: ");\n let _ = io::stdout().flush();\n\n let name = read_entry();\n if name.is_empty() {\n panic!("unable to continue the program");\n }\n\n println!("hi {}", name);\n}\n\npub fn read_entry() -> String {\n let mut message = String::new();\n let reader_res = io::stdin().read_line(&mut message);\n\n if reader_res.is_err() {\n return message;\n }\n\n message.trim().to_string()\n}\n')),(0,t.kt)("p",null,"Output program:"),(0,t.kt)("p",null,(0,t.kt)("img",{alt:"Error Handling, Panic, Operator ?",src:r(4274).Z,width:"719",height:"284"})),(0,t.kt)("p",null,"Program dieksekusi 2 kali:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Eksekusi pertama, inputan ",(0,t.kt)("inlineCode",{parentName:"li"},"noval agung")," digunakan. Hasilnya program berjalan sesuai desain."),(0,t.kt)("li",{parentName:"ol"},"Pada eksekusi ke-2, tidak ada inputan yang ditulis, dan langsung tekan tombol enter, hasilnya panic sengaja dimunculkan via macro ",(0,t.kt)("inlineCode",{parentName:"li"},"panic!()")," dengan pesan ",(0,t.kt)("inlineCode",{parentName:"li"},"unable to continue the program"),".")),(0,t.kt)("h3",{id:"-statement-iostdoutflush"},"\u25c9 Statement ",(0,t.kt)("inlineCode",{parentName:"h3"},"io::stdout().flush()")),(0,t.kt)("p",null,"Dibanding dengan beberapa chapter sebelumnya yang juga ada praktek menangkap inputan user, kode program yang ditulis kali ini disisipi statement baru yaitu ",(0,t.kt)("inlineCode",{parentName:"p"},"io::stdout().flush()"),". Kode tersebut berguna untuk mem-",(0,t.kt)("em",{parentName:"p"},"flush")," output STDOUT yang muncul, karena default output STDOUT adalah di-",(0,t.kt)("em",{parentName:"p"},"buffer")," oleh Rust."),(0,t.kt)("p",null,"Jika tidak di-flush, ada kemungkinan text ",(0,t.kt)("inlineCode",{parentName:"p"},"enter your name: ")," muncul setelah user mengisi inputan lalu menekan tombol ",(0,t.kt)("em",{parentName:"p"},"enter"),"."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Untuk menggunakan stdout flush, path ",(0,t.kt)("inlineCode",{parentName:"p"},"std::io::Write")," harus di-import terlebih dahulu.")),(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/unrecoverable_panic_error"},"github.com/novalagung/dasarpemrogramanrust-example/../unrecoverable_panic_error")),(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:"#"},"Error \u279c Recoverable Error & Error Handling"))),(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/ch09-01-unrecoverable-errors-with-panic.html"},"https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html"},"https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html"))))}m.isMDXComponent=!0},5767:(a,e,r)=>{r.d(e,{Z:()=>n});const n=r.p+"assets/images/unrecoverable-panic-error-1-2a22152a19c4dfb91d4f55885880fc08.png"},5594:(a,e,r)=>{r.d(e,{Z:()=>n});const n=r.p+"assets/images/unrecoverable-panic-error-2-1ffea2a5a914b4b95bb2db06c1ac9b53.png"},4274:(a,e,r)=>{r.d(e,{Z:()=>n});const n=r.p+"assets/images/unrecoverable-panic-error-3-4d90d454da4c451e1d9b6c9499ba72c6.png"}}]); \ No newline at end of file diff --git a/assets/js/3d2f5b0c.1f148699.js b/assets/js/3d2f5b0c.1f148699.js new file mode 100644 index 00000000..72d44f9e --- /dev/null +++ b/assets/js/3d2f5b0c.1f148699.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[676],{3905:(e,a,n)=>{n.d(a,{Zo:()=>u,kt:()=>m});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 o=t.createContext({}),d=function(e){var a=t.useContext(o),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},u=function(e){var a=d(e.components);return t.createElement(o.Provider,{value:a},e.children)},s={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,r=e.mdxType,i=e.originalType,o=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),k=d(n),m=r,g=k["".concat(o,".").concat(m)]||k[m]||s[m]||i;return n?t.createElement(g,l(l({ref:a},u),{},{components:n})):t.createElement(g,l({ref:a},u))}));function m(e,a){var n=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var i=n.length,l=new Array(i);l[0]=k;var p={};for(var o in a)hasOwnProperty.call(a,o)&&(p[o]=a[o]);p.originalType=e,p.mdxType="string"==typeof e?e:r,l[1]=p;for(var d=2;d{n.r(a),n.d(a,{assets:()=>o,contentTitle:()=>l,default:()=>s,frontMatter:()=>i,metadata:()=>p,toc:()=>d});var t=n(7462),r=(n(7294),n(3905));const i={sidebar_position:41,title:"A.41. Operator ?",sidebar_label:"A.41. Operator ?"},l=void 0,p={unversionedId:"basic/operator-tanda-tanya",id:"basic/operator-tanda-tanya",title:"A.41. Operator ?",description:"Operator ? (atau question mark operator) adalah operator yang cukup berguna untuk operasi unwrap nilai dari tipe Result atau Option. Pada chapter ini kita akan belajar tentang operator tersebut.",source:"@site/docs/basic/operator-tanda-tanya.md",sourceDirName:"basic",slug:"/basic/operator-tanda-tanya",permalink:"/basic/operator-tanda-tanya",draft:!1,tags:[],version:"current",sidebarPosition:41,frontMatter:{sidebar_position:41,title:"A.41. Operator ?",sidebar_label:"A.41. Operator ?"},sidebar:"tutorialSidebar",previous:{title:"A.40. Tipe Data \u279c Result",permalink:"/basic/result-type"},next:{title:"A.42. Pattern Matching",permalink:"/basic/pattern-matching"}},o={},d=[{value:"A.41.1. Operator ?",id:"a411-operator-",level:2},{value:"\u25c9 Refactor ke-1",id:"-refactor-ke-1",level:3},{value:"\u25c9 Refactor ke-2",id:"-refactor-ke-2",level:3},{value:"\u25c9 Refactor ke-3",id:"-refactor-ke-3",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}],u={toc:d};function s(e){let{components:a,...i}=e;return(0,r.kt)("wrapper",(0,t.Z)({},u,i,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," (atau ",(0,r.kt)("em",{parentName:"p"},"question mark operator"),") adalah operator yang cukup berguna untuk operasi ",(0,r.kt)("strong",{parentName:"p"},"unwrap")," nilai dari tipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),". Pada chapter ini kita akan belajar tentang operator tersebut."),(0,r.kt)("h2",{id:"a411-operator-"},"A.41.1. Operator ?"),(0,r.kt)("p",null,"Operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," digunakan untuk operasi ",(0,r.kt)("strong",{parentName:"p"},"unwrap")," value dari tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (dan ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),")."),(0,r.kt)("p",null,"Penggunaannya terhadap tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," cukup umum untuk keperluan penanganan error (atau ",(0,r.kt)("em",{parentName:"p"},"error propagation"),"). Ketika suatu object dengan tipe tersebut di-unwrap menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?"),", maka:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Jika nilai object adalah bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"T"),", maka yang dikembalikan adalah nilai ",(0,r.kt)("inlineCode",{parentName:"li"},"T")),(0,r.kt)("li",{parentName:"ul"},"Jika nilai object adalah bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"E"),", maka yang dikembalikan adalah nilai ",(0,r.kt)("inlineCode",{parentName:"li"},"E")," atau error.")),(0,r.kt)("p",null,"Agar lebih mudah memahami kegunaan dari operator ini, pembelajaran lebih baik dimulai dengan praktik kode yang didalamnya ada penerapan tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),"). Di contoh berikut, tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," kita pilih untuk praktek."),(0,r.kt)("p",null,"Silakan tulis kode berikut, pelajari, kemudian jalankan."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n do_some_math();\n}\n\nfn do_some_math() {\n let result1 = divider(10.0, 5.0);\n match result1 {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n }\n \n let result2 = divider(10.0, 0.0);\n match result2 {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n }\n \n let result3 = divider(10.0, 2.0);\n match result3 {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n }\n}\n\nfn divider(a: f64, b: f64) -> Result {\n if b == 0.0 {\n return Err("division by zero error");\n }\n\n let result = a / b;\n return Ok(result);\n}\n')),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, operasi aritmatika ditempatkan dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," dan tidak langsung dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main()"),". Ini disengaja karena berhubungan dengan contoh berikutnya. ")),(0,r.kt)("p",null,"Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"divider()")," dibuat dengan kegunaan sangat spesifik, yaitu melakukan operasi aritmatika pembagian. Fungsi tersebut menghasilkan error jika ditemukan nilai pembagi adalah angka ",(0,r.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,r.kt)("p",null,"Output program:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(8889).Z,width:"530",height:"149"})),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Hasil statement ",(0,r.kt)("inlineCode",{parentName:"li"},"divider(10.0, 5.0)")," memenuhi kriteria ",(0,r.kt)("inlineCode",{parentName:"li"},"Ok(r)"),", maka outputnya adalah ",(0,r.kt)("inlineCode",{parentName:"li"},"result: 2.00")),(0,r.kt)("li",{parentName:"ul"},"Hasil statement ",(0,r.kt)("inlineCode",{parentName:"li"},"divider(10.0, 0.0)")," memenuhi kriteria ",(0,r.kt)("inlineCode",{parentName:"li"},"Err(m)"),", maka outputnya adalah ",(0,r.kt)("inlineCode",{parentName:"li"},'ERROR! "division by zero error"')),(0,r.kt)("li",{parentName:"ul"},"Hasil statement ",(0,r.kt)("inlineCode",{parentName:"li"},"divider(10.0, 2.0)")," memenuhi kriteria ",(0,r.kt)("inlineCode",{parentName:"li"},"Ok(r)"),", maka outputnya adalah ",(0,r.kt)("inlineCode",{parentName:"li"},"result: 5.00"))),(0,r.kt)("p",null,"Sampai sini penulis rasa cukup jelas. Selanjutnya kode tersebut akan di-refactor, beberapa statement disederhanakan menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?"),"."),(0,r.kt)("h3",{id:"-refactor-ke-1"},"\u25c9 Refactor ke-1"),(0,r.kt)("p",null,"Ubah fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," menjadi seperti ini:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_some_math() {\n let r1 = divider(10.0, 5.0)?;\n println!("result: {r1:.2}");\n \n let r2 = divider(10.0, 0.0)?;\n println!("result: {r2:.2}");\n \n let r3 = divider(10.0, 2.0)?;\n println!("result: {r3:.2}");\n}\n')),(0,r.kt)("p",null,"Sekilas perbandingan fungsi sebelum dan setelah dimodifikasi bisa dilihat pada dua gambar berikut."),(0,r.kt)("table",null,(0,r.kt)("tr",null,(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(9692).Z,width:"1292",height:"1402"}))),(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(7725).Z,width:"1032",height:"916"}))))),(0,r.kt)("p",null,"Implementasi operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," dilakukan dengan cukup menuliskannya setelah memanggil fungsi yang memiliki tipe nilai balik ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),") yang pada contoh ini adalah fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"divider()"),". Operator tersebut meng-unwrap nilai balik fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"divider()")," yang bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," dengan ketentuan:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Jila nilai balik ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," berisi nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(f64)"),", maka nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"f64")," dikembalikan."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Statement ",(0,r.kt)("inlineCode",{parentName:"li"},"let r1 = divider(10.0, 5.0)?;"),", variabel ",(0,r.kt)("inlineCode",{parentName:"li"},"r1")," berisi nilai bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"f64"),"."),(0,r.kt)("li",{parentName:"ul"},"Statement ",(0,r.kt)("inlineCode",{parentName:"li"},"let r3 = divider(10.0, 2.0)?;"),", variabel ",(0,r.kt)("inlineCode",{parentName:"li"},"r3")," berisi nilai bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"f64"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Jila nilai balik ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," berisi nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"Err(&'static str)"),", maka nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"&'static str")," dikembalikan."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Statement ",(0,r.kt)("inlineCode",{parentName:"li"},"let r2 = divider(10.0, 0.0)?;"),", variabel ",(0,r.kt)("inlineCode",{parentName:"li"},"r2")," berisi nilai bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"&'static str"),".")))),(0,r.kt)("p",null,"Sampai sini semoga cukup jelas."),(0,r.kt)("p",null,"Namun tunggu, kode baru yang telah ditulis sebenarnya tidak valid. Kode penulis buat untuk mempermudah mempelajari perbedaan cara konvensional vs menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?"),". Ada beberapa hal lagi yang harus dilakukan sebelum kode benar-benar bisa digunakan."),(0,r.kt)("h3",{id:"-refactor-ke-2"},"\u25c9 Refactor ke-2"),(0,r.kt)("p",null,"Rust mewajibkan penggunaan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," pada statement untuk diterapkan di dalam fungsi yang mengembalikan nilai balik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),") tergantung tipe apa yang digunakan pada kode-kode di dalam blok fungsi tersebut. Bahkan meskipun nilai tidak digunakan, aturan tersebut tetap harus dipatuhi. Syarat ini hukumnya wajib."),(0,r.kt)("p",null,"Kembali ke contoh kode yang telah ditulis, kode tersebut harus dimodifikasi lagi menjadi seperti berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_some_math() -> Result {\n let r1 = divider(10.0, 5.0)?;\n println!("result: {r1:.2}");\n \n let r2 = divider(10.0, 0.0)?;\n println!("result: {r2:.2}");\n \n let r3 = divider(10.0, 2.0)?;\n println!("result: {r3:.2}");\n\n return Ok(0.0)\n}\n')),(0,r.kt)("p",null,"Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," dimodifikasi dengan ditambahi nilai balik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result"),". Karena sebenarnya kita tidak memerlukan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," untuk menghasilkan nilai balik, maka penulis hardcode saja nilai baliknya dengan nilai apapun yang penting valid, misalnya ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(0.0)"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Silakan gunakan nilai lainnya seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(r1)"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(r2)")," atau lainnya, bebas karena nilai ini ditulis di kode hanya agar syarat penerapan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," terpenuhi."),(0,r.kt)("p",{parentName:"blockquote"},"Boleh juga menggunakan notasi tipe lainnya seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"Result<(), &'static str>")," dimana dengan tipe tersebut untuk nilai balik bisa menggunakan ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(())"))),(0,r.kt)("p",null,"Perbandingan terbaru fungsi sebelum dan setelah dimodifikasi bisa dilihat di bawah ini."),(0,r.kt)("table",null,(0,r.kt)("tr",null,(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(9692).Z,width:"1292",height:"1402"}))),(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(456).Z,width:"1358",height:"1024"}))))),(0,r.kt)("p",null,"Sekarang coba jalankan program, dan lihat outputnya."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(7136).Z,width:"618",height:"97"})),(0,r.kt)("p",null,"Output yang muncul hanya nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"r2"),". Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"let r2 = divider(10.0, 0.0)?;")," dan seterusnya tidak menghasilkan output apapun, hal ini karena ketika proses unwrap nilai menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," menghasilkan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"E"),", fungsi langsung terhenti eksekusinya dan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"Err(E)")," dikembalikan. Menandai akhir pemanggilan ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," dengan informasi error pemanggilan statement ",(0,r.kt)("inlineCode",{parentName:"p"},"let r2 = divider(10.0, 0.0)?;")," langsung dikembalikan."),(0,r.kt)("h3",{id:"-refactor-ke-3"},"\u25c9 Refactor ke-3"),(0,r.kt)("p",null,"Sebenarnya aturan di atas (kenapa fungsi yang didalamnya ada penerapan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," diwajibkan untuk mengembalikan nilai balik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),")) bukan hanya sebatas syarat, tapi memang benar-benar diperlukan."),(0,r.kt)("p",null,"Ketika operasi menghasilkan error, eksekusi blok fungsi menjadi terhenti dan error otomatis dikembalikan sebagai nilai balik fungsi. Hal ini berguna agar kita bisa melakukan pengecekan tambahan untuk mengidentifikasi apakah eksekusi fungsi menghasilkan error atau sukses."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Inilah bagaimana penanganan error di Rust dilakukan."),(0,r.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai ",(0,r.kt)("em",{parentName:"p"},"error propagation")," atau ",(0,r.kt)("em",{parentName:"p"},"error propagation")," dibahas pada chapter ",(0,r.kt)("a",{parentName:"p",href:"/basic/recoverable-error-handling"},"Error \u279c Recoverable Error & Error Handling"),".")),(0,r.kt)("p",null,"Coba sekarang ubah lagi kode yang sudah ditulis, kita coba cek error apa yang muncul saat pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()"),". Ubah isi fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main()")," dengan menambahkan keyword ",(0,r.kt)("inlineCode",{parentName:"p"},"match")," untuk mengecek nilai balik eksekusi fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()"),". Kode setelah diubah:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n match do_some_math() {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(_) => {},\n }\n}\n\nfn do_some_math() -> Result {\n let r1 = divider(10.0, 5.0)?;\n println!("result: {r1:.2}");\n \n let r2 = divider(10.0, 0.0)?;\n println!("result: {r2:.2}");\n \n let r3 = divider(10.0, 2.0)?;\n println!("result: {r3:.2}");\n\n return Ok(0.0)\n}\n\nfn divider(a: f64, b: f64) -> Result {\n if b == 0.0 {\n return Err("division by zero error");\n }\n\n let result = a / b;\n return Ok(result);\n}\n')),(0,r.kt)("p",null,"Outputnya bisa dilihat di bawah ini. Pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," memang menghasilkan error, yaitu saat eksekusi statement ",(0,r.kt)("inlineCode",{parentName:"p"},"let r2 = divider(10.0, 0.0)?;"),". Informasi errornya bisa dilihat via blok ",(0,r.kt)("inlineCode",{parentName:"p"},'Err(m) => println!("ERROR! {:?}", m)'),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(2880).Z,width:"534",height:"118"})),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Pada kode di atas terdapat penerapan statement ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(_) => {},"),", pembahasan mengenai statement tersebut dibahas di chapter selanjutnya, yaitu ",(0,r.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(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/operator_tanda_tanya"},"github.com/novalagung/dasarpemrogramanrust-example/../operator_tanda_tanya")),(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/result-type"},"Tipe Data \u279c Result")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/basic/recoverable-error-handling"},"Error \u279c Recoverable Error & Error Handling"))),(0,r.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Contoh menggunakan tipe ",(0,r.kt)("inlineCode",{parentName:"li"},"Option"))),(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/std/result/index.html"},"https://doc.rust-lang.org/std/result/index.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator"},"https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html"},"https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html"))))}s.isMDXComponent=!0},8889:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-1-24d0c7ef806198ea77f652c1267d13e9.png"},9692:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-2-edc32921914c938294f2ee9ded7bcd17.png"},7725:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-3-186ecf58877055d7fdef25594040d662.png"},456:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-4-162dd4d9f23151b811c1f27d7754cc69.png"},7136:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,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"},2880:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-6-31dccee9d16f41b3a88637a21ca2e330.png"}}]); \ No newline at end of file diff --git a/assets/js/3d2f5b0c.dbd56e0e.js b/assets/js/3d2f5b0c.dbd56e0e.js deleted file mode 100644 index f9c0f1b2..00000000 --- a/assets/js/3d2f5b0c.dbd56e0e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[676],{3905:(e,a,n)=>{n.d(a,{Zo:()=>u,kt:()=>m});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 o=t.createContext({}),d=function(e){var a=t.useContext(o),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},u=function(e){var a=d(e.components);return t.createElement(o.Provider,{value:a},e.children)},s={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,r=e.mdxType,i=e.originalType,o=e.parentName,u=p(e,["components","mdxType","originalType","parentName"]),k=d(n),m=r,g=k["".concat(o,".").concat(m)]||k[m]||s[m]||i;return n?t.createElement(g,l(l({ref:a},u),{},{components:n})):t.createElement(g,l({ref:a},u))}));function m(e,a){var n=arguments,r=a&&a.mdxType;if("string"==typeof e||r){var i=n.length,l=new Array(i);l[0]=k;var p={};for(var o in a)hasOwnProperty.call(a,o)&&(p[o]=a[o]);p.originalType=e,p.mdxType="string"==typeof e?e:r,l[1]=p;for(var d=2;d{n.r(a),n.d(a,{assets:()=>o,contentTitle:()=>l,default:()=>s,frontMatter:()=>i,metadata:()=>p,toc:()=>d});var t=n(7462),r=(n(7294),n(3905));const i={sidebar_position:41,title:"A.41. Operator ?",sidebar_label:"A.41. Operator ?"},l=void 0,p={unversionedId:"basic/operator-tanda-tanya",id:"basic/operator-tanda-tanya",title:"A.41. Operator ?",description:"Operator ? (atau question mark operator) adalah operator yang cukup berguna untuk operasi unwrap nilai dari tipe Result atau Option. Pada chapter ini kita akan belajar tentang operator tersebut.",source:"@site/docs/basic/operator-tanda-tanya.md",sourceDirName:"basic",slug:"/basic/operator-tanda-tanya",permalink:"/basic/operator-tanda-tanya",draft:!1,tags:[],version:"current",sidebarPosition:41,frontMatter:{sidebar_position:41,title:"A.41. Operator ?",sidebar_label:"A.41. Operator ?"},sidebar:"tutorialSidebar",previous:{title:"A.40. Tipe Data \u279c Result",permalink:"/basic/result-type"},next:{title:"A.42. Pattern Matching",permalink:"/basic/pattern-matching"}},o={},d=[{value:"A.41.1. Operator ?",id:"a411-operator-",level:2},{value:"\u25c9 Refactor ke-1",id:"-refactor-ke-1",level:3},{value:"\u25c9 Refactor ke-2",id:"-refactor-ke-2",level:3},{value:"\u25c9 Refactor ke-3",id:"-refactor-ke-3",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}],u={toc:d};function s(e){let{components:a,...i}=e;return(0,r.kt)("wrapper",(0,t.Z)({},u,i,{components:a,mdxType:"MDXLayout"}),(0,r.kt)("p",null,"Operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," (atau ",(0,r.kt)("em",{parentName:"p"},"question mark operator"),") adalah operator yang cukup berguna untuk operasi ",(0,r.kt)("strong",{parentName:"p"},"unwrap")," nilai dari tipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),". Pada chapter ini kita akan belajar tentang operator tersebut."),(0,r.kt)("h2",{id:"a411-operator-"},"A.41.1. Operator ?"),(0,r.kt)("p",null,"Operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," digunakan untuk operasi ",(0,r.kt)("strong",{parentName:"p"},"unwrap")," value dari tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (dan ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),")."),(0,r.kt)("p",null,"Penggunaannya terhadap tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," cukup umum untuk keperluan penanganan error (atau ",(0,r.kt)("em",{parentName:"p"},"error propagation"),"). Ketika suatu object dengan tipe tersebut di-unwrap menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?"),", maka:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Jika nilai object adalah bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"T"),", maka yang dikembalikan adalah nilai ",(0,r.kt)("inlineCode",{parentName:"li"},"T")),(0,r.kt)("li",{parentName:"ul"},"Jika nilai object adalah bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"E"),", maka yang dikembalikan adalah nilai ",(0,r.kt)("inlineCode",{parentName:"li"},"E")," atau error.")),(0,r.kt)("p",null,"Agar lebih mudah memahami kegunaan dari operator ini, pembelajaran lebih baik dimulai dengan praktik kode yang didalamnya ada penerapan tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),"). Di contoh berikut, tipe data ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," kita pilih untuk praktek."),(0,r.kt)("p",null,"Silakan tulis kode berikut, pelajari, kemudian jalankan."),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n do_some_math();\n}\n\nfn do_some_math() {\n let result1 = divider(10.0, 5.0);\n match result1 {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n }\n \n let result2 = divider(10.0, 0.0);\n match result2 {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n }\n \n let result3 = divider(10.0, 2.0);\n match result3 {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(r) => println!("result: {r:.2}"),\n }\n}\n\nfn divider(a: f64, b: f64) -> Result {\n if b == 0.0 {\n return Err("division by zero error");\n }\n\n let result = a / b;\n return Ok(result);\n}\n')),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Pada contoh di atas, operasi aritmatika ditempatkan dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," dan tidak langsung dalam fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main()"),". Ini disengaja karena berhubungan dengan contoh berikutnya. ")),(0,r.kt)("p",null,"Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"divider()")," dibuat dengan kegunaan sangat spesifik, yaitu melakukan operasi aritmatika pembagian. Fungsi tersebut menghasilkan error jika ditemukan nilai pembagi adalah angka ",(0,r.kt)("inlineCode",{parentName:"p"},"0"),"."),(0,r.kt)("p",null,"Output program:"),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(8889).Z,width:"530",height:"149"})),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Hasil statement ",(0,r.kt)("inlineCode",{parentName:"li"},"divider(10.0, 5.0)")," memenuhi kriteria ",(0,r.kt)("inlineCode",{parentName:"li"},"Ok(r)"),", maka outputnya adalah ",(0,r.kt)("inlineCode",{parentName:"li"},"result: 2.00")),(0,r.kt)("li",{parentName:"ul"},"Hasil statement ",(0,r.kt)("inlineCode",{parentName:"li"},"divider(10.0, 0.0)")," memenuhi kriteria ",(0,r.kt)("inlineCode",{parentName:"li"},"Err(m)"),", maka outputnya adalah ",(0,r.kt)("inlineCode",{parentName:"li"},'ERROR! "division by zero error"')),(0,r.kt)("li",{parentName:"ul"},"Hasil statement ",(0,r.kt)("inlineCode",{parentName:"li"},"divider(10.0, 2.0)")," memenuhi kriteria ",(0,r.kt)("inlineCode",{parentName:"li"},"Ok(r)"),", maka outputnya adalah ",(0,r.kt)("inlineCode",{parentName:"li"},"result: 5.00"))),(0,r.kt)("p",null,"Sampai sini penulis rasa cukup jelas. Selanjutnya kode tersebut akan di-refactor, beberapa statement disederhanakan menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?"),"."),(0,r.kt)("h3",{id:"-refactor-ke-1"},"\u25c9 Refactor ke-1"),(0,r.kt)("p",null,"Ubah fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," menjadi seperti ini:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_some_math() {\n let r1 = divider(10.0, 5.0)?;\n println!("result: {r1:.2}");\n \n let r2 = divider(10.0, 0.0)?;\n println!("result: {r2:.2}");\n \n let r3 = divider(10.0, 2.0)?;\n println!("result: {r3:.2}");\n}\n')),(0,r.kt)("p",null,"Sekilas perbandingan fungsi sebelum dan setelah dimodifikasi bisa dilihat pada dua gambar berikut."),(0,r.kt)("table",null,(0,r.kt)("tr",null,(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(9692).Z,width:"1292",height:"1402"}))),(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(7725).Z,width:"1032",height:"916"}))))),(0,r.kt)("p",null,"Implementasi operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," dilakukan dengan cukup menuliskannya setelah memanggil fungsi yang memiliki tipe nilai balik ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),") yang pada contoh ini adalah fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"divider()"),". Operator tersebut meng-unwrap nilai balik fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"divider()")," yang bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," dengan ketentuan:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Jila nilai balik ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," berisi nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(f64)"),", maka nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"f64")," dikembalikan."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Statement ",(0,r.kt)("inlineCode",{parentName:"li"},"let r1 = divider(10.0, 5.0)?;"),", variabel ",(0,r.kt)("inlineCode",{parentName:"li"},"r1")," berisi nilai bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"f64"),"."),(0,r.kt)("li",{parentName:"ul"},"Statement ",(0,r.kt)("inlineCode",{parentName:"li"},"let r3 = divider(10.0, 2.0)?;"),", variabel ",(0,r.kt)("inlineCode",{parentName:"li"},"r3")," berisi nilai bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"f64"),"."))),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("p",{parentName:"li"},"Jila nilai balik ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," berisi nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"Err(&'static str)"),", maka nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"&'static str")," dikembalikan."),(0,r.kt)("ul",{parentName:"li"},(0,r.kt)("li",{parentName:"ul"},"Statement ",(0,r.kt)("inlineCode",{parentName:"li"},"let r2 = divider(10.0, 0.0)?;"),", variabel ",(0,r.kt)("inlineCode",{parentName:"li"},"r2")," berisi nilai bertipe ",(0,r.kt)("inlineCode",{parentName:"li"},"&'static str"),".")))),(0,r.kt)("p",null,"Sampai sini semoga cukup jelas."),(0,r.kt)("p",null,"Namun tunggu, kode baru yang telah ditulis sebenarnya tidak valid. Kode penulis buat untuk mempermudah mempelajari perbedaan cara konvensional vs menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?"),". Ada beberapa hal lagi yang harus dilakukan sebelum kode benar-benar bisa digunakan."),(0,r.kt)("h3",{id:"-refactor-ke-2"},"\u25c9 Refactor ke-2"),(0,r.kt)("p",null,"Rust mewajibkan penggunaan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," pada statement untuk diterapkan di dalam fungsi yang mengembalikan nilai balik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),") tergantung tipe apa yang digunakan pada kode-kode di dalam blok fungsi tersebut. Bahkan meskipun nilai tidak digunakan, aturan tersebut tetap harus dipatuhi. Syarat ini hukumnya wajib."),(0,r.kt)("p",null,"Kembali ke contoh kode yang telah ditulis, kode tersebut harus dimodifikasi lagi menjadi seperti berikut:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn do_some_math() -> Result {\n let r1 = divider(10.0, 5.0)?;\n println!("result: {r1:.2}");\n \n let r2 = divider(10.0, 0.0)?;\n println!("result: {r2:.2}");\n \n let r3 = divider(10.0, 2.0)?;\n println!("result: {r3:.2}");\n\n return Ok(0.0)\n}\n')),(0,r.kt)("p",null,"Fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," dimodifikasi dengan ditambahi nilai balik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result"),". Karena sebenarnya kita tidak memerlukan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," untuk menghasilkan nilai balik, maka penulis hardcode saja nilai baliknya dengan nilai apapun yang penting valid, misalnya ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(0.0)"),"."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Silakan gunakan nilai lainnya seperti ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(r1)"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(r2)")," atau lainnya, bebas karena nilai ini ditulis di kode hanya agar syarat penerapan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," terpenuhi.")),(0,r.kt)("p",null,"Perbandingan terbaru fungsi sebelum dan setelah dimodifikasi bisa dilihat di bawah ini."),(0,r.kt)("table",null,(0,r.kt)("tr",null,(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(9692).Z,width:"1292",height:"1402"}))),(0,r.kt)("td",null,(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(456).Z,width:"1358",height:"1024"}))))),(0,r.kt)("p",null,"Sekarang coba jalankan program, dan lihat outputnya."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(7136).Z,width:"618",height:"97"})),(0,r.kt)("p",null,"Output yang muncul hanya nilai variabel ",(0,r.kt)("inlineCode",{parentName:"p"},"r2"),". Statement ",(0,r.kt)("inlineCode",{parentName:"p"},"let r2 = divider(10.0, 0.0)?;")," dan seterusnya tidak menghasilkan output apapun, hal ini karena ketika proses unwrap nilai menggunakan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," menghasilkan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"E"),", fungsi langsung terhenti eksekusinya dan nilai ",(0,r.kt)("inlineCode",{parentName:"p"},"Err(E)")," dikembalikan. Menandai akhir pemanggilan ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," dengan informasi error pemanggilan statement ",(0,r.kt)("inlineCode",{parentName:"p"},"let r2 = divider(10.0, 0.0)?;")," langsung dikembalikan."),(0,r.kt)("h3",{id:"-refactor-ke-3"},"\u25c9 Refactor ke-3"),(0,r.kt)("p",null,"Sebenarnya aturan di atas (kenapa fungsi yang didalamnya ada penerapan operator ",(0,r.kt)("inlineCode",{parentName:"p"},"?")," diwajibkan untuk mengembalikan nilai balik bertipe ",(0,r.kt)("inlineCode",{parentName:"p"},"Result")," (atau ",(0,r.kt)("inlineCode",{parentName:"p"},"Option"),")) bukan hanya sebatas syarat, tapi memang benar-benar diperlukan."),(0,r.kt)("p",null,"Ketika operasi menghasilkan error, eksekusi blok fungsi menjadi terhenti dan error otomatis dikembalikan sebagai nilai balik fungsi. Hal ini berguna agar kita bisa melakukan pengecekan tambahan untuk mengidentifikasi apakah eksekusi fungsi menghasilkan error atau sukses."),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Inilah bagaimana penanganan error di Rust dilakukan."),(0,r.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai ",(0,r.kt)("em",{parentName:"p"},"error propagation")," atau ",(0,r.kt)("em",{parentName:"p"},"error propagation")," dibahas pada chapter ",(0,r.kt)("a",{parentName:"p",href:"#"},"Error \u279c Recoverable Error & Error Handling"),".")),(0,r.kt)("p",null,"Coba sekarang ubah lagi kode yang sudah ditulis, kita coba cek error apa yang muncul saat pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()"),". Ubah isi fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"main()")," dengan menambahkan keyword ",(0,r.kt)("inlineCode",{parentName:"p"},"match")," untuk mengecek nilai balik eksekusi fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()"),". Kode setelah diubah:"),(0,r.kt)("pre",null,(0,r.kt)("code",{parentName:"pre",className:"language-rust"},'fn main() {\n match do_some_math() {\n Err(m) => println!("ERROR! {:?}", m),\n Ok(_) => {},\n }\n}\n\nfn do_some_math() -> Result {\n let r1 = divider(10.0, 5.0)?;\n println!("result: {r1:.2}");\n \n let r2 = divider(10.0, 0.0)?;\n println!("result: {r2:.2}");\n \n let r3 = divider(10.0, 2.0)?;\n println!("result: {r3:.2}");\n\n return Ok(0.0)\n}\n\nfn divider(a: f64, b: f64) -> Result {\n if b == 0.0 {\n return Err("division by zero error");\n }\n\n let result = a / b;\n return Ok(result);\n}\n')),(0,r.kt)("p",null,"Outputnya bisa dilihat di bawah ini. Pemanggilan fungsi ",(0,r.kt)("inlineCode",{parentName:"p"},"do_some_math()")," memang menghasilkan error, yaitu saat eksekusi statement ",(0,r.kt)("inlineCode",{parentName:"p"},"let r2 = divider(10.0, 0.0)?;"),". Informasi errornya bisa dilihat via blok ",(0,r.kt)("inlineCode",{parentName:"p"},'Err(m) => println!("ERROR! {:?}", m)'),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"Operator ? / tanda tanya / question mark",src:n(2880).Z,width:"534",height:"118"})),(0,r.kt)("blockquote",null,(0,r.kt)("p",{parentName:"blockquote"},"Pada kode di atas terdapat penerapan statement ",(0,r.kt)("inlineCode",{parentName:"p"},"Ok(_) => {},"),", pembahasan mengenai statement tersebut dibahas di chapter selanjutnya, yaitu ",(0,r.kt)("a",{parentName:"p",href:"/basic/pattern-matching"},"Pattern Matching"))),(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/operator_tanda_tanya"},"github.com/novalagung/dasarpemrogramanrust-example/../operator_tanda_tanya")),(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/result-type"},"Tipe Data \u279c Result")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"#"},"Error \u279c Recoverable Error & Error Handling"))),(0,r.kt)("h3",{id:"-work-in-progress"},"\u25c9 Work in progress"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Contoh menggunakan tipe ",(0,r.kt)("inlineCode",{parentName:"li"},"Option"))),(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/std/result/index.html"},"https://doc.rust-lang.org/std/result/index.html")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator"},"https://doc.rust-lang.org/reference/expressions/operator-expr.html#the-question-mark-operator")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html"},"https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html"))))}s.isMDXComponent=!0},8889:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-1-24d0c7ef806198ea77f652c1267d13e9.png"},9692:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-2-edc32921914c938294f2ee9ded7bcd17.png"},7725:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-3-186ecf58877055d7fdef25594040d662.png"},456:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-4-162dd4d9f23151b811c1f27d7754cc69.png"},7136:(e,a,n)=>{n.d(a,{Z:()=>t});const t="data:image/png;base64,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"},2880:(e,a,n)=>{n.d(a,{Z:()=>t});const t=n.p+"assets/images/operator-tanda-tanya-6-31dccee9d16f41b3a88637a21ca2e330.png"}}]); \ No newline at end of file diff --git a/assets/js/7794a932.101ed56d.js b/assets/js/7794a932.101ed56d.js deleted file mode 100644 index befe953e..00000000 --- a/assets/js/7794a932.101ed56d.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:40,title:"A.40. Tipe Data \u279c Result",sidebar_label:"A.40. Tipe Data \u279c Result"},l=void 0,p={unversionedId:"basic/result-type",id:"basic/result-type",title:"A.40. Tipe Data \u279c Result",description:"Chapter ini membahas tentang tipe data Result, yaitu tipe data yang digunakan untuk menampung nilai yang isinya bisa berupa penanda operasi sukses (Ok) dan data, atau error (Err) beserta keterangan errornya.",source:"@site/docs/basic/result-type.md",sourceDirName:"basic",slug:"/basic/result-type",permalink:"/basic/result-type",draft:!1,tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_position:40,title:"A.40. Tipe Data \u279c Result",sidebar_label:"A.40. Tipe Data \u279c Result"},sidebar:"tutorialSidebar",previous:{title:"A.39. Tipe Data \u279c Option",permalink:"/basic/option-type"},next:{title:"A.41. Operator ?",permalink:"/basic/operator-tanda-tanya"}},d={},o=[{value:"A.40.1. Konsep Result",id:"a401-konsep-result",level:2},{value:"A.40.2. Pattern matching pada tipe Result",id:"a402-pattern-matching-pada-tipe-result",level:2},{value:"\u25c9 Tips pattern matching",id:"-tips-pattern-matching",level:3},{value:"A.40.3. Method tipe data Result",id:"a403-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.40.4. Operator ? pada tipe Result",id:"a404-operator--pada-tipe-result",level:2},{value:"A.40.5. Error handling",id:"a405-error-handling",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}],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"),", yaitu tipe data yang digunakan untuk menampung nilai yang isinya bisa berupa penanda operasi sukses (",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),") dan data, atau error (",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),") beserta keterangan errornya."),(0,i.kt)("p",null,"Rust menyediakan panic-level error, tapi penggunaannya untuk menandai operasi error sangat tidak dianjurkan. Selain itu, Rust tidak mengenal konsep ",(0,i.kt)("em",{parentName:"p"},"exception"),"."),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," ini adalah tipe yang paling umum dan direkomendasikan untuk digunakan dalam penanganan error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai penanganan error dibahas di chapter ",(0,i.kt)("a",{parentName:"p",href:"#"},"Error \u279c Recoverable Error & Error Handling"))),(0,i.kt)("h2",{id:"a401-konsep-result"},"A.40.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:"a402-pattern-matching-pada-tipe-result"},"A.40.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:"a403-method-tipe-data-result"},"A.40.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:"a404-operator--pada-tipe-result"},"A.40.4. Operator ",(0,i.kt)("inlineCode",{parentName:"h2"},"?")," pada tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," bisa digunakan pada operator ",(0,i.kt)("inlineCode",{parentName:"p"},"?"),". Penjelasannya ada di chapter terpisah di ",(0,i.kt)("a",{parentName:"p",href:"/basic/operator-tanda-tanya"},"Operator ?"),"."),(0,i.kt)("h2",{id:"a405-error-handling"},"A.40.5. Error handling"),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," banyak digunakan pada fungsi-fungsi yang disediakan Rust standard library, selain itu tipe tersebut juga akan sering kita gunakan dalam ",(0,i.kt)("em",{parentName:"p"},"real life")," project."),(0,i.kt)("p",null,"Tipe ini dimanfaatkan untuk error handling di Rust. Lebih jelasnya mengenai topik tersebut dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"#"},"Error \u279c Recoverable Error & Error Handling"),"."),(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)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/operator-tanda-tanya"},"Operator ?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"#"},"Error \u279c Recoverable Error & Error Handling"))),(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.1399478f.js b/assets/js/7794a932.1399478f.js new file mode 100644 index 00000000..214365a8 --- /dev/null +++ b/assets/js/7794a932.1399478f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[8358],{3905:(e,a,n)=>{n.d(a,{Zo:()=>o,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({}),u=function(e){var a=t.useContext(d),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(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,o=p(e,["components","mdxType","originalType","parentName"]),m=u(n),s=i,c=m["".concat(d,".").concat(s)]||m[s]||k[s]||r;return n?t.createElement(c,l(l({ref:a},o),{},{components:n})):t.createElement(c,l({ref:a},o))}));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 u=2;u{n.r(a),n.d(a,{assets:()=>d,contentTitle:()=>l,default:()=>k,frontMatter:()=>r,metadata:()=>p,toc:()=>u});var t=n(7462),i=(n(7294),n(3905));const r={sidebar_position:40,title:"A.40. Tipe Data \u279c Result",sidebar_label:"A.40. Tipe Data \u279c Result"},l=void 0,p={unversionedId:"basic/result-type",id:"basic/result-type",title:"A.40. Tipe Data \u279c Result",description:"Chapter ini membahas tentang tipe data Result, yaitu tipe data yang digunakan untuk menampung nilai yang isinya bisa berupa penanda operasi sukses (Ok) dan data, atau error (Err) beserta keterangan errornya.",source:"@site/docs/basic/result-type.md",sourceDirName:"basic",slug:"/basic/result-type",permalink:"/basic/result-type",draft:!1,tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_position:40,title:"A.40. Tipe Data \u279c Result",sidebar_label:"A.40. Tipe Data \u279c Result"},sidebar:"tutorialSidebar",previous:{title:"A.39. Tipe Data \u279c Option",permalink:"/basic/option-type"},next:{title:"A.41. Operator ?",permalink:"/basic/operator-tanda-tanya"}},d={},u=[{value:"A.40.1. Konsep Result",id:"a401-konsep-result",level:2},{value:"A.40.2. Pattern matching pada tipe Result",id:"a402-pattern-matching-pada-tipe-result",level:2},{value:"\u25c9 Tips pattern matching",id:"-tips-pattern-matching",level:3},{value:"A.40.3. Method tipe data Result",id:"a403-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.40.4. Operator ? pada tipe Result",id:"a404-operator--pada-tipe-result",level:2},{value:"A.40.5. Error handling",id:"a405-error-handling",level:2},{value:"A.40.6. Tipe Result<(), E>",id:"a406-tipe-result-e",level:2},{value:"A.40.7. Tipe Result<T>",id:"a407-tipe-resultt",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:u};function k(e){let{components:a,...r}=e;return(0,i.kt)("wrapper",(0,t.Z)({},o,r,{components:a,mdxType:"MDXLayout"}),(0,i.kt)("p",null,"Chapter ini membahas tentang tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),", yaitu tipe data yang digunakan untuk menampung nilai yang isinya bisa berupa penanda operasi sukses (",(0,i.kt)("inlineCode",{parentName:"p"},"Ok"),") dan data, atau error (",(0,i.kt)("inlineCode",{parentName:"p"},"Err"),") beserta keterangan errornya."),(0,i.kt)("p",null,"Rust menyediakan panic-level error, tapi penggunaannya untuk menandai operasi error sangat tidak dianjurkan. Selain itu, Rust tidak mengenal konsep ",(0,i.kt)("em",{parentName:"p"},"exception"),"."),(0,i.kt)("p",null,"Tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," ini adalah tipe yang paling umum dan direkomendasikan untuk digunakan dalam penanganan error."),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Lebih detailnya mengenai penanganan error dibahas di chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/recoverable-error-handling"},"Error \u279c Recoverable Error & Error Handling"))),(0,i.kt)("h2",{id:"a401-konsep-result"},"A.40.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 (error).")),(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:"a402-pattern-matching-pada-tipe-result"},"A.40.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:"a403-method-tipe-data-result"},"A.40.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:"a404-operator--pada-tipe-result"},"A.40.4. Operator ",(0,i.kt)("inlineCode",{parentName:"h2"},"?")," pada tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," bisa digunakan pada operator ",(0,i.kt)("inlineCode",{parentName:"p"},"?"),". Penjelasannya ada di chapter terpisah di ",(0,i.kt)("a",{parentName:"p",href:"/basic/operator-tanda-tanya"},"Operator ?"),"."),(0,i.kt)("h2",{id:"a405-error-handling"},"A.40.5. Error handling"),(0,i.kt)("p",null,"Tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," banyak digunakan pada fungsi-fungsi yang disediakan Rust standard library, selain itu tipe tersebut juga akan sering kita gunakan dalam ",(0,i.kt)("em",{parentName:"p"},"real life")," project."),(0,i.kt)("p",null,"Tipe ini dimanfaatkan untuk error handling di Rust. Lebih jelasnya mengenai topik tersebut dibahas pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/recoverable-error-handling"},"Error \u279c Recoverable Error & Error Handling"),"."),(0,i.kt)("h2",{id:"a406-tipe-result-e"},"A.40.6. Tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result<(), E>")),(0,i.kt)("p",null,"Di atas kita telah mempelajari dan mempraktekan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"divider()")," yang fungsi tersebut mengembalikan 2 informasi, yaitu:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"T")," berisi nilai hasil pembagian"),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E")," berisi error saat operasi pembagian")),(0,i.kt)("p",null,"Bentuk lain penerapan tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," adalah dengan menggunakan notasi ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," dengan ",(0,i.kt)("inlineCode",{parentName:"p"},"T")," diisi tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"()"),". Tipe ini cukup sering digunakan pada fungsi yang memiliki potensi error tapi kita hanya butuh informasi errornya saja tanpa nilai balik lainnya."),(0,i.kt)("p",null,"Sebagai contoh, pada kode berikut dibuat fungsi baru bernama ",(0,i.kt)("inlineCode",{parentName:"p"},"divide_and_print()"),". Dalam fungsi tersebut, operasi pembagian dilakukan. Jika sukses, nilainya langsung di-print; jika error, nilai errornya dikembalikan. Dari sini terlihat bahwa kita tidak membutuhkan fungsi tersebut untuk mengembalikan informasi selain error."),(0,i.kt)("pre",null,(0,i.kt)("code",{parentName:"pre",className:"language-rust"},'fn divide_and_print(a: f64, b: f64) -> Result<(), MathError> {\n let res = divider(a, b);\n match res {\n Err(m) => {\n println!("ERROR! {:?}", m);\n Err(m)\n },\n Ok(n) => {\n println!("result: {}", n);\n Ok(())\n },\n }\n}\n\nfn main() {\n let result = divide_and_print(10.0, 1.0);\n}\n')),(0,i.kt)("p",null,"Pada pemanggilan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"Ok()")," gunakan nilai ",(0,i.kt)("inlineCode",{parentName:"p"},"()")," untuk memenuhi kriteria tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result<(), MathError>"),"."),(0,i.kt)("h2",{id:"a407-tipe-resultt"},"A.40.7. Tipe ",(0,i.kt)("inlineCode",{parentName:"h2"},"Result")),(0,i.kt)("p",null,"Notasi tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result")," bawaan Rust Standard Library adalah ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Namun, pada pengembangan software yang melibatkan banyak sekali library/dependency, adakalanya pembaca akan menemui notasi tipe data ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Notasi tersebut dibuat oleh pengembang library/dependency untuk memperingkas tipe ",(0,i.kt)("inlineCode",{parentName:"p"},"Result"),". Jadi tidak usah bingung."),(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)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/operator-tanda-tanya"},"Operator ?")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"/basic/recoverable-error-handling"},"Error \u279c Recoverable Error & Error Handling"))),(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/87499f15.3255091a.js b/assets/js/87499f15.3255091a.js deleted file mode 100644 index e84c3400..00000000 --- a/assets/js/87499f15.3255091a.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 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+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCAyMi41IChXaW5kb3dzKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjItMDctMjdUMTY6MTU6NDkrMDc6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIyLTA5LTI3VDE3OjIyOjM3KzA3OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIyLTA5LTI3VDE3OjIyOjM3KzA3OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmMwYWNkNzk4LTkwODAt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"},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.91f9bc09.js b/assets/js/87499f15.91f9bc09.js new file mode 100644 index 00000000..6242b8a9 --- /dev/null +++ b/assets/js/87499f15.91f9bc09.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7742],{3905:(a,e,n)=>{n.d(e,{Zo:()=>u,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},u=function(a){var e=d(a.components);return i.createElement(p.Provider,{value:e},a.children)},s={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,u=m(a,["components","mdxType","originalType","parentName"]),A=d(n),k=t,g=A["".concat(p,".").concat(k)]||A[k]||s[k]||l;return n?i.createElement(g,r(r({ref:e},u),{},{components:n})):i.createElement(g,r({ref:e},u))}));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:()=>s,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:"A.4.9. Variabel _",id:"a49-variabel-_",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}],u={toc:d};function s(a){let{components:e,...l}=a;return(0,t.kt)("wrapper",(0,i.Z)({},u,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)("h2",{id:"a49-variabel-_"},"A.4.9. Variabel ",(0,t.kt)("inlineCode",{parentName:"h2"},"_")),(0,t.kt)("p",null,"Di Rust, jika ada variabel yang dideklarasikan tapi tidak digunakan, maka muncul warning saat ekesekusi program."),(0,t.kt)("p",null,"Pada praktiknya, tidak semua variabel memang perlu untuk digunakan. Pada kasus tertentu suatu variabel harus tetap dideklarasikan untuk menampung suatu nilai meski tidak digunakan. Misalnya pada case dimana ada pemanggilan fungsi yang nilai baliknya tidak digunakan."),(0,t.kt)("p",null,"Untuk case seperti yang dijelaskan di atas, gunakan variabel ",(0,t.kt)("inlineCode",{parentName:"p"},"_"),". Variabel ini berguna untuk menampung nilai yang tidak digunakan, untuk menghindari warning. Contoh:"),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"fn main() {\n let _ = run_something();\n}\n")),(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"))))}s.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/935f2afb.50cc2b72.js b/assets/js/935f2afb.50cc2b72.js new file mode 100644 index 00000000..8802abcc --- /dev/null +++ b/assets/js/935f2afb.50cc2b72.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[53],{1109:a=>{a.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Dasar Pemrograman Rust","href":"/","docId":"index"},{"type":"link","label":"Pengenalan Rust Programming","href":"/pengelanan-rust-programming","docId":"pengelanan-rust-programming"},{"type":"link","label":"Contribution & Tech Stack","href":"/CONTRIBUTING","docId":"CONTRIBUTING"},{"type":"link","label":"Download versi PDF","href":"/download-pdf","docId":"download-pdf"},{"type":"link","label":"Lisensi & Distribusi Konten","href":"/LICENSE","docId":"LICENSE"},{"type":"category","label":"Persiapan dan Instalasi","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"Instalasi Rust","href":"/installation/instalasi-rust","docId":"installation/instalasi-rust"},{"type":"link","label":"Rust Editor & Plugin","href":"/installation/rust-editor-plugin","docId":"installation/rust-editor-plugin"}]},{"type":"category","label":"Pemrograman Rust Dasar","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"A.1. Program Pertama \u279c Hello Rust","href":"/basic/hello-rust","docId":"basic/hello-rust"},{"type":"link","label":"A.2. Build dan Run Program Rust","href":"/basic/build-dan-run-program-rust","docId":"basic/build-dan-run-program-rust"},{"type":"link","label":"A.3. Komentar","href":"/basic/komentar","docId":"basic/komentar"},{"type":"link","label":"A.4. Variabel","href":"/basic/variabel","docId":"basic/variabel"},{"type":"link","label":"A.5. Tipe Data \u279c Primitive Scalar","href":"/basic/tipe-data-primitive-scalar","docId":"basic/tipe-data-primitive-scalar"},{"type":"link","label":"A.6. Tipe Data \u279c String Literal (&str)","href":"/basic/tipe-data-string-literal","docId":"basic/tipe-data-string-literal"},{"type":"link","label":"A.7. Konstanta","href":"/basic/konstanta","docId":"basic/konstanta"},{"type":"link","label":"A.8. Operator","href":"/basic/operator","docId":"basic/operator"},{"type":"link","label":"A.9. Seleksi Kondisi \u279c if, else if, else","href":"/basic/seleksi-kondisi-if","docId":"basic/seleksi-kondisi-if"},{"type":"link","label":"A.10. Perulangan \u279c while","href":"/basic/perulangan-while","docId":"basic/perulangan-while"},{"type":"link","label":"A.11. Perulangan \u279c loop, break, continue, label","href":"/basic/perulangan-loop-break-continue-label","docId":"basic/perulangan-loop-break-continue-label"},{"type":"link","label":"A.12. Perulangan \u279c for in","href":"/basic/perulangan-for-in","docId":"basic/perulangan-for-in"},{"type":"link","label":"A.13. Array","href":"/basic/array","docId":"basic/array"},{"type":"link","label":"A.14. Slice (Basic)","href":"/basic/slice","docId":"basic/slice"},{"type":"link","label":"A.15. Tuple","href":"/basic/tuple","docId":"basic/tuple"},{"type":"link","label":"A.16. Vector","href":"/basic/vector","docId":"basic/vector"},{"type":"link","label":"A.17. Function","href":"/basic/function","docId":"basic/function"},{"type":"link","label":"A.18. Module System \u279c Path & Item","href":"/basic/path-item","docId":"basic/path-item"},{"type":"link","label":"A.19. Module System \u279c Package & Crate","href":"/basic/package-crate","docId":"basic/package-crate"},{"type":"link","label":"A.20. Module System \u279c Module","href":"/basic/module-basic","docId":"basic/module-basic"},{"type":"link","label":"A.21. Module System \u279c Inline Module","href":"/basic/module-inline","docId":"basic/module-inline"},{"type":"link","label":"A.22. Module System \u279c Scope & Akses Item","href":"/basic/module-scope-item-access","docId":"basic/module-scope-item-access"},{"type":"link","label":"A.23. Struct","href":"/basic/struct","docId":"basic/struct"},{"type":"link","label":"A.24. Associated Function","href":"/basic/associated-function","docId":"basic/associated-function"},{"type":"link","label":"A.25. Method","href":"/basic/method","docId":"basic/method"},{"type":"link","label":"A.26. Enum","href":"/basic/enum","docId":"basic/enum"},{"type":"link","label":"A.27. Type Alias & Casting","href":"/basic/type-alias-casting","docId":"basic/type-alias-casting"},{"type":"link","label":"A.28. Module System \u279c Visibility & Privacy","href":"/basic/visibility-privacy","docId":"basic/visibility-privacy"},{"type":"link","label":"A.29. Module System \u279c Use, Import, Re-export","href":"/basic/use","docId":"basic/use"},{"type":"link","label":"A.30. Block Expression","href":"/basic/block-expression","docId":"basic/block-expression"},{"type":"link","label":"A.31. Shadowing","href":"/basic/shadowing","docId":"basic/shadowing"},{"type":"link","label":"A.32. Basic Memory Management","href":"/basic/basic-memory-management","docId":"basic/basic-memory-management"},{"type":"link","label":"A.33. Pointer & References","href":"/basic/pointer-references","docId":"basic/pointer-references"},{"type":"link","label":"A.34. Ownership","href":"/basic/ownership","docId":"basic/ownership"},{"type":"link","label":"A.35. Borrowing","href":"/basic/borrowing","docId":"basic/borrowing"},{"type":"link","label":"A.36. Traits","href":"/basic/traits","docId":"basic/traits"},{"type":"link","label":"A.37. Traits \u279c Advanced","href":"/basic/advanced-traits","docId":"basic/advanced-traits"},{"type":"link","label":"A.38. Generics","href":"/basic/generics","docId":"basic/generics"},{"type":"link","label":"A.39. Tipe Data \u279c Option","href":"/basic/option-type","docId":"basic/option-type"},{"type":"link","label":"A.40. Tipe Data \u279c Result","href":"/basic/result-type","docId":"basic/result-type"},{"type":"link","label":"A.41. Operator ?","href":"/basic/operator-tanda-tanya","docId":"basic/operator-tanda-tanya"},{"type":"link","label":"A.42. Pattern Matching","href":"/basic/pattern-matching","docId":"basic/pattern-matching"},{"type":"link","label":"A.43. Static Item","href":"/basic/static","docId":"basic/static"},{"type":"link","label":"A.44. Lifetime","href":"/basic/lifetime","docId":"basic/lifetime"},{"type":"link","label":"A.45. Slice Memory Management","href":"/basic/slice-memory-management","docId":"basic/slice-memory-management"},{"type":"link","label":"A.46. String Literal (&str) vs. String Custom Type","href":"/basic/string-slice-vs-string-literal","docId":"basic/string-slice-vs-string-literal"},{"type":"link","label":"A.47. Tipe Data \u279c String Custom Type","href":"/basic/tipe-data-custom-type-string-slice","docId":"basic/tipe-data-custom-type-string-slice"},{"type":"link","label":"A.48. Closures","href":"/basic/closures","docId":"basic/closures"},{"type":"link","label":"A.49. Trait \u279c Function (Fn, FnMut, FnOnce)","href":"/basic/trait-function","docId":"basic/trait-function"},{"type":"link","label":"A.50. Trait \u279c Iterator","href":"/basic/trait-iterator","docId":"basic/trait-iterator"},{"type":"link","label":"A.51. Attributes","href":"/basic/attributes","docId":"basic/attributes"},{"type":"link","label":"A.52. Date Time","href":"/basic/datetime","docId":"basic/datetime"},{"type":"link","label":"A.53. File, Path, Directory","href":"/basic/file-path-directory","docId":"basic/file-path-directory"},{"type":"link","label":"A.54. Error \u279c Unrecoverable Error / Panic","href":"/basic/unrecoverable-panic-error","docId":"basic/unrecoverable-panic-error"},{"type":"link","label":"A.55. Error \u279c Recoverable Error & Error Handling","href":"/basic/recoverable-error-handling","docId":"basic/recoverable-error-handling"}]}]},"docs":{"basic/advanced-traits":{"id":"basic/advanced-traits","title":"A.37. Traits \u279c Advanced","description":"Chapter ini merupakan kelanjutan dari chapter sebelumnya. Di sini kita fokus ke pembuatan local trait, macam-macam implementasi traits, traits bound syntax, associated types, dan topik yang masih relevan dengan traits lainnya.","sidebar":"tutorialSidebar"},"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","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/attributes":{"id":"basic/attributes","title":"A.51. 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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/block-expression":{"id":"basic/block-expression","title":"A.30. Block Expression","description":"Pada chapter ini kita akan belajar tentang block expression.","sidebar":"tutorialSidebar"},"basic/borrowing":{"id":"basic/borrowing","title":"A.35. Borrowing","description":"Pada chapter ini kita akan belajar tentang apa itu borrowing dalam Rust programming.","sidebar":"tutorialSidebar"},"basic/build-dan-run-program-rust":{"id":"basic/build-dan-run-program-rust","title":"A.2. Build dan Run Program Rust","description":"Cara run program Rust menggunakan cargo. Pada chapter ini kita akan belajar lebih lanjut tentang command untuk proses build dan run dalam program Rust. Sebelumnya kita sudah belajar tentang cargo new dan cargo run, selain command tersebut ada juga command lain yaitu cargo build untuk proses kompilasi build kode program.","sidebar":"tutorialSidebar"},"basic/closures":{"id":"basic/closures","title":"A.48. 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.","sidebar":"tutorialSidebar"},"basic/datetime":{"id":"basic/datetime","title":"A.52. Date Time","description":"Pada chapter ini kita akan mempelajari tentang tipe data datetime yang ada di Rust programming.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/file-path-directory":{"id":"basic/file-path-directory","title":"A.53. File, Path, Directory","description":"Pada chapter ini kita akan belajar tentang beberapa API milik Rust yang disediakan untuk manajemen path dan file system.","sidebar":"tutorialSidebar"},"basic/function":{"id":"basic/function","title":"A.17. Function","description":"Pada chapter ini kita akan belajar tentang function atau fungsi.","sidebar":"tutorialSidebar"},"basic/generics":{"id":"basic/generics","title":"A.38. Generics","description":"Chapter ini membahas tentang generics.","sidebar":"tutorialSidebar"},"basic/hello-rust":{"id":"basic/hello-rust","title":"A.1. Program Pertama \u279c Hello Rust","description":"Belajar membuat program hello world di Rust, dimulai dengan pembuatan program Hello World sederhana.","sidebar":"tutorialSidebar"},"basic/komentar":{"id":"basic/komentar","title":"A.3. Komentar","description":"Pada chapter ini kita akan membahas tentang komentar pada pemrograman Rust. Ada beberapa jenis komentar yang tersedia, namun untuk sekarang yang penting diketahui hanya 2.","sidebar":"tutorialSidebar"},"basic/konstanta":{"id":"basic/konstanta","title":"A.7. Konstanta","description":"Chapter ini membahas tentang konstanta di bahasa Rust.","sidebar":"tutorialSidebar"},"basic/lifetime":{"id":"basic/lifetime","title":"A.44. 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.","sidebar":"tutorialSidebar"},"basic/method":{"id":"basic/method","title":"A.25. Method","description":"Pada chapter ini kita akan belajar tentang method beserta perbedaannya dengan associated function.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/operator":{"id":"basic/operator","title":"A.8. Operator","description":"Chapter ini membahas mengenai operator pada pemrograman rust.","sidebar":"tutorialSidebar"},"basic/operator-tanda-tanya":{"id":"basic/operator-tanda-tanya","title":"A.41. Operator ?","description":"Operator ? (atau question mark operator) adalah operator yang cukup berguna untuk operasi unwrap nilai dari tipe Result atau Option. Pada chapter ini kita akan belajar tentang operator tersebut.","sidebar":"tutorialSidebar"},"basic/option-type":{"id":"basic/option-type","title":"A.39. 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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/pattern-matching":{"id":"basic/pattern-matching","title":"A.42. Pattern Matching","description":"Chapter ini membahas tentang pattern matching, sebuah teknik yang lebih advance dibanding seleksi kondisi biasa.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/recoverable-error-handling":{"id":"basic/recoverable-error-handling","title":"A.55. Error \u279c Recoverable Error & Error Handling","description":"Chapter ini merupakan kelanjutan dari chapter sebelumnya tentang pembahasan topic error. Kali ini fokus kita lebih ke recoverable error dan penanganannya (error handling / error propagation).","sidebar":"tutorialSidebar"},"basic/result-type":{"id":"basic/result-type","title":"A.40. Tipe Data \u279c Result","description":"Chapter ini membahas tentang tipe data Result, yaitu tipe data yang digunakan untuk menampung nilai yang isinya bisa berupa penanda operasi sukses (Ok) dan data, atau error (Err) beserta keterangan errornya.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/shadowing":{"id":"basic/shadowing","title":"A.31. Shadowing","description":"Pada chapter ini kita akan belajar tentang shadowing pada variable dan apa perbedaannya dibanding variable mutable.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/slice-memory-management":{"id":"basic/slice-memory-management","title":"A.45. 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.","sidebar":"tutorialSidebar"},"basic/static":{"id":"basic/static","title":"A.43. Static Item","description":"Pada chapter ini kita akan bahas tentang apa itu static item, dan perbedaanya dibanding konstanta.","sidebar":"tutorialSidebar"},"basic/string-slice-vs-string-literal":{"id":"basic/string-slice-vs-string-literal","title":"A.46. 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.","sidebar":"tutorialSidebar"},"basic/struct":{"id":"basic/struct","title":"A.23. Struct","description":"Pada chapter ini kita akan belajar tentang struct.","sidebar":"tutorialSidebar"},"basic/tipe-data-custom-type-string-slice":{"id":"basic/tipe-data-custom-type-string-slice","title":"A.47. Tipe Data \u279c String Custom Type","description":"Pembahasan kali ini lingkupnya masih dalam topik custom type String.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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:","sidebar":"tutorialSidebar"},"basic/trait-function":{"id":"basic/trait-function","title":"A.49. 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.","sidebar":"tutorialSidebar"},"basic/trait-iterator":{"id":"basic/trait-iterator","title":"A.50. 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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/type-alias-casting":{"id":"basic/type-alias-casting","title":"A.27. Type Alias & Casting","description":"Chapter ini membahas tentang type alias dan juga casting (explicit conversion) pada tipe data primitif scalar.","sidebar":"tutorialSidebar"},"basic/unrecoverable-panic-error":{"id":"basic/unrecoverable-panic-error","title":"A.54. Error \u279c Unrecoverable Error / Panic","description":"Error handling atau penanganan error adalah salah satu aspek penting dalam pemrograman selalu umum. Rust mengenal 2 jenis error yaitu unrecoverable error (panic error) dan recoverable error. Pembahasan chapter ini fokus pada unrecoverable error atau panic error.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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).","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"download-pdf":{"id":"download-pdf","title":"Download versi PDF","description":"Ebook Dasar Pemrograman Rust bisa di-download dalam bentuk file PDF, silakan gunakan link berikut:","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Tutorial Belajar Rust (Gratis!)","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.","sidebar":"tutorialSidebar"},"installation/instalasi-rust":{"id":"installation/instalasi-rust","title":"Instalasi Rust","description":"Pada chapter ini kita akan belajar cara instalasi Rust. Pembaca bisa mengikuti panduan instalasi ini, atau langsung saja navigasi ke https://www.rust-lang.org/tools/install.","sidebar":"tutorialSidebar"},"installation/rust-editor-plugin":{"id":"installation/rust-editor-plugin","title":"Rust Editor & Plugin","description":"Pemilihan editor dan plugin","sidebar":"tutorialSidebar"},"LICENSE":{"id":"LICENSE","title":"Lisensi & Distribusi Konten","description":"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:","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.5bca681b.js b/assets/js/935f2afb.5bca681b.js deleted file mode 100644 index a5b29824..00000000 --- a/assets/js/935f2afb.5bca681b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[53],{1109:a=>{a.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Dasar Pemrograman Rust","href":"/","docId":"index"},{"type":"link","label":"Pengenalan Rust Programming","href":"/pengelanan-rust-programming","docId":"pengelanan-rust-programming"},{"type":"link","label":"Contribution & Tech Stack","href":"/CONTRIBUTING","docId":"CONTRIBUTING"},{"type":"link","label":"Download versi PDF","href":"/download-pdf","docId":"download-pdf"},{"type":"link","label":"Lisensi & Distribusi Konten","href":"/LICENSE","docId":"LICENSE"},{"type":"category","label":"Persiapan dan Instalasi","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"Instalasi Rust","href":"/installation/instalasi-rust","docId":"installation/instalasi-rust"},{"type":"link","label":"Rust Editor & Plugin","href":"/installation/rust-editor-plugin","docId":"installation/rust-editor-plugin"}]},{"type":"category","label":"Pemrograman Rust Dasar","collapsible":false,"collapsed":false,"items":[{"type":"link","label":"A.1. Program Pertama \u279c Hello Rust","href":"/basic/hello-rust","docId":"basic/hello-rust"},{"type":"link","label":"A.2. Build dan Run Program Rust","href":"/basic/build-dan-run-program-rust","docId":"basic/build-dan-run-program-rust"},{"type":"link","label":"A.3. Komentar","href":"/basic/komentar","docId":"basic/komentar"},{"type":"link","label":"A.4. Variabel","href":"/basic/variabel","docId":"basic/variabel"},{"type":"link","label":"A.5. Tipe Data \u279c Primitive Scalar","href":"/basic/tipe-data-primitive-scalar","docId":"basic/tipe-data-primitive-scalar"},{"type":"link","label":"A.6. Tipe Data \u279c String Literal (&str)","href":"/basic/tipe-data-string-literal","docId":"basic/tipe-data-string-literal"},{"type":"link","label":"A.7. Konstanta","href":"/basic/konstanta","docId":"basic/konstanta"},{"type":"link","label":"A.8. Operator","href":"/basic/operator","docId":"basic/operator"},{"type":"link","label":"A.9. Seleksi Kondisi \u279c if, else if, else","href":"/basic/seleksi-kondisi-if","docId":"basic/seleksi-kondisi-if"},{"type":"link","label":"A.10. Perulangan \u279c while","href":"/basic/perulangan-while","docId":"basic/perulangan-while"},{"type":"link","label":"A.11. Perulangan \u279c loop, break, continue, label","href":"/basic/perulangan-loop-break-continue-label","docId":"basic/perulangan-loop-break-continue-label"},{"type":"link","label":"A.12. Perulangan \u279c for in","href":"/basic/perulangan-for-in","docId":"basic/perulangan-for-in"},{"type":"link","label":"A.13. Array","href":"/basic/array","docId":"basic/array"},{"type":"link","label":"A.14. Slice (Basic)","href":"/basic/slice","docId":"basic/slice"},{"type":"link","label":"A.15. Tuple","href":"/basic/tuple","docId":"basic/tuple"},{"type":"link","label":"A.16. Vector","href":"/basic/vector","docId":"basic/vector"},{"type":"link","label":"A.17. Function","href":"/basic/function","docId":"basic/function"},{"type":"link","label":"A.18. Module System \u279c Path & Item","href":"/basic/path-item","docId":"basic/path-item"},{"type":"link","label":"A.19. Module System \u279c Package & Crate","href":"/basic/package-crate","docId":"basic/package-crate"},{"type":"link","label":"A.20. Module System \u279c Module","href":"/basic/module-basic","docId":"basic/module-basic"},{"type":"link","label":"A.21. Module System \u279c Inline Module","href":"/basic/module-inline","docId":"basic/module-inline"},{"type":"link","label":"A.22. Module System \u279c Scope & Akses Item","href":"/basic/module-scope-item-access","docId":"basic/module-scope-item-access"},{"type":"link","label":"A.23. Struct","href":"/basic/struct","docId":"basic/struct"},{"type":"link","label":"A.24. Associated Function","href":"/basic/associated-function","docId":"basic/associated-function"},{"type":"link","label":"A.25. Method","href":"/basic/method","docId":"basic/method"},{"type":"link","label":"A.26. Enum","href":"/basic/enum","docId":"basic/enum"},{"type":"link","label":"A.27. Type Alias & Casting","href":"/basic/type-alias-casting","docId":"basic/type-alias-casting"},{"type":"link","label":"A.28. Module System \u279c Visibility & Privacy","href":"/basic/visibility-privacy","docId":"basic/visibility-privacy"},{"type":"link","label":"A.29. Module System \u279c Use, Import, Re-export","href":"/basic/use","docId":"basic/use"},{"type":"link","label":"A.30. Block Expression","href":"/basic/block-expression","docId":"basic/block-expression"},{"type":"link","label":"A.31. Shadowing","href":"/basic/shadowing","docId":"basic/shadowing"},{"type":"link","label":"A.32. Basic Memory Management","href":"/basic/basic-memory-management","docId":"basic/basic-memory-management"},{"type":"link","label":"A.33. Pointer & References","href":"/basic/pointer-references","docId":"basic/pointer-references"},{"type":"link","label":"A.34. Ownership","href":"/basic/ownership","docId":"basic/ownership"},{"type":"link","label":"A.35. Borrowing","href":"/basic/borrowing","docId":"basic/borrowing"},{"type":"link","label":"A.36. Traits","href":"/basic/traits","docId":"basic/traits"},{"type":"link","label":"A.37. Traits \u279c Advanced","href":"/basic/advanced-traits","docId":"basic/advanced-traits"},{"type":"link","label":"A.38. Generics","href":"/basic/generics","docId":"basic/generics"},{"type":"link","label":"A.39. Tipe Data \u279c Option","href":"/basic/option-type","docId":"basic/option-type"},{"type":"link","label":"A.40. Tipe Data \u279c Result","href":"/basic/result-type","docId":"basic/result-type"},{"type":"link","label":"A.41. Operator ?","href":"/basic/operator-tanda-tanya","docId":"basic/operator-tanda-tanya"},{"type":"link","label":"A.42. Pattern Matching","href":"/basic/pattern-matching","docId":"basic/pattern-matching"},{"type":"link","label":"A.43. Static Item","href":"/basic/static","docId":"basic/static"},{"type":"link","label":"A.44. Lifetime","href":"/basic/lifetime","docId":"basic/lifetime"},{"type":"link","label":"A.45. Slice Memory Management","href":"/basic/slice-memory-management","docId":"basic/slice-memory-management"},{"type":"link","label":"A.46. String Literal (&str) vs. String Custom Type","href":"/basic/string-slice-vs-string-literal","docId":"basic/string-slice-vs-string-literal"},{"type":"link","label":"A.47. Tipe Data \u279c String Custom Type","href":"/basic/tipe-data-custom-type-string-slice","docId":"basic/tipe-data-custom-type-string-slice"},{"type":"link","label":"A.48. Closures","href":"/basic/closures","docId":"basic/closures"},{"type":"link","label":"A.49. Trait \u279c Function (Fn, FnMut, FnOnce)","href":"/basic/trait-function","docId":"basic/trait-function"},{"type":"link","label":"A.50. Trait \u279c Iterator","href":"/basic/trait-iterator","docId":"basic/trait-iterator"},{"type":"link","label":"A.51. Attributes","href":"/basic/attributes","docId":"basic/attributes"},{"type":"link","label":"A.52. Date Time","href":"/basic/datetime","docId":"basic/datetime"},{"type":"link","label":"A.53. File, Path, Directory","href":"/basic/file-path-directory","docId":"basic/file-path-directory"},{"type":"link","label":"A.54. Error \u279c Unrecoverable Error / Panic","href":"/basic/unrecoverable-panic-error","docId":"basic/unrecoverable-panic-error"}]}]},"docs":{"basic/advanced-traits":{"id":"basic/advanced-traits","title":"A.37. Traits \u279c Advanced","description":"Chapter ini merupakan kelanjutan dari chapter sebelumnya. Di sini kita fokus ke pembuatan local trait, macam-macam implementasi traits, traits bound syntax, associated types, dan topik yang masih relevan dengan traits lainnya.","sidebar":"tutorialSidebar"},"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","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/attributes":{"id":"basic/attributes","title":"A.51. 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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/block-expression":{"id":"basic/block-expression","title":"A.30. Block Expression","description":"Pada chapter ini kita akan belajar tentang block expression.","sidebar":"tutorialSidebar"},"basic/borrowing":{"id":"basic/borrowing","title":"A.35. Borrowing","description":"Pada chapter ini kita akan belajar tentang apa itu borrowing dalam Rust programming.","sidebar":"tutorialSidebar"},"basic/build-dan-run-program-rust":{"id":"basic/build-dan-run-program-rust","title":"A.2. Build dan Run Program Rust","description":"Cara run program Rust menggunakan cargo. Pada chapter ini kita akan belajar lebih lanjut tentang command untuk proses build dan run dalam program Rust. Sebelumnya kita sudah belajar tentang cargo new dan cargo run, selain command tersebut ada juga command lain yaitu cargo build untuk proses kompilasi build kode program.","sidebar":"tutorialSidebar"},"basic/closures":{"id":"basic/closures","title":"A.48. 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.","sidebar":"tutorialSidebar"},"basic/datetime":{"id":"basic/datetime","title":"A.52. Date Time","description":"Pada chapter ini kita akan mempelajari tentang tipe data datetime yang ada di Rust programming.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/file-path-directory":{"id":"basic/file-path-directory","title":"A.53. File, Path, Directory","description":"Pada chapter ini kita akan belajar tentang beberapa API milik Rust yang disediakan untuk manajemen path dan file system.","sidebar":"tutorialSidebar"},"basic/function":{"id":"basic/function","title":"A.17. Function","description":"Pada chapter ini kita akan belajar tentang function atau fungsi.","sidebar":"tutorialSidebar"},"basic/generics":{"id":"basic/generics","title":"A.38. Generics","description":"Chapter ini membahas tentang generics.","sidebar":"tutorialSidebar"},"basic/hello-rust":{"id":"basic/hello-rust","title":"A.1. Program Pertama \u279c Hello Rust","description":"Belajar membuat program hello world di Rust, dimulai dengan pembuatan program Hello World sederhana.","sidebar":"tutorialSidebar"},"basic/komentar":{"id":"basic/komentar","title":"A.3. Komentar","description":"Pada chapter ini kita akan membahas tentang komentar pada pemrograman Rust. Ada beberapa jenis komentar yang tersedia, namun untuk sekarang yang penting diketahui hanya 2.","sidebar":"tutorialSidebar"},"basic/konstanta":{"id":"basic/konstanta","title":"A.7. Konstanta","description":"Chapter ini membahas tentang konstanta di bahasa Rust.","sidebar":"tutorialSidebar"},"basic/lifetime":{"id":"basic/lifetime","title":"A.44. 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.","sidebar":"tutorialSidebar"},"basic/method":{"id":"basic/method","title":"A.25. Method","description":"Pada chapter ini kita akan belajar tentang method beserta perbedaannya dengan associated function.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/operator":{"id":"basic/operator","title":"A.8. Operator","description":"Chapter ini membahas mengenai operator pada pemrograman rust.","sidebar":"tutorialSidebar"},"basic/operator-tanda-tanya":{"id":"basic/operator-tanda-tanya","title":"A.41. Operator ?","description":"Operator ? (atau question mark operator) adalah operator yang cukup berguna untuk operasi unwrap nilai dari tipe Result atau Option. Pada chapter ini kita akan belajar tentang operator tersebut.","sidebar":"tutorialSidebar"},"basic/option-type":{"id":"basic/option-type","title":"A.39. 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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/pattern-matching":{"id":"basic/pattern-matching","title":"A.42. Pattern Matching","description":"Chapter ini membahas tentang pattern matching, sebuah teknik yang lebih advance dibanding seleksi kondisi biasa.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/result-type":{"id":"basic/result-type","title":"A.40. Tipe Data \u279c Result","description":"Chapter ini membahas tentang tipe data Result, yaitu tipe data yang digunakan untuk menampung nilai yang isinya bisa berupa penanda operasi sukses (Ok) dan data, atau error (Err) beserta keterangan errornya.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/shadowing":{"id":"basic/shadowing","title":"A.31. Shadowing","description":"Pada chapter ini kita akan belajar tentang shadowing pada variable dan apa perbedaannya dibanding variable mutable.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/slice-memory-management":{"id":"basic/slice-memory-management","title":"A.45. 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.","sidebar":"tutorialSidebar"},"basic/static":{"id":"basic/static","title":"A.43. Static Item","description":"Pada chapter ini kita akan bahas tentang apa itu static item, dan perbedaanya dibanding konstanta.","sidebar":"tutorialSidebar"},"basic/string-slice-vs-string-literal":{"id":"basic/string-slice-vs-string-literal","title":"A.46. 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.","sidebar":"tutorialSidebar"},"basic/struct":{"id":"basic/struct","title":"A.23. Struct","description":"Pada chapter ini kita akan belajar tentang struct.","sidebar":"tutorialSidebar"},"basic/tipe-data-custom-type-string-slice":{"id":"basic/tipe-data-custom-type-string-slice","title":"A.47. Tipe Data \u279c String Custom Type","description":"Pembahasan kali ini lingkupnya masih dalam topik custom type String.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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:","sidebar":"tutorialSidebar"},"basic/trait-function":{"id":"basic/trait-function","title":"A.49. 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.","sidebar":"tutorialSidebar"},"basic/trait-iterator":{"id":"basic/trait-iterator","title":"A.50. 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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"basic/type-alias-casting":{"id":"basic/type-alias-casting","title":"A.27. Type Alias & Casting","description":"Chapter ini membahas tentang type alias dan juga casting (explicit conversion) pada tipe data primitif scalar.","sidebar":"tutorialSidebar"},"basic/unrecoverable-panic-error":{"id":"basic/unrecoverable-panic-error","title":"A.54. Error \u279c Unrecoverable Error / Panic","description":"Error handling atau penanganan error adalah salah satu aspek penting dalam pemrograman selalu umum. Rust mengenal 2 jenis error yaitu unrecoverable error (panic error) dan recoverable error. Pembahasan chapter ini fokus pada unrecoverable error atau panic error.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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).","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"},"download-pdf":{"id":"download-pdf","title":"Download versi PDF","description":"Ebook Dasar Pemrograman Rust bisa di-download dalam bentuk file PDF, silakan gunakan link berikut:","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Tutorial Belajar Rust (Gratis!)","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.","sidebar":"tutorialSidebar"},"installation/instalasi-rust":{"id":"installation/instalasi-rust","title":"Instalasi Rust","description":"Pada chapter ini kita akan belajar cara instalasi Rust. Pembaca bisa mengikuti panduan instalasi ini, atau langsung saja navigasi ke https://www.rust-lang.org/tools/install.","sidebar":"tutorialSidebar"},"installation/rust-editor-plugin":{"id":"installation/rust-editor-plugin","title":"Rust Editor & Plugin","description":"Pemilihan editor dan plugin","sidebar":"tutorialSidebar"},"LICENSE":{"id":"LICENSE","title":"Lisensi & Distribusi Konten","description":"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:","sidebar":"tutorialSidebar"},"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.","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/9a3629a6.23affd87.js b/assets/js/9a3629a6.23affd87.js deleted file mode 100644 index 0ed71537..00000000 --- a/assets/js/9a3629a6.23affd87.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7865],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>k});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({}),o=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=o(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,u=p(e,["components","mdxType","originalType","parentName"]),m=o(a),k=i,c=m["".concat(s,".").concat(k)]||m[k]||d[k]||r;return a?n.createElement(c,l(l({ref:t},u),{},{components:a})):n.createElement(c,l({ref:t},u))}));function k(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 o=2;o{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>o});var n=a(7462),i=(a(7294),a(3905));const r={sidebar_position:53,title:"A.53. File, Path, Directory",sidebar_label:"A.53. File, Path, Directory"},l=void 0,p={unversionedId:"basic/file-path-directory",id:"basic/file-path-directory",title:"A.53. 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:53,frontMatter:{sidebar_position:53,title:"A.53. File, Path, Directory",sidebar_label:"A.53. File, Path, Directory"},sidebar:"tutorialSidebar",previous:{title:"A.52. Date Time",permalink:"/basic/datetime"},next:{title:"A.54. Error \u279c Unrecoverable Error / Panic",permalink:"/basic/unrecoverable-panic-error"}},s={},o=[{value:"A.53.1. File path (std::path::Path)",id:"a531-file-path-stdpathpath",level:2},{value:"A.53.2. Method filepath",id:"a532-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.53.3. Module std::fs (file system)",id:"a533-module-stdfs-file-system",level:2},{value:"A.53.4. Manajemen file system",id:"a534-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 Membaca isi file ke bentuk string (fs::read_to_string)",id:"-membaca-isi-file-ke-bentuk-string-fsread_to_string",level:3},{value:"\u25c9 Membaca isi file ke bentuk vector (fs::read)",id:"-membaca-isi-file-ke-bentuk-vector-fsread",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}],u={toc:o};function d(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},u,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:"a531-file-path-stdpathpath"},"A.53.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"},'use std::path::Path;\n\nlet 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\nprintln!("{:?}", filepath_1);\n// output => "/home/novalagung/Desktop/my text.txt"\n\nprintln!("{:?}", filepath_2);\n// output => "/home/novalagung/Desktop/my text.txt"\n')),(0,i.kt)("h2",{id:"a532-method-filepath"},"A.53.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:"a533-module-stdfs-file-system"},"A.53.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"},'use std::fs;\n\nfn main() {\n let path = "./files";\n let res = fs::create_dir(&path);\n println!("{:?}", res);\n // output => Ok(())\n}\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 },\n _ => {\n println!("directory created");\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:"a534-manajemen-file-system"},"A.53.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.53.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 },\n _ => {\n println!("file created");\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:"-membaca-isi-file-ke-bentuk-string-fsread_to_string"},"\u25c9 Membaca isi file ke bentuk string (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::read_to_string"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::read_to_string()")," digunakan untuk membaca isi file dalam bentuk string. Contoh penerapannya:"),(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::read_to_string(&path);\n\nmatch res {\n Err(err) => {\n println!("error on reading file {}! {}", path.to_str().unwrap_or_default(), err);\n },\n Ok(content) => {\n println!("file {:?} content is: {:?}", path, content);\n },\n}\n')),(0,i.kt)("h3",{id:"-membaca-isi-file-ke-bentuk-vector-fsread"},"\u25c9 Membaca isi file ke bentuk vector (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::read"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::read()")," melakukan operasi baca file dan mengembalikan nilainya dalam bentuk vector ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),". Umumnya, fungsi ini dikombinasikan dengan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::str::from_utf8()")," agar konten file bisa dimunculkan dalam format encoding tertentu (misalnya UTF-8)."),(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::read(&path);\n\nif res.is_err() {\n println!("error on reading file");\n return;\n}\n\nlet content = res.unwrap_or_default();\nmatch std::str::from_utf8(&content) {\n Err(err) => {\n println!("error on reading file! Invalid UTF-8 sequence. {}", err);\n },\n Ok(content) => {\n println!("file {:?} content is: {:?}", path, content);\n },\n};\n')),(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 },\n _ => {\n println!("file deleted");\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 },\n _ => {\n println!("directory deleted");\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.8ffb3acb.js b/assets/js/9a3629a6.8ffb3acb.js new file mode 100644 index 00000000..318489fc --- /dev/null +++ b/assets/js/9a3629a6.8ffb3acb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[7865],{3905:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>k});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({}),o=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=o(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,u=p(e,["components","mdxType","originalType","parentName"]),m=o(a),k=i,c=m["".concat(s,".").concat(k)]||m[k]||d[k]||r;return a?n.createElement(c,l(l({ref:t},u),{},{components:a})):n.createElement(c,l({ref:t},u))}));function k(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 o=2;o{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>l,default:()=>d,frontMatter:()=>r,metadata:()=>p,toc:()=>o});var n=a(7462),i=(a(7294),a(3905));const r={sidebar_position:53,title:"A.53. File, Path, Directory",sidebar_label:"A.53. File, Path, Directory"},l=void 0,p={unversionedId:"basic/file-path-directory",id:"basic/file-path-directory",title:"A.53. 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:53,frontMatter:{sidebar_position:53,title:"A.53. File, Path, Directory",sidebar_label:"A.53. File, Path, Directory"},sidebar:"tutorialSidebar",previous:{title:"A.52. Date Time",permalink:"/basic/datetime"},next:{title:"A.54. Error \u279c Unrecoverable Error / Panic",permalink:"/basic/unrecoverable-panic-error"}},s={},o=[{value:"A.53.1. File path (std::path::Path)",id:"a531-file-path-stdpathpath",level:2},{value:"A.53.2. Method filepath",id:"a532-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.53.3. Module std::fs (file system)",id:"a533-module-stdfs-file-system",level:2},{value:"A.53.4. Manajemen file system",id:"a534-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 Membaca isi file ke bentuk string (fs::read_to_string)",id:"-membaca-isi-file-ke-bentuk-string-fsread_to_string",level:3},{value:"\u25c9 Membaca isi file ke bentuk vector (fs::read)",id:"-membaca-isi-file-ke-bentuk-vector-fsread",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}],u={toc:o};function d(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},u,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)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Penulis anjurkan untuk mengikuti pembelajaran chapter per chapter secara berurutan. Nantinya pada chapter ",(0,i.kt)("a",{parentName:"p",href:"/basic/recoverable-error-handling"},"Recoverable Error & Error Handling")," kita akan banyak menerapkan API yang dipelajari di chapter ini.")),(0,i.kt)("h2",{id:"a531-file-path-stdpathpath"},"A.53.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"},'use std::path::Path;\n\nlet 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\nprintln!("{:?}", filepath_1);\n// output => "/home/novalagung/Desktop/my text.txt"\n\nprintln!("{:?}", filepath_2);\n// output => "/home/novalagung/Desktop/my text.txt"\n')),(0,i.kt)("blockquote",null,(0,i.kt)("p",{parentName:"blockquote"},"Ketika path di-print, yang muncul adalah sesuai dengan string yang ditulis. Dengan pengecualian jika method ",(0,i.kt)("inlineCode",{parentName:"p"},".join()")," digunakan disitu, maka separator file yang digunakan relatif terhadap OS. Jika Windows maka ",(0,i.kt)("inlineCode",{parentName:"p"},"\\"),", dan ",(0,i.kt)("inlineCode",{parentName:"p"},"/")," untuk non-Windows.")),(0,i.kt)("h2",{id:"a532-method-filepath"},"A.53.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:"a533-module-stdfs-file-system"},"A.53.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"},'use std::fs;\n\nfn main() {\n let path = "./files";\n let res = fs::create_dir(&path);\n println!("{:?}", res);\n // output => Ok(())\n}\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 },\n _ => {\n println!("directory created");\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:"a534-manajemen-file-system"},"A.53.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.53.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 },\n _ => {\n println!("file created");\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:"-membaca-isi-file-ke-bentuk-string-fsread_to_string"},"\u25c9 Membaca isi file ke bentuk string (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::read_to_string"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::read_to_string()")," digunakan untuk membaca isi file dalam bentuk string. Contoh penerapannya:"),(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::read_to_string(&path);\n\nmatch res {\n Err(err) => {\n println!("error on reading file {}! {}", path.to_str().unwrap_or_default(), err);\n },\n Ok(content) => {\n println!("file {:?} content is: {:?}", path, content);\n },\n}\n')),(0,i.kt)("h3",{id:"-membaca-isi-file-ke-bentuk-vector-fsread"},"\u25c9 Membaca isi file ke bentuk vector (",(0,i.kt)("inlineCode",{parentName:"h3"},"fs::read"),")"),(0,i.kt)("p",null,"Fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"fs::read()")," melakukan operasi baca file dan mengembalikan nilainya dalam bentuk vector ",(0,i.kt)("inlineCode",{parentName:"p"},"Vec"),". Umumnya, fungsi ini dikombinasikan dengan fungsi ",(0,i.kt)("inlineCode",{parentName:"p"},"std::str::from_utf8()")," agar konten file bisa dimunculkan dalam format encoding tertentu (misalnya UTF-8)."),(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::read(&path);\n\nif res.is_err() {\n println!("error on reading file");\n return;\n}\n\nlet content = res.unwrap_or_default();\nmatch std::str::from_utf8(&content) {\n Err(err) => {\n println!("error on reading file! Invalid UTF-8 sequence. {}", err);\n },\n Ok(content) => {\n println!("file {:?} content is: {:?}", path, content);\n },\n};\n')),(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 },\n _ => {\n println!("file deleted");\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 },\n _ => {\n println!("directory deleted");\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/9ed3ab78.bfc8ff35.js b/assets/js/9ed3ab78.bfc8ff35.js new file mode 100644 index 00000000..f56eb1d7 --- /dev/null +++ b/assets/js/9ed3ab78.bfc8ff35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[1591],{3905:(e,a,n)=>{n.d(a,{Zo:()=>d,kt:()=>c});var r=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 i(e,a){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);a&&(r=r.filter((function(a){return Object.getOwnPropertyDescriptor(e,a).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var a=1;a=0||(t[n]=e[n]);return t}(e,a);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(t[n]=e[n])}return t}var m=r.createContext({}),u=function(e){var a=r.useContext(m),n=a;return e&&(n="function"==typeof e?e(a):l(l({},a),e)),n},d=function(e){var a=u(e.components);return r.createElement(m.Provider,{value:a},e.children)},p={inlineCode:"code",wrapper:function(e){var a=e.children;return r.createElement(r.Fragment,{},a)}},s=r.forwardRef((function(e,a){var n=e.components,t=e.mdxType,i=e.originalType,m=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),s=u(n),c=t,k=s["".concat(m,".").concat(c)]||s[c]||p[c]||i;return n?r.createElement(k,l(l({ref:a},d),{},{components:n})):r.createElement(k,l({ref:a},d))}));function c(e,a){var n=arguments,t=a&&a.mdxType;if("string"==typeof e||t){var i=n.length,l=new Array(i);l[0]=s;var o={};for(var m in a)hasOwnProperty.call(a,m)&&(o[m]=a[m]);o.originalType=e,o.mdxType="string"==typeof e?e:t,l[1]=o;for(var u=2;u{n.r(a),n.d(a,{assets:()=>m,contentTitle:()=>l,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var r=n(7462),t=(n(7294),n(3905));const i={sidebar_position:55,title:"A.55. Error \u279c Recoverable Error & Error Handling",sidebar_label:"A.55. Error \u279c Recoverable Error & Error Handling"},l=void 0,o={unversionedId:"basic/recoverable-error-handling",id:"basic/recoverable-error-handling",title:"A.55. Error \u279c Recoverable Error & Error Handling",description:"Chapter ini merupakan kelanjutan dari chapter sebelumnya tentang pembahasan topic error. Kali ini fokus kita lebih ke recoverable error dan penanganannya (error handling / error propagation).",source:"@site/docs/basic/recoverable-error-handling.md",sourceDirName:"basic",slug:"/basic/recoverable-error-handling",permalink:"/basic/recoverable-error-handling",draft:!1,tags:[],version:"current",sidebarPosition:55,frontMatter:{sidebar_position:55,title:"A.55. Error \u279c Recoverable Error & Error Handling",sidebar_label:"A.55. Error \u279c Recoverable Error & Error Handling"},sidebar:"tutorialSidebar",previous:{title:"A.54. Error \u279c Unrecoverable Error / Panic",permalink:"/basic/unrecoverable-panic-error"}},m={},u=[{value:"A.55.1. Praktik membuat program file manager",id:"a551-praktik-membuat-program-file-manager",level:2},{value:"\u25c9 Deklarasi konstanta, command, dan validasi command",id:"-deklarasi-konstanta-command-dan-validasi-command",level:3},{value:"\u25c9 Fungsi utilitas pembacaan inputan user & flush stdout",id:"-fungsi-utilitas-pembacaan-inputan-user--flush-stdout",level:3},{value:"\u25c9 Kontrol flow program",id:"-kontrol-flow-program",level:3},{value:"\u25c9 Action Command::PrintFiles",id:"-action-commandprintfiles",level:3},{value:"\u25c9 Action Command::CreateFile",id:"-action-commandcreatefile",level:3},{value:"\u25c9 Action Command::ReadFile",id:"-action-commandreadfile",level:3},{value:"\u25c9 Action Command::DeleteFile",id:"-action-commanddeletefile",level:3},{value:"\u25c9 Action Command::ExitProgram",id:"-action-commandexitprogram",level:3},{value:"A.55.2. Test program",id:"a552-test-program",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:u};function p(e){let{components:a,...i}=e;return(0,t.kt)("wrapper",(0,r.Z)({},d,i,{components:a,mdxType:"MDXLayout"}),(0,t.kt)("p",null,"Chapter ini merupakan kelanjutan dari chapter sebelumnya tentang pembahasan topic error. Kali ini fokus kita lebih ke ",(0,t.kt)("strong",{parentName:"p"},"recoverable error")," dan penanganannya (",(0,t.kt)("em",{parentName:"p"},"error handling")," / ",(0,t.kt)("em",{parentName:"p"},"error propagation"),")."),(0,t.kt)("p",null,"Best practice penanganan error di Rust adalah dengan mengkombinasikan keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"match")," dengan tipe data ",(0,t.kt)("inlineCode",{parentName:"p"},"Result"),". Untuk penerapannya sendiri sebenarnya sudah cukup sering dipraktikan di chapter-chapter sebelumnya."),(0,t.kt)("p",null,"Pada chapter ini pembelajaran dilakukan dengan lebih banyak menulis kode (",(0,t.kt)("em",{parentName:"p"},"coding"),"), dengan ini penulis harapkan pembaca bisa terbiasa dan nyaman dengan gaya penanganan error di Rust."),(0,t.kt)("h2",{id:"a551-praktik-membuat-program-file-manager"},"A.55.1. Praktik membuat program ",(0,t.kt)("strong",{parentName:"h2"},"file manager")),(0,t.kt)("p",null,"Program yang akan dibuat skalanya lebih besar dibanding program pada praktik-praktik sebelumnya. Program ",(0,t.kt)("strong",{parentName:"p"},"file manager")," ini kita akan buat dari 0, kegunaannya adalah untuk mempermudah manajemen file seperti pembuatan file, pembacaan file, dan operasi file lainnya."),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Pastikan untuk mempelajari beberapa chapter berikut sebelum memulai pembelajaran"),(0,t.kt)("ul",{parentName:"blockquote"},(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/module-basic"},"Module System \u279c Module")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/file-path-directory"},"File, Path, Directory")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/unrecoverable-panic-error"},"Error \u279c Unrecoverable Error / Panic")))),(0,t.kt)("p",null,"Ok, sekarang siapkan sebuah package atau project terlebih dahulu, dengan struktur seperti ini:"),(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},"file_manager\n\u2502\u2500\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500\u2500 src\n \u2502\u2500\u2500\u2500 file_action_constant.rs\n \u2502\u2500\u2500\u2500 file_manager.rs\n \u2502\u2500\u2500\u2500 file_utility.rs\n \u2514\u2500\u2500\u2500 main.rs\n")),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"File ",(0,t.kt)("inlineCode",{parentName:"li"},"file_action_constant.rs")," akan diisi dengan deklarasi konstanta base path, enum action/command, dan fungsi validasi command."),(0,t.kt)("li",{parentName:"ul"},"File ",(0,t.kt)("inlineCode",{parentName:"li"},"file_manager.rs")," akan diisi dengan ",(0,t.kt)("em",{parentName:"li"},"business process")," program file manager."),(0,t.kt)("li",{parentName:"ul"},"File ",(0,t.kt)("inlineCode",{parentName:"li"},"file_utility.rs")," akan diisi dengan beberapa fungsi utilitas seperti operasi baca inputan user."),(0,t.kt)("li",{parentName:"ul"},"File ",(0,t.kt)("inlineCode",{parentName:"li"},"main.rs")," berisi kontrol alur eksekusi program.")),(0,t.kt)("h3",{id:"-deklarasi-konstanta-command-dan-validasi-command"},"\u25c9 Deklarasi konstanta, command, dan validasi command"),(0,t.kt)("p",null,"Deklarasikan beberapa hal berikut pada file ",(0,t.kt)("inlineCode",{parentName:"p"},"file_action_constant.rs"),":"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Konstanta ",(0,t.kt)("inlineCode",{parentName:"li"},"FOLDER_BASEPATH"),". Nantinya digunakan sebagai basepath operasi program file manager ini."),(0,t.kt)("li",{parentName:"ul"},"Enum ",(0,t.kt)("inlineCode",{parentName:"li"},"Command"),", berisi action yang tersedia seperti ",(0,t.kt)("inlineCode",{parentName:"li"},"PrintFiles"),", ",(0,t.kt)("inlineCode",{parentName:"li"},"CreateFile"),", dan lainnya."),(0,t.kt)("li",{parentName:"ul"},"Fungsi validasi command.")),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="./src/file_action_constant.rs"',title:'"./src/file_action_constant.rs"'},'pub const FOLDER_BASEPATH: &str = "./files";\n\npub enum Command {\n PrintFiles,\n CreateFile,\n ReadFile,\n DeleteFile,\n ExitProgram,\n}\n\npub fn validate_command(cmd: &str) -> Result {\n match cmd {\n "1" => Ok(Command::PrintFiles),\n "2" => Ok(Command::CreateFile),\n "3" => Ok(Command::ReadFile),\n "4" => Ok(Command::DeleteFile),\n "9" => Ok(Command::ExitProgram),\n _ => Err("unrecognized command")\n }\n}\n')),(0,t.kt)("p",null,"Dari kode di atas terlihat bahwa program akan berisi setidaknya 5 buah action (termasuk ",(0,t.kt)("inlineCode",{parentName:"p"},"ExitProgram"),")."),(0,t.kt)("h3",{id:"-fungsi-utilitas-pembacaan-inputan-user--flush-stdout"},"\u25c9 Fungsi utilitas pembacaan inputan user & flush stdout"),(0,t.kt)("p",null,"Siapkan 2 fungsi I/O berikut:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"read_entry()")," untuk membaca inputan user, lalu mengembalikannya dalam bentuk ",(0,t.kt)("inlineCode",{parentName:"li"},"Result")," dimana ",(0,t.kt)("inlineCode",{parentName:"li"},"T")," berisi inputan user dan ",(0,t.kt)("inlineCode",{parentName:"li"},"E")," berisi informasi error dalam bentuk ",(0,t.kt)("inlineCode",{parentName:"li"},"String")," (jika ada error)."),(0,t.kt)("li",{parentName:"ul"},"Fungsi ",(0,t.kt)("inlineCode",{parentName:"li"},"stdout_flush()")," untuk mem-flush output ",(0,t.kt)("strong",{parentName:"li"},"stdout"),". Ini penting karena ",(0,t.kt)("em",{parentName:"li"},"default"),"-nya Rust mem-",(0,t.kt)("em",{parentName:"li"},"buffer")," stdout.")),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="./src/file_utility.rs"',title:'"./src/file_utility.rs"'},"use std::io;\nuse std::io::Write;\n\npub fn read_entry() -> Result {\n let mut message = String::new();\n let reader_res = io::stdin().read_line(&mut message);\n\n // error handling using guard method\n let content = match reader_res {\n Ok(_) => message.trim().to_string(),\n Err(err) => {\n return Err(err.to_string())\n }\n };\n\n return Ok(content)\n}\n\npub fn stdout_flush() -> Result<(), String> {\n\n // error handling using basic implementation of keyword match\n match io::stdout().flush() {\n Err(err) => Err(err.to_string()),\n Ok(()) => Ok(())\n }\n}\n")),(0,t.kt)("p",null,"Di kode di atas kita sudah mulai mengimplementasikan operasi ",(0,t.kt)("strong",{parentName:"p"},"error handling")," di Rust, caranya cukup mudah bukan? Tinggal masukan saja data bertipe ",(0,t.kt)("inlineCode",{parentName:"p"},"Result")," ke keyword ",(0,t.kt)("inlineCode",{parentName:"p"},"match"),". Untuk penerapan keyword tersebut bisa dilakukan dengan cara konvensional, metode guard, atau lainnya."),(0,t.kt)("h3",{id:"-kontrol-flow-program"},"\u25c9 Kontrol flow program"),(0,t.kt)("p",null,"Lanjut ke bagian kontrol eksekusi alur program. Program didesain berjalan secara kontinyu (non-stop) sampai user memilih command ",(0,t.kt)("inlineCode",{parentName:"p"},"ExitProgram"),". Di setiap perulangan, nantinya user bisa menentukan action apa yang dipilih."),(0,t.kt)("p",null,"Buka file ",(0,t.kt)("inlineCode",{parentName:"p"},"main.rs"),", buat fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_program()"),". Fungsi ini mengembalikan tipe data bernotasi ",(0,t.kt)("inlineCode",{parentName:"p"},"Result<(), String>"),". Notasi ini penulis jadikan sebagai notasi utama untuk fungsi-fungsi yang berpotensi mengembalikan error."),(0,t.kt)("p",null,"Di dalam fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_program()"),", terdapat perulangan dengan isi beberapa hal berikut secara berurutan."),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Memunculkan output pilihan command"),(0,t.kt)("li",{parentName:"ol"},"Flush stdout"),(0,t.kt)("li",{parentName:"ol"},"Baca inputan user"),(0,t.kt)("li",{parentName:"ol"},"Validasi inputan user"),(0,t.kt)("li",{parentName:"ol"},"Eksekusi action/command",(0,t.kt)("ul",{parentName:"li"},(0,t.kt)("li",{parentName:"ul"},"Command ",(0,t.kt)("inlineCode",{parentName:"li"},"PrintFiles"),": munculkan semua file yang sudah dibuat."),(0,t.kt)("li",{parentName:"ul"},"Command ",(0,t.kt)("inlineCode",{parentName:"li"},"CreateFile"),": program meminta inputan nama file dan kontennya, untuk kemudian dibuatkan filenya."),(0,t.kt)("li",{parentName:"ul"},"Command ",(0,t.kt)("inlineCode",{parentName:"li"},"ReadFile"),": baca file sesuai inputan nama file."),(0,t.kt)("li",{parentName:"ul"},"Command ",(0,t.kt)("inlineCode",{parentName:"li"},"DeleteFile"),": operasi hapus file."),(0,t.kt)("li",{parentName:"ul"},"Command ",(0,t.kt)("inlineCode",{parentName:"li"},"ExitProgram"),": keluar program.")))),(0,t.kt)("p",null,"Source code lengkap ",(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 file_action_constant;\nmod file_manager;\nmod file_utility;\n\nfn run_program() -> Result<(), String> {\n println!("Welcome to file maker app!");\n\n loop {\n println!();\n println!("Available command:");\n println!("1. Print files");\n println!("2. Create file");\n println!("3. Read file");\n println!("4. Delete file");\n println!("9. Exit");\n\n println!();\n print!("Enter your command: ");\n\n // error handling using operator ?\n let _ = file_utility::stdout_flush()?;\n\n // error handling using guard method\n let user_entry = match file_utility::read_entry() {\n Err(err) => {\n println!("ERROR. unable to continue the program. {}", err);\n continue;\n },\n Ok(txt) => txt,\n };\n\n // error handling using basic implementation of keyword match\n let cmd_result = file_action_constant::validate_command(&user_entry);\n match cmd_result {\n Err(err) => {\n println!("ERROR. {}", err);\n continue;\n },\n _ => {}\n };\n let cmd = cmd_result.unwrap();\n\n // check command\n match cmd {\n file_action_constant::Command::PrintFiles => {\n // error handling using operator ?\n file_manager::print_files()?;\n },\n file_action_constant::Command::CreateFile => {\n // error handling using operator ?\n file_manager::create_file()?;\n },\n file_action_constant::Command::ReadFile => {\n // error handling using operator ?\n file_manager::read_file()?;\n },\n file_action_constant::Command::DeleteFile => {\n // error handling using operator ?\n file_manager::delete_file()?;\n },\n file_action_constant::Command::ExitProgram => {\n println!("Exiting program ...");\n return Ok(());\n },\n }\n }\n}\n\nfn main() {\n // error handling using basic implementation of keyword match\n match run_program() {\n Err(err) => panic!("ERRROR {:?}", err),\n Ok(_) => {}\n }\n}\n')),(0,t.kt)("p",null,"Bisa dilihat di kode di atas, ada beberapa metode error handling yang diterapkan."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Error handling menggunakan metode guard diterapkan saat pembacaan inputan user."),(0,t.kt)("li",{parentName:"ul"},"Error handling menggunakan implementasi standar keyword ",(0,t.kt)("inlineCode",{parentName:"li"},"match")," dan tipe ",(0,t.kt)("inlineCode",{parentName:"li"},"Result")," digunakan saat validasi command."),(0,t.kt)("li",{parentName:"ul"},"Error handling menggunakan operator ",(0,t.kt)("inlineCode",{parentName:"li"},"?")," digunakan saat flush stdout dan eksekusi command.")),(0,t.kt)("blockquote",null,(0,t.kt)("p",{parentName:"blockquote"},"Silakan mengintip kembali chapter ",(0,t.kt)("a",{parentName:"p",href:"/basic/operator-tanda-tanya"},"Operator ?")," jika diperlukan untuk mengingat kembali cara kerja operator ",(0,t.kt)("inlineCode",{parentName:"p"},"?"),".")),(0,t.kt)("p",null,"Metode error handling menggunakan operator ",(0,t.kt)("inlineCode",{parentName:"p"},"?")," sengaja diterapkan pada bagian flush stdout dan eksekusi command. Karena di dalam domain tersebut, ketika ada error maka error-nya pasti berhubungan dengan I/O dan permission di level sistim operasi (OS) yang dimana kita tidak bisa menangani error tersebut dari level program yang sedang dibuat. Oleh karena itu operator ",(0,t.kt)("inlineCode",{parentName:"p"},"?")," digunakan. Dengannya, maka error-error tersebut akan membuat eksekusi program terhenti secara total dan error dimunculkan sebelum program terhenti karena oleh panic error."),(0,t.kt)("h3",{id:"-action-commandprintfiles"},"\u25c9 Action ",(0,t.kt)("inlineCode",{parentName:"h3"},"Command::PrintFiles")),(0,t.kt)("p",null,"Action ",(0,t.kt)("inlineCode",{parentName:"p"},"PrintFiles")," melakukan pengecekan pembuatan folder ",(0,t.kt)("inlineCode",{parentName:"p"},"FOLDER_BASEPATH")," (jika belum ada), dan menampilkan list file di dalam folder tersebut. Jika tidak ada file, pesan ",(0,t.kt)("inlineCode",{parentName:"p"},"No files")," dimunculkan ke layar."),(0,t.kt)("p",null,"Tulis kode berikut di file ",(0,t.kt)("inlineCode",{parentName:"p"},"file_manager.rs"),"."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="./src/file_manager.rs"',title:'"./src/file_manager.rs"'},'use crate::file_action_constant;\nuse crate::file_utility;\n\nuse std::path::Path;\nuse std::fs;\n\npub fn print_files() -> Result<(), String> {\n let path = Path::new(file_action_constant::FOLDER_BASEPATH);\n\n // if files folder not exists, create it\n if !path.is_dir() {\n\n // error handling using basic implementation of keyword match\n match fs::create_dir(path) {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(_) => {},\n }\n }\n\n // error handling using guard method\n let dir = match fs::read_dir(path) {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(entry) => entry,\n };\n\n let mut count = 0;\n for file in dir {\n count = count + 1;\n\n // error handling using basic implementation of keyword match\n match file {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(entry) => {\n println!(" -> {:?}", entry.path());\n }\n }\n };\n\n if count == 0 {\n println!("No files");\n }\n\n Ok(())\n}\n\n// ...\n')),(0,t.kt)("p",null,"Dari kode di atas terlihat operasi error propagation dilakukan 3 kali yaitu ketika:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Pembuatan folder ",(0,t.kt)("inlineCode",{parentName:"li"},"FOLDER_BASEPATH")," (ketika folder belum ada)."),(0,t.kt)("li",{parentName:"ul"},"Pembacaan isi folder."),(0,t.kt)("li",{parentName:"ul"},"Menampilkan nama file dalam folder.")),(0,t.kt)("h3",{id:"-action-commandcreatefile"},"\u25c9 Action ",(0,t.kt)("inlineCode",{parentName:"h3"},"Command::CreateFile")),(0,t.kt)("p",null,"Masih di file yang sama (",(0,t.kt)("inlineCode",{parentName:"p"},"file_manager.rs"),") tambahkan kode untuk handle action pembuatan file berikut."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="./src/file_manager.rs"',title:'"./src/file_manager.rs"'},'// ...\n\npub fn create_file() -> Result<(), String> {\n let path = Path::new(file_action_constant::FOLDER_BASEPATH);\n\n print!("Enter filename: ");\n \n // error handling using operator ?\n let _ = file_utility::stdout_flush()?;\n\n // error handling using guard method\n let filename = match file_utility::read_entry() {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(txt) => txt,\n };\n\n print!("Enter file content: ");\n \n // error handling using operator ?\n let _ = file_utility::stdout_flush()?;\n\n // error handling using guard method\n let content = match file_utility::read_entry() {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(txt) => txt,\n };\n\n // error handling using basic implementation of keyword match\n match fs::write(path.join(filename), content) {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(()) => {},\n }\n \n Ok(())\n}\n')),(0,t.kt)("p",null,"Handler ini berisi interaksi I/O dengan user 2 kali:"),(0,t.kt)("ol",null,(0,t.kt)("li",{parentName:"ol"},"Program meminta inputan user untuk dijadikan nama file."),(0,t.kt)("li",{parentName:"ol"},"Program meminta lagi inputan untuk isi konten file.")),(0,t.kt)("p",null,"Perihal error handler-nya sendiri juga ada beberapa:"),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},"Karena terdapat operasi I/O, maka flush stdout perlu dipanggil. Dalam pemanggilannya, metode error handler menggunakan operator ",(0,t.kt)("inlineCode",{parentName:"li"},"?")," dipakai.",(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"let _ = file_utility::stdout_flush()?;\n"))),(0,t.kt)("li",{parentName:"ul"},"Ketika baca inputan user untuk nama file dan konten file",(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"let filename = match file_utility::read_entry() { ... };\nlet content = match file_utility::read_entry() { ... };\n"))),(0,t.kt)("li",{parentName:"ul"},"Ketika file dibuat (operasi write file)",(0,t.kt)("pre",{parentName:"li"},(0,t.kt)("code",{parentName:"pre",className:"language-rust"},"match fs::write(path.join(filename), content) { ... }\n")))),(0,t.kt)("h3",{id:"-action-commandreadfile"},"\u25c9 Action ",(0,t.kt)("inlineCode",{parentName:"h3"},"Command::ReadFile")),(0,t.kt)("p",null,"Operasi baca file dilakukan dengan melibatkan I/O dengan user. User dimintai inputan nama file, kemudian file tersebut ditampilkan isinya. Jika ada error saat baca file (yang besar kemungkinan disebabkan oleh file yang dicari tidak ditemukan), pesan errornya kemudian dimunculkan."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="./src/file_manager.rs"',title:'"./src/file_manager.rs"'},'// ...\n\npub fn read_file() -> Result<(), String> {\n let path = Path::new(file_action_constant::FOLDER_BASEPATH);\n\n print!("Enter filename: ");\n \n // error handling using operator ?\n let _ = file_utility::stdout_flush()?;\n\n // error handling using guard method\n let filename = match file_utility::read_entry() {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(txt) => txt,\n };\n\n // error handling using guard method\n let content = match fs::read_to_string(path.join(filename)) {\n Err(err) => {\n println!("ERROR. {:?}", err.to_string());\n return Ok(());\n },\n Ok(txt) => txt,\n };\n\n println!("File content: {:?}", content);\n\n Ok(())\n}\n')),(0,t.kt)("p",null,"Bisa dilihat pada statement baca file, ketika terjadi error, ",(0,t.kt)("inlineCode",{parentName:"p"},"Err()")," tidak dikembalikan, melainkan menggunakan ",(0,t.kt)("inlineCode",{parentName:"p"},"Ok()"),". Ini penting karena jika ",(0,t.kt)("inlineCode",{parentName:"p"},"Err()")," digunakan di situ, membuat eksekusi fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_program()")," terhenti secara paksa karena fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"read_file()")," (dan fungsi handler command lainnya) dipanggil dengan disertai operator ",(0,t.kt)("inlineCode",{parentName:"p"},"?"),"."),(0,t.kt)("p",null,"Yang kita lakukan disini adalah memunculkan pesan errornya ke layar secara ",(0,t.kt)("em",{parentName:"p"},"friendly"),", agar program tetap bisa running sesuai flow."),(0,t.kt)("h3",{id:"-action-commanddeletefile"},"\u25c9 Action ",(0,t.kt)("inlineCode",{parentName:"h3"},"Command::DeleteFile")),(0,t.kt)("p",null,"Operasi baca file juga melibatkan 1 kali interaksi I/O dengan user. File yang namanya di-input oleh user akan dihapus."),(0,t.kt)("pre",null,(0,t.kt)("code",{parentName:"pre",className:"language-rust",metastring:'title="./src/file_manager.rs"',title:'"./src/file_manager.rs"'},'// ...\n\npub fn delete_file() -> Result<(), String> {\n let path = Path::new(file_action_constant::FOLDER_BASEPATH);\n\n print!("Enter filename: ");\n \n // error handling using operator ?\n let _ = file_utility::stdout_flush()?;\n\n // error handling using guard method\n let filename = match file_utility::read_entry() {\n Err(err) => {\n return Err(err.to_string());\n },\n Ok(txt) => txt,\n };\n\n // error handling using basic implementation of keyword match\n match fs::remove_file(path.join(filename)) {\n Err(err) => {\n println!("ERROR. {:?}", err.to_string());\n return Ok(());\n },\n Ok(_) => {\n println!("File deleted");\n },\n };\n\n Ok(())\n}\n')),(0,t.kt)("p",null,"Error yang berpotensi muncul saat penghapusan file dimunculkan ke layar tanpa menandai pemanggilan fungsi sebagai error, agar flow program tetap berjalan."),(0,t.kt)("h3",{id:"-action-commandexitprogram"},"\u25c9 Action ",(0,t.kt)("inlineCode",{parentName:"h3"},"Command::ExitProgram")),(0,t.kt)("p",null,"Handler command exit program sudah ditulis di blok fungsi ",(0,t.kt)("inlineCode",{parentName:"p"},"run_program()"),"."),(0,t.kt)("h2",{id:"a552-test-program"},"A.55.2. Test program"),(0,t.kt)("p",null,"Ok, bagian tulis menulis kode sudah selesai. Lanjut ke fase testing. Jalankan program, pilih beberapa command, test keseluruhan fungsinya."),(0,t.kt)("ul",null,(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Testing pertama, munculkan files menggunakan command ",(0,t.kt)("inlineCode",{parentName:"p"},"1 Print files"),"."),(0,t.kt)("p",{parentName:"li"}," ",(0,t.kt)("img",{alt:"Recoverable Error & Error Handling",src:n(7201).Z,width:"637",height:"291"}))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Testing ke-2, buat file baru, cek keberadaan filenya, lalu munculkan isinya."),(0,t.kt)("p",{parentName:"li"}," ",(0,t.kt)("img",{alt:"Recoverable Error & Error Handling",src:n(6993).Z,width:"637",height:"673"}))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Testing ke-3, hapus file yang telah dibuat, lalu cek lagi file yang ada."),(0,t.kt)("p",{parentName:"li"}," ",(0,t.kt)("img",{alt:"Recoverable Error & Error Handling",src:n(8669).Z,width:"637",height:"243"}))),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("p",{parentName:"li"},"Testing ke-4, exit program."),(0,t.kt)("p",{parentName:"li"}," ",(0,t.kt)("img",{alt:"Recoverable Error & Error Handling",src:n(3610).Z,width:"637",height:"181"})))),(0,t.kt)("p",null,"Hasilnya, mantab."),(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/recoverable_error_handling"},"github.com/novalagung/dasarpemrogramanrust-example/../recoverable_error_handling")),(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/module-basic"},"Module System \u279c Module")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/result-type"},"Tipe Data \u279c Result")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/operator-tanda-tanya"},"Operator ?")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/pattern-matching"},"Pattern Matching")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/file-path-directory"},"File, Path, Directory")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"/basic/unrecoverable-panic-error"},"Error \u279c Unrecoverable Error / Panic"))),(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/ch09-01-unrecoverable-errors-with-panic.html"},"https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html")),(0,t.kt)("li",{parentName:"ul"},(0,t.kt)("a",{parentName:"li",href:"https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html"},"https://doc.rust-lang.org/book/ch09-03-to-panic-or-not-to-panic.html"))))}p.isMDXComponent=!0},7201:(e,a,n)=>{n.d(a,{Z:()=>r});const r=n.p+"assets/images/recoverable-error-handling-1-a60b09beaa6803045688abcf2a1f4762.png"},6993:(e,a,n)=>{n.d(a,{Z:()=>r});const r=n.p+"assets/images/recoverable-error-handling-2-4bb5c6b2c2f3dcc0eb5029fb2ab09519.png"},8669:(e,a,n)=>{n.d(a,{Z:()=>r});const r=n.p+"assets/images/recoverable-error-handling-3-9ac2af92e26692ae7be26b9c2a06ed71.png"},3610:(e,a,n)=>{n.d(a,{Z:()=>r});const r="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAn0AAAC1CAIAAAClNd5qAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGlmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDEgNzkuMTQ2Mjg5OSwgMjAyMy8wNi8yNS0yMDowMTo1NSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0RXZ0PSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VFdmVudCMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyNC0wNy0zMVQxNzo0NjoyNCswNzowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjQtMDctMzFUMTg6MDQ6MTgrMDc6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjQtMDctMzFUMTg6MDQ6MTgrMDc6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjE0NDI3NThhLTE2YWItM2Q0OC1hZGUzLWFiYmZmODU3MzZkOCIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOmViYTI1ZWViLTBjNTktOGE0Yi1hMjFjLTJhY2M2ZjYyZWQ1NSIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjU4ZTI1M2U3LTA3YjAtZmU0Mi1iM2EyLWM4NzRiMWIxNjk2OCI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NThlMjUzZTctMDdiMC1mZTQyLWIzYTItYzg3NGIxYjE2OTY4IiBzdEV2dDp3aGVuPSIyMDI0LTA3LTMxVDE3OjQ2OjI0KzA3OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjUuMCAoV2luZG93cykiLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOmIxZDNhZGNmLThkNDgtNDk0Ni1iZTNiLTUyNmUwYjRkZjNkZSIgc3RFdnQ6d2hlbj0iMjAyNC0wNy0zMVQxNzo0OToyOCswNzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDI1LjAgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxNDQyNzU4YS0xNmFiLTNkNDgtYWRlMy1hYmJmZjg1NzM2ZDgiIHN0RXZ0OndoZW49IjIwMjQtMDctMzFUMTg6MDQ6MTgrMDc6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNS4wIChXaW5kb3dzKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz5jo9TPAAAZ7ElEQVR4nO3df1BUZ57v8W+LYjThJhQGvdebezVQosaygqvZXC5ThS7ZTFKn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"}}]); \ No newline at end of file diff --git a/assets/js/main.0f82894c.js b/assets/js/main.0f82894c.js new file mode 100644 index 00000000..da64bbeb --- /dev/null +++ b/assets/js/main.0f82894c.js @@ -0,0 +1,2 @@ +/*! For license information please see main.0f82894c.js.LICENSE.txt */ +(self.webpackChunkdasarpemrogramanrust=self.webpackChunkdasarpemrogramanrust||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(7294);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"016a0787":[()=>n.e(274).then(n.bind(n,1854)),"@site/docs/basic/basic-memory-management.md",1854],"04da11da":[()=>n.e(3007).then(n.bind(n,7019)),"@site/docs/basic/perulangan-loop-break-continue-label.md",7019],"05cc1716":[()=>n.e(6477).then(n.bind(n,9810)),"@site/docs/basic/seleksi-kondisi-if.md",9810],"0ae704f7":[()=>n.e(2089).then(n.bind(n,5444)),"@site/docs/basic/pointer-references.md",5444],"0e6b6dd1":[()=>n.e(7949).then(n.t.bind(n,3769,19)),"/home/runner/work/dasarpemrogramanrust/dasarpemrogramanrust/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],"164327b9":[()=>n.e(3306).then(n.t.bind(n,7085,19)),"/home/runner/work/dasarpemrogramanrust/dasarpemrogramanrust/.docusaurus/docusaurus-theme-search-algolia/default/plugin-route-context-module-100.json",7085],17896441:[()=>Promise.all([n.e(532),n.e(205),n.e(7918)]).then(n.bind(n,718)),"@theme/DocItem",718],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,6675)),"@theme/SearchPage",6675],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,2868)),"@theme/DocPage",2868],"2452d5f5":[()=>n.e(5989).then(n.bind(n,831)),"@site/docs/basic/type-alias-casting.md",831],"2bc2e36b":[()=>n.e(620).then(n.bind(n,8283)),"@site/docs/basic/pattern-matching.md",8283],"388041ab":[()=>n.e(1494).then(n.bind(n,395)),"@site/docs/basic/unrecoverable-panic-error.md",395],"3aa512bf":[()=>n.e(7386).then(n.bind(n,7495)),"@site/docs/basic/module-inline.md",7495],"3b1dfe68":[()=>n.e(6161).then(n.bind(n,4008)),"@site/docs/basic/visibility-privacy.md",4008],"3d2f5b0c":[()=>n.e(676).then(n.bind(n,5569)),"@site/docs/basic/operator-tanda-tanya.md",5569],"4232c3ed":[()=>n.e(8308).then(n.bind(n,1597)),"@site/docs/basic/enum.md",1597],"4513d9f5":[()=>n.e(5729).then(n.bind(n,2589)),"@site/docs/basic/slice-memory-management.md",2589],"475d163e":[()=>n.e(6403).then(n.bind(n,6889)),"@site/docs/basic/perulangan-while.md",6889],"48e2ebd6":[()=>n.e(2359).then(n.bind(n,611)),"@site/src/pages/intro.js",611],"496dcc30":[()=>n.e(4738).then(n.bind(n,4547)),"@site/docs/basic/hello-rust.md",4547],"4c7e7ada":[()=>n.e(2706).then(n.bind(n,5442)),"@site/docs/basic/module-basic.md",5442],"5925ce9f":[()=>n.e(9831).then(n.bind(n,3121)),"@site/docs/basic/generics.md",3121],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"5f289fb7":[()=>n.e(2870).then(n.bind(n,4950)),"@site/docs/basic/attributes.md",4950],"62b99870":[()=>n.e(1422).then(n.bind(n,1569)),"@site/docs/basic/slice.md",1569],"68e1906b":[()=>n.e(4758).then(n.bind(n,7630)),"@site/docs/basic/method.md",7630],"68ec37cc":[()=>n.e(2959).then(n.bind(n,3275)),"@site/docs/basic/static.md",3275],71880105:[()=>n.e(5758).then(n.bind(n,3548)),"@site/docs/basic/perulangan-for-in.md",3548],"7390b81e":[()=>n.e(4274).then(n.bind(n,6981)),"@site/docs/basic/package-crate.md",6981],"742a9bdc":[()=>n.e(7988).then(n.bind(n,8046)),"@site/docs/basic/advanced-traits.md",8046],"7794a932":[()=>n.e(8358).then(n.bind(n,6682)),"@site/docs/basic/result-type.md",6682],"7a2568c4":[()=>n.e(4197).then(n.bind(n,6425)),"@site/docs/basic/build-dan-run-program-rust.md",6425],"7d03ccaf":[()=>n.e(1059).then(n.bind(n,2409)),"@site/docs/pengelanan-rust-programming.md",2409],"82a9b669":[()=>n.e(3257).then(n.bind(n,1958)),"@site/docs/basic/trait-iterator.md",1958],"8333c691":[()=>n.e(4248).then(n.bind(n,9739)),"@site/docs/basic/ownership.md",9739],"8333ea4d":[()=>n.e(9323).then(n.bind(n,7485)),"@site/docs/basic/tuple.md",7485],"87499f15":[()=>n.e(7742).then(n.bind(n,67)),"@site/docs/basic/variabel.md",67],"8ad68633":[()=>n.e(2399).then(n.bind(n,1606)),"@site/docs/LICENSE.md",1606],"8b55bf27":[()=>n.e(9886).then(n.bind(n,5877)),"@site/docs/basic/tipe-data-custom-type-string-slice.md",5877],"8d193b98":[()=>n.e(7505).then(n.bind(n,676)),"@site/docs/CONTRIBUTING.md",676],"8e991452":[()=>n.e(2107).then(n.bind(n,9484)),"@site/docs/download-pdf.md",9484],"93422b31":[()=>n.e(8469).then(n.bind(n,1704)),"@site/docs/basic/struct.md",1704],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9a3629a6":[()=>n.e(7865).then(n.bind(n,8472)),"@site/docs/basic/file-path-directory.md",8472],"9e6fe7cf":[()=>n.e(623).then(n.bind(n,2508)),"@site/docs/installation/instalasi-rust.md",2508],"9ed3ab78":[()=>n.e(1591).then(n.bind(n,7284)),"@site/docs/basic/recoverable-error-handling.md",7284],a2bea3ed:[()=>n.e(6345).then(n.bind(n,1099)),"@site/docs/basic/string-slice-vs-string-literal.md",1099],af6aab29:[()=>n.e(8794).then(n.bind(n,1468)),"@site/docs/basic/datetime.md",1468],b28a365a:[()=>n.e(6794).then(n.bind(n,7356)),"@site/docs/basic/block-expression.md",7356],b97d8256:[()=>n.e(4790).then(n.bind(n,232)),"@site/docs/basic/komentar.md",232],bc4edc5c:[()=>n.e(4452).then(n.bind(n,129)),"@site/docs/basic/closures.md",129],bd9b9d52:[()=>n.e(909).then(n.bind(n,5943)),"@site/docs/basic/tipe-data-primitive-scalar.md",5943],bdfc7662:[()=>n.e(7720).then(n.bind(n,2486)),"@site/docs/basic/associated-function.md",2486],be3f5c40:[()=>n.e(5572).then(n.bind(n,4387)),"@site/docs/basic/module-scope-item-access.md",4387],c01cce30:[()=>n.e(6531).then(n.bind(n,231)),"@site/docs/basic/konstanta.md",231],c377a04b:[()=>n.e(6971).then(n.bind(n,1269)),"@site/docs/index.md",1269],c526a898:[()=>n.e(9157).then(n.bind(n,3024)),"@site/docs/basic/function.md",3024],c76cc2e3:[()=>n.e(4729).then(n.bind(n,6556)),"@site/docs/basic/vector.md",6556],cb962766:[()=>n.e(6691).then(n.bind(n,2900)),"@site/docs/basic/trait-function.md",2900],d47a3664:[()=>n.e(8784).then(n.t.bind(n,5745,19)),"/home/runner/work/dasarpemrogramanrust/dasarpemrogramanrust/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",5745],d8837387:[()=>n.e(4622).then(n.bind(n,8007)),"@site/docs/basic/tipe-data-string-literal.md",8007],dabee7bd:[()=>n.e(4943).then(n.bind(n,3296)),"@site/docs/basic/operator.md",3296],dadaca00:[()=>n.e(8051).then(n.bind(n,375)),"@site/docs/basic/array.md",375],db8ccf76:[()=>n.e(4861).then(n.bind(n,5443)),"@site/docs/basic/traits.md",5443],e4904969:[()=>n.e(8732).then(n.bind(n,4510)),"@site/docs/basic/option-type.md",4510],e7bd9b37:[()=>n.e(7539).then(n.bind(n,2079)),"@site/docs/basic/path-item.md",2079],eb2a6637:[()=>n.e(6388).then(n.bind(n,164)),"@site/docs/basic/use.md",164],f8d4e457:[()=>n.e(740).then(n.bind(n,8514)),"@site/docs/basic/lifetime.md",8514],fb18633e:[()=>n.e(7310).then(n.bind(n,5555)),"@site/docs/basic/borrowing.md",5555],fd4f5a0c:[()=>n.e(5751).then(n.bind(n,5445)),"@site/docs/installation/rust-editor-plugin.md",5445],fef7d16c:[()=>n.e(5673).then(n.bind(n,2043)),"@site/docs/basic/shadowing.md",2043]};function c(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var u=n(9670),d=n(226);function f(e,t){if("*"===e)return i()({loading:c,loader:()=>n.e(4972).then(n.bind(n,4972)),modules:["@theme/NotFound"],webpack:()=>[4972],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[`${e}-${t}`],f={},p=[],m=[],h=(0,u.Z)(o);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:c,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/intro",component:f("/intro","a5b"),exact:!0},{path:"/search",component:f("/search","fa3"),exact:!0},{path:"/",component:f("/","8fc"),routes:[{path:"/",component:f("/","98e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/advanced-traits",component:f("/basic/advanced-traits","88d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/array",component:f("/basic/array","354"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/associated-function",component:f("/basic/associated-function","a80"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/attributes",component:f("/basic/attributes","7d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/basic-memory-management",component:f("/basic/basic-memory-management","24e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/block-expression",component:f("/basic/block-expression","22b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/borrowing",component:f("/basic/borrowing","85f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/build-dan-run-program-rust",component:f("/basic/build-dan-run-program-rust","1a9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/closures",component:f("/basic/closures","98c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/datetime",component:f("/basic/datetime","b5e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/enum",component:f("/basic/enum","a0e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/file-path-directory",component:f("/basic/file-path-directory","020"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/function",component:f("/basic/function","c21"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/generics",component:f("/basic/generics","3f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/hello-rust",component:f("/basic/hello-rust","91f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/komentar",component:f("/basic/komentar","f72"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/konstanta",component:f("/basic/konstanta","758"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/lifetime",component:f("/basic/lifetime","ee9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/method",component:f("/basic/method","970"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/module-basic",component:f("/basic/module-basic","81c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/module-inline",component:f("/basic/module-inline","4f6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/module-scope-item-access",component:f("/basic/module-scope-item-access","b6b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/operator",component:f("/basic/operator","85d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/operator-tanda-tanya",component:f("/basic/operator-tanda-tanya","f6a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/option-type",component:f("/basic/option-type","c23"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/ownership",component:f("/basic/ownership","74d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/package-crate",component:f("/basic/package-crate","fce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/path-item",component:f("/basic/path-item","e90"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/pattern-matching",component:f("/basic/pattern-matching","45d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/perulangan-for-in",component:f("/basic/perulangan-for-in","c5f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/perulangan-loop-break-continue-label",component:f("/basic/perulangan-loop-break-continue-label","b52"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/perulangan-while",component:f("/basic/perulangan-while","011"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/pointer-references",component:f("/basic/pointer-references","dfd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/recoverable-error-handling",component:f("/basic/recoverable-error-handling","b06"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/result-type",component:f("/basic/result-type","c01"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/seleksi-kondisi-if",component:f("/basic/seleksi-kondisi-if","e3d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/shadowing",component:f("/basic/shadowing","5be"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/slice",component:f("/basic/slice","2c8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/slice-memory-management",component:f("/basic/slice-memory-management","6b3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/static",component:f("/basic/static","655"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/string-slice-vs-string-literal",component:f("/basic/string-slice-vs-string-literal","5e6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/struct",component:f("/basic/struct","392"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/tipe-data-custom-type-string-slice",component:f("/basic/tipe-data-custom-type-string-slice","384"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/tipe-data-primitive-scalar",component:f("/basic/tipe-data-primitive-scalar","18c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/tipe-data-string-literal",component:f("/basic/tipe-data-string-literal","788"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/trait-function",component:f("/basic/trait-function","ebd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/trait-iterator",component:f("/basic/trait-iterator","2f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/traits",component:f("/basic/traits","594"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/tuple",component:f("/basic/tuple","dfc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/type-alias-casting",component:f("/basic/type-alias-casting","dbf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/unrecoverable-panic-error",component:f("/basic/unrecoverable-panic-error","445"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/use",component:f("/basic/use","f71"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/variabel",component:f("/basic/variabel","21b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/vector",component:f("/basic/vector","4d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/basic/visibility-privacy",component:f("/basic/visibility-privacy","794"),exact:!0,sidebar:"tutorialSidebar"},{path:"/CONTRIBUTING",component:f("/CONTRIBUTING","93d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/download-pdf",component:f("/download-pdf","a82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/installation/instalasi-rust",component:f("/installation/instalasi-rust","e6a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/installation/rust-editor-plugin",component:f("/installation/rust-editor-plugin","a9b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/LICENSE",component:f("/LICENSE","67b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/pengelanan-rust-programming",component:f("/pengelanan-rust-programming","aab"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"*",component:f("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},9383:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(412);const s=[n(6657),n(2497),n(3310),n(8320),n(8049),n(6882)];var c=n(723),u=n(6775),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(5742),h=n(2263),g=n(4996),b=n(6668),v=n(833),y=n(4711),w=n(9727),E=n(3320),k=n(197);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,h.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function _(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,h.Z)(),a=function(){const{siteConfig:{url:e}}=(0,h.Z)(),{pathname:t}=(0,u.TH)();return e+(0,g.Z)(t)}(),o=t?`${n}${t}`:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function x(){const{i18n:{currentLocale:e}}=(0,h.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(_,null),r.createElement(S,null),r.createElement(k.Z,{tag:E.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const T=new Map;function C(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(c.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}var A=n(8934),N=n(8940);function O(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r;const a=(null==(r=t.default)?void 0:r[e])??t[e];return null==a?void 0:a(...n)}));return()=>a.forEach((e=>null==e?void 0:e()))}const L=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);null==n||n.scrollIntoView()}else window.scrollTo(0,0)}(n),O("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function I(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class P extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?O("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=O("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),I(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(L,{previousLocation:this.previousLocation,location:t},r.createElement(u.AW,{location:t,render:()=>e}))}}const R=P,M="docusaurus-base-url-issue-banner-container",D="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function B(e){return`\nwindow['${F}'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['${F}'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('${M}');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = ${JSON.stringify(function(e){return`\n

\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,B(e))),r.createElement("div",{id:M}))}function U(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,h.Z)(),{pathname:n}=(0,u.TH)();return t&&n===e?r.createElement($,null):null}function z(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:a,localeConfigs:o}}=(0,h.Z)(),i=(0,g.Z)(e),{htmlLang:l,direction:s}=o[a];return r.createElement(m.Z,null,r.createElement("html",{lang:l,dir:s}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),r.createElement("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&r.createElement("meta",{name:"robots",content:"noindex, nofollow"}),e&&r.createElement("link",{rel:"icon",href:i}))}var j=n(4763);function H(){const e=(0,d.H)(c.Z),t=(0,u.TH)();return r.createElement(j.Z,null,r.createElement(N.M,null,r.createElement(A.t,null,r.createElement(f,null,r.createElement(z,null),r.createElement(x,null),r.createElement(U,null),r.createElement(R,{location:C(t)},e)))))}var Z=n(6887);const G=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r;if("undefined"==typeof document)return void n();const a=document.createElement("link");a.setAttribute("rel","prefetch"),a.setAttribute("href",e),a.onload=()=>t(),a.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??(null==(r=document.getElementsByName("script")[0])?void 0:r.parentNode);null==o||o.appendChild(a)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var V=n(9670);const W=new Set,q=new Set,Y=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},K={prefetch(e){if(!(e=>!Y()&&!q.has(e)&&!W.has(e))(e))return!1;W.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(Z).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,V.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?G(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!q.has(e))(e)&&(q.add(e),I(e))},X=Object.freeze(K);if(l.Z.canUseDOM){window.docusaurus=X;const e=a.hydrate;I(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(H,null))),document.getElementById("__docusaurus"))}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>u,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":"G-HKPC8ZGM74","anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"index","docs":[{"id":"basic/advanced-traits","path":"/basic/advanced-traits","sidebar":"tutorialSidebar"},{"id":"basic/array","path":"/basic/array","sidebar":"tutorialSidebar"},{"id":"basic/associated-function","path":"/basic/associated-function","sidebar":"tutorialSidebar"},{"id":"basic/attributes","path":"/basic/attributes","sidebar":"tutorialSidebar"},{"id":"basic/basic-memory-management","path":"/basic/basic-memory-management","sidebar":"tutorialSidebar"},{"id":"basic/block-expression","path":"/basic/block-expression","sidebar":"tutorialSidebar"},{"id":"basic/borrowing","path":"/basic/borrowing","sidebar":"tutorialSidebar"},{"id":"basic/build-dan-run-program-rust","path":"/basic/build-dan-run-program-rust","sidebar":"tutorialSidebar"},{"id":"basic/closures","path":"/basic/closures","sidebar":"tutorialSidebar"},{"id":"basic/datetime","path":"/basic/datetime","sidebar":"tutorialSidebar"},{"id":"basic/enum","path":"/basic/enum","sidebar":"tutorialSidebar"},{"id":"basic/file-path-directory","path":"/basic/file-path-directory","sidebar":"tutorialSidebar"},{"id":"basic/function","path":"/basic/function","sidebar":"tutorialSidebar"},{"id":"basic/generics","path":"/basic/generics","sidebar":"tutorialSidebar"},{"id":"basic/hello-rust","path":"/basic/hello-rust","sidebar":"tutorialSidebar"},{"id":"basic/komentar","path":"/basic/komentar","sidebar":"tutorialSidebar"},{"id":"basic/konstanta","path":"/basic/konstanta","sidebar":"tutorialSidebar"},{"id":"basic/lifetime","path":"/basic/lifetime","sidebar":"tutorialSidebar"},{"id":"basic/method","path":"/basic/method","sidebar":"tutorialSidebar"},{"id":"basic/module-basic","path":"/basic/module-basic","sidebar":"tutorialSidebar"},{"id":"basic/module-inline","path":"/basic/module-inline","sidebar":"tutorialSidebar"},{"id":"basic/module-scope-item-access","path":"/basic/module-scope-item-access","sidebar":"tutorialSidebar"},{"id":"basic/operator","path":"/basic/operator","sidebar":"tutorialSidebar"},{"id":"basic/operator-tanda-tanya","path":"/basic/operator-tanda-tanya","sidebar":"tutorialSidebar"},{"id":"basic/option-type","path":"/basic/option-type","sidebar":"tutorialSidebar"},{"id":"basic/ownership","path":"/basic/ownership","sidebar":"tutorialSidebar"},{"id":"basic/package-crate","path":"/basic/package-crate","sidebar":"tutorialSidebar"},{"id":"basic/path-item","path":"/basic/path-item","sidebar":"tutorialSidebar"},{"id":"basic/pattern-matching","path":"/basic/pattern-matching","sidebar":"tutorialSidebar"},{"id":"basic/perulangan-for-in","path":"/basic/perulangan-for-in","sidebar":"tutorialSidebar"},{"id":"basic/perulangan-loop-break-continue-label","path":"/basic/perulangan-loop-break-continue-label","sidebar":"tutorialSidebar"},{"id":"basic/perulangan-while","path":"/basic/perulangan-while","sidebar":"tutorialSidebar"},{"id":"basic/pointer-references","path":"/basic/pointer-references","sidebar":"tutorialSidebar"},{"id":"basic/recoverable-error-handling","path":"/basic/recoverable-error-handling","sidebar":"tutorialSidebar"},{"id":"basic/result-type","path":"/basic/result-type","sidebar":"tutorialSidebar"},{"id":"basic/seleksi-kondisi-if","path":"/basic/seleksi-kondisi-if","sidebar":"tutorialSidebar"},{"id":"basic/shadowing","path":"/basic/shadowing","sidebar":"tutorialSidebar"},{"id":"basic/slice","path":"/basic/slice","sidebar":"tutorialSidebar"},{"id":"basic/slice-memory-management","path":"/basic/slice-memory-management","sidebar":"tutorialSidebar"},{"id":"basic/static","path":"/basic/static","sidebar":"tutorialSidebar"},{"id":"basic/string-slice-vs-string-literal","path":"/basic/string-slice-vs-string-literal","sidebar":"tutorialSidebar"},{"id":"basic/struct","path":"/basic/struct","sidebar":"tutorialSidebar"},{"id":"basic/tipe-data-custom-type-string-slice","path":"/basic/tipe-data-custom-type-string-slice","sidebar":"tutorialSidebar"},{"id":"basic/tipe-data-primitive-scalar","path":"/basic/tipe-data-primitive-scalar","sidebar":"tutorialSidebar"},{"id":"basic/tipe-data-string-literal","path":"/basic/tipe-data-string-literal","sidebar":"tutorialSidebar"},{"id":"basic/trait-function","path":"/basic/trait-function","sidebar":"tutorialSidebar"},{"id":"basic/trait-iterator","path":"/basic/trait-iterator","sidebar":"tutorialSidebar"},{"id":"basic/traits","path":"/basic/traits","sidebar":"tutorialSidebar"},{"id":"basic/tuple","path":"/basic/tuple","sidebar":"tutorialSidebar"},{"id":"basic/type-alias-casting","path":"/basic/type-alias-casting","sidebar":"tutorialSidebar"},{"id":"basic/unrecoverable-panic-error","path":"/basic/unrecoverable-panic-error","sidebar":"tutorialSidebar"},{"id":"basic/use","path":"/basic/use","sidebar":"tutorialSidebar"},{"id":"basic/variabel","path":"/basic/variabel","sidebar":"tutorialSidebar"},{"id":"basic/vector","path":"/basic/vector","sidebar":"tutorialSidebar"},{"id":"basic/visibility-privacy","path":"/basic/visibility-privacy","sidebar":"tutorialSidebar"},{"id":"CONTRIBUTING","path":"/CONTRIBUTING","sidebar":"tutorialSidebar"},{"id":"download-pdf","path":"/download-pdf","sidebar":"tutorialSidebar"},{"id":"index","path":"/","sidebar":"tutorialSidebar"},{"id":"installation/instalasi-rust","path":"/installation/instalasi-rust","sidebar":"tutorialSidebar"},{"id":"installation/rust-editor-plugin","path":"/installation/rust-editor-plugin","sidebar":"tutorialSidebar"},{"id":"LICENSE","path":"/LICENSE","sidebar":"tutorialSidebar"},{"id":"pengelanan-rust-programming","path":"/pengelanan-rust-programming","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/","label":"Dasar Pemrograman Rust"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"id","locales":["id"],"path":"i18n","currentLocale":"id","localeConfigs":{"id":{"label":"Indonesia","direction":"ltr","htmlLang":"id","calendar":"gregory","path":"id"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.2.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.2.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.2.0"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.2.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.2.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.2.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.2.0"},"docusaurus-plugin-structured-data":{"type":"package","name":"@stackql/docusaurus-plugin-structured-data","version":"1.3.1"}}}'),c={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},u=r.createContext(c);function d(e){let{children:t}=e;return r.createElement(u.Provider,{value:c},t)}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),a=n(412),o=n(5742),i=n(5705);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(u,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const c=e=>r.createElement(s,e);class u extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??c)(e)}return e??null}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},9960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(8780),l=n(2263),s=n(3919),c=n(412);const u=a.createContext({collectLink:()=>{}});var d=n(4996);function f(e,t){var n;let{isNavLink:f,to:p,href:m,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":b,autoAddBaseUrl:v=!0,...y}=e;const{siteConfig:{trailingSlash:w,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:k}=(0,d.C)(),S=(0,a.useContext)(u),_=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>_.current));const x=p||m;const T=(0,s.Z)(x),C=null==x?void 0:x.replace("pathname://","");let A=void 0!==C?(N=C,v&&(e=>e.startsWith("/"))(N)?k(N):N):void 0;var N;A&&T&&(A=(0,i.applyTrailingSlash)(A,{trailingSlash:w,baseUrl:E}));const O=(0,a.useRef)(!1),L=f?o.OL:o.rU,I=c.Z.canUseIntersectionObserver,P=(0,a.useRef)(),R=()=>{O.current||null==A||(window.docusaurus.preload(A),O.current=!0)};(0,a.useEffect)((()=>(!I&&T&&null!=A&&window.docusaurus.prefetch(A),()=>{I&&P.current&&P.current.disconnect()})),[P,A,I,T]);const M=(null==(n=A)?void 0:n.startsWith("#"))??!1,D=!A||!T||M;return D||b||S.collectLink(A),D?a.createElement("a",(0,r.Z)({ref:_,href:A},x&&!T&&{target:"_blank",rel:"noopener noreferrer"},y)):a.createElement(L,(0,r.Z)({},y,{onMouseEnter:R,onTouchStart:R,innerRef:e=>{_.current=e,I&&e&&T&&(P.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(P.current.unobserve(e),P.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),P.current.observe(e))},to:A},f&&{isActive:g,activeClassName:h}))}const p=a.forwardRef(f)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return o[t??n]??n??t}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>i});var r=n(2263),a=n(3919);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8940);function o(){return(0,r.useContext)(a._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8934);function o(){return(0,r.useContext)(a._)}},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[a,o]=n;const i=r?`${r}.${a}`:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>b,gA:()=>p,WS:()=>m,_r:()=>d,Jo:()=>v,zh:()=>f,yW:()=>g,gB:()=>h});var r=n(6775),a=n(2263),o=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),a=null==n?void 0:n.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,f=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function m(e){void 0===e&&(e={});const t=p(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function h(e){return f(e).versions}function g(e){const t=f(e);return l(t)}function b(e){const t=f(e),{pathname:n}=(0,r.TH)();return c(t,n)}function v(e){const t=f(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},6657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6991)(`./prism-${e}`)})),delete globalThis.Prism}(r.Z)},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},5705:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Nt});var r=n(7294),a=n(6010),o=n(4763),i=n(833),l=n(7462),s=n(6775),c=n(5999),u=n(5936);const d="docusaurus_skipToContent_fallback";function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function p(){const e=(0,r.useRef)(null),{action:t}=(0,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&f(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,onClick:n}}const m=(0,c.I)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:a}=p();return r.createElement("div",{ref:n,role:"region","aria-label":m},r.createElement("a",(0,l.Z)({},e,{href:`#${d}`,onClick:a}),t))}var g=n(5281),b=n(9727);const v="skipToContent_fXgn";function y(){return r.createElement(h,{className:v})}var w=n(6668),E=n(9689);function k(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...s}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 15 15",width:t,height:n},s),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const S="closeButton_CVFx";function _(e){return r.createElement("button",(0,l.Z)({type:"button","aria-label":(0,c.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},e,{className:(0,a.Z)("clean-btn close",S,e.className)}),r.createElement(k,{width:14,height:14,strokeWidth:3.1}))}const x="content_knG7";function T(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return r.createElement("div",(0,l.Z)({},e,{className:(0,a.Z)(x,e.className),dangerouslySetInnerHTML:{__html:n}}))}const C="announcementBar_mb4j",A="announcementBarPlaceholder_vyr4",N="announcementBarClose_gvF7",O="announcementBarContent_xLdY";function L(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,E.nT)();if(!t)return null;const{backgroundColor:a,textColor:o,isCloseable:i}=e;return r.createElement("div",{className:C,style:{backgroundColor:a,color:o},role:"banner"},i&&r.createElement("div",{className:A}),r.createElement(T,{className:O}),i&&r.createElement(_,{onClick:n,className:N}))}var I=n(2961),P=n(2466);var R=n(902),M=n(3102);const D=r.createContext(null);function F(e){let{children:t}=e;const n=function(){const e=(0,I.e)(),t=(0,M.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,R.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(D.Provider,{value:n},t)}function B(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function $(){const e=(0,r.useContext)(D);if(!e)throw new R.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,M.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:B(o)})),[a,o,t])}function U(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=$();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var z=n(2949),j=n(2389);function H(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function Z(e){return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const G={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function V(e){let{className:t,value:n,onChange:o}=e;const i=(0,j.Z)(),l=(0,c.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,c.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,c.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(G.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",G.toggleButton,!i&&G.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite"},r.createElement(H,{className:(0,a.Z)(G.toggleIcon,G.lightToggleIcon)}),r.createElement(Z,{className:(0,a.Z)(G.toggleIcon,G.darkToggleIcon)})))}const W=r.memo(V);function q(e){let{className:t}=e;const n=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,z.I)();return n?null:r.createElement(W,{className:t,value:a,onChange:o})}var Y=n(1327);function K(){return r.createElement(Y.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function X(){const e=(0,I.e)();return r.createElement("button",{type:"button","aria-label":(0,c.I)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(k,{color:"var(--ifm-color-emphasis-600)"}))}function Q(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(K,null),r.createElement(q,{className:"margin-right--md"}),r.createElement(X,null))}var J=n(9960),ee=n(4996),te=n(3919),ne=n(8022),re=n(9471);function ae(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:s,isDropdownLink:c,prependBaseUrlToHref:u,...d}=e;const f=(0,ee.Z)(a),p=(0,ee.Z)(t),m=(0,ee.Z)(o,{forcePrependBaseUrl:!0}),h=i&&o&&!(0,te.Z)(o),g=s?{dangerouslySetInnerHTML:{__html:s}}:{children:r.createElement(r.Fragment,null,i,h&&r.createElement(re.Z,c&&{width:12,height:12}))};return o?r.createElement(J.Z,(0,l.Z)({href:u?m:o},d,g)):r.createElement(J.Z,(0,l.Z)({to:f,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?(0,ne.F)(n,t.pathname):t.pathname.startsWith(p)},d,g))}function oe(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(ae,(0,l.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function ie(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(ae,(0,l.Z)({className:(0,a.Z)("menu__link",t)},o)))}function le(e){let{mobile:t=!1,position:n,...a}=e;const o=t?ie:oe;return r.createElement(o,(0,l.Z)({},a,{activeClassName:a.activeClassName??(t?"menu__link--active":"navbar__link--active")}))}var se=n(6043),ce=n(8596),ue=n(2263);function de(e,t){return e.some((e=>function(e,t){return!!(0,ce.Mg)(e.to,t)||!!(0,ne.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function fe(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const c=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{c.current&&!c.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[c]),r.createElement("div",{ref:c,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u})},r.createElement(ae,(0,l.Z)({"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))}}),s.children??s.label),r.createElement("ul",{className:"dropdown__menu"},t.map(((e,n)=>r.createElement(Ze,(0,l.Z)({isDropdownItem:!0,onKeyDown:e=>{if(n===t.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=c.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:n}))))))}function pe(e){let{items:t,className:n,position:o,onClick:i,...c}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,ue.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=de(t,u),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,se.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(ae,(0,l.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",n)},c,{onClick:e=>{e.preventDefault(),p()}}),c.children??c.label),r.createElement(se.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},t.map(((e,t)=>r.createElement(Ze,(0,l.Z)({mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active"},e,{key:t}))))))}function me(e){let{mobile:t=!1,...n}=e;const a=t?pe:fe;return r.createElement(a,n)}var he=n(4711);function ge(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,l.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const be="iconLanguage_nlXk";var ve=n(3935),ye=n(5742),we=n(6177);function Ee(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ke=n(830),Se=["translations"];function _e(){return _e=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var Ae="Ctrl";var Ne=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=Ce(e,Se),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,c=void 0===s?"Search":s,u=xe((0,r.useState)(null),2),d=u[0],f=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(Ae))}),[]),r.createElement("button",_e({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ke.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement("kbd",{className:"DocSearch-Button-Key"},d===Ae?r.createElement(Ee,null):d),r.createElement("kbd",{className:"DocSearch-Button-Key"},"K"))))})),Oe=n(3320);const Le={button:{buttonText:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.I)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.I)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Ie=null;function Pe(e){let{hit:t,children:n}=e;return r.createElement(J.Z,{to:t.url},n)}function Re(e){let{state:t,onClose:n}=e;const{generateSearchPageLink:a}=(0,we.O)();return r.createElement(J.Z,{to:a(t.query),onClick:n},r.createElement(c.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits}},"See all {count} results"))}function Me(e){var t;let{contextualSearch:a,externalUrlRegex:o,...i}=e;const{siteMetadata:c}=(0,ue.Z)(),u=function(){const{locale:e,tags:t}=(0,Oe._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=(null==(t=i.searchParameters)?void 0:t.facetFilters)??[],f=a?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(u,d):d,p={...i.searchParameters,facetFilters:f},{withBaseUrl:m}=(0,ee.C)(),h=(0,s.k6)(),g=(0,r.useRef)(null),b=(0,r.useRef)(null),[v,y]=(0,r.useState)(!1),[w,E]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Ie?Promise.resolve():Promise.all([n.e(6780).then(n.bind(n,6780)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Ie=t}))),[]),S=(0,r.useCallback)((()=>{k().then((()=>{g.current=document.createElement("div"),document.body.insertBefore(g.current,document.body.firstChild),y(!0)}))}),[k,y]),_=(0,r.useCallback)((()=>{var e;y(!1),null==(e=g.current)||e.remove()}),[y]),x=(0,r.useCallback)((e=>{k().then((()=>{y(!0),E(e.key)}))}),[k,y,E]),T=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ne.F)(o,t)?window.location.href=t:h.push(t)}}).current,C=(0,r.useRef)((e=>e.map((e=>{if((0,ne.F)(o,e.url))return e;const t=new URL(e.url);return{...e,url:m(`${t.pathname}${t.hash}`)}})))).current,A=(0,r.useMemo)((()=>e=>r.createElement(Re,(0,l.Z)({},e,{onClose:_}))),[_]),N=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",c.docusaurusVersion),e)),[c.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){(27===e.keyCode&&t||"k"===e.key.toLowerCase()&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:v,onOpen:S,onClose:_,onInput:x,searchButtonRef:b}),r.createElement(r.Fragment,null,r.createElement(ye.Z,null,r.createElement("link",{rel:"preconnect",href:`https://${i.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})),r.createElement(Ne,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:S,ref:b,translations:Le.button}),v&&Ie&&g.current&&(0,ve.createPortal)(r.createElement(Ie,(0,l.Z)({onClose:_,initialScrollY:window.scrollY,initialQuery:w,navigator:T,transformItems:C,hitComponent:Pe,transformSearchClient:N},i.searchPagePath&&{resultsFooterComponent:A},i,{searchParameters:p,placeholder:Le.placeholder,translations:Le.modal})),g.current))}function De(){const{siteConfig:e}=(0,ue.Z)();return r.createElement(Me,e.themeConfig.algolia)}const Fe="searchBox_ZlJk";function Be(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,Fe)},t)}var $e=n(143),Ue=n(2802);var ze=n(373);const je=e=>e.docs.find((t=>t.id===e.mainDocId));const He={default:le,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,ue.Z)(),f=(0,he.l)(),{search:p,hash:m}=(0,s.TH)(),h=[...n,...u.map((e=>{const n=`${`pathname://${f.createUrl({locale:e,fullyQualified:!1})}`}${p}${m}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],g=t?(0,c.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return r.createElement(me,(0,l.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(ge,{className:be}),g),items:h}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(Be,{className:n},r.createElement(De,null))},dropdown:me,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,$e.Iw)(a),s=(0,Ue.vY)(t,a);return null===s?null:r.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.path)===s.path||!(null==i||!i.sidebar)&&i.sidebar===s.sidebar,label:n??s.id,to:s.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,$e.Iw)(a),s=(0,Ue.oz)(t,a).link;if(!s)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return r.createElement(le,(0,l.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:n??s.label,to:s.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,Ue.lO)(a)[0],s=t??i.label,c=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(le,(0,l.Z)({},o,{label:s,to:c}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...u}=e;const{search:d,hash:f}=(0,s.TH)(),p=(0,$e.Iw)(n),m=(0,$e.gB)(n),{savePreferredVersionName:h}=(0,ze.J)(n),g=[...o,...m.map((e=>{const t=p.alternateDocVersions[e.name]??je(e);return{label:e.label,to:`${t.path}${d}${f}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...i],b=(0,Ue.lO)(n)[0],v=t&&g.length>1?(0,c.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):b.label,y=t&&g.length>1?void 0:je(b).path;return g.length<=1?r.createElement(le,(0,l.Z)({},u,{mobile:t,label:v,to:y,isActive:a?()=>!1:void 0})):r.createElement(me,(0,l.Z)({},u,{mobile:t,label:v,to:y,items:g,isActive:a?()=>!1:void 0}))}};function Ze(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=He[a];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return r.createElement(o,n)}function Ge(){const e=(0,I.e)(),t=(0,w.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(Ze,(0,l.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function Ve(e){return r.createElement("button",(0,l.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(c.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function We(){const e=0===(0,w.L)().navbar.items.length,t=$();return r.createElement(r.Fragment,null,!e&&r.createElement(Ve,{onClick:()=>t.hide()}),t.content)}function qe(){const e=(0,I.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(U,{header:r.createElement(Q,null),primaryMenu:r.createElement(Ge,null),secondaryMenu:r.createElement(We,null)}):null}const Ye="navbarHideable_m1mJ",Ke="navbarHidden_jGov";function Xe(e){return r.createElement("div",(0,l.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Qe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,I.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,P.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ye,!s&&Ke],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(Xe,{onClick:i.toggle}),r.createElement(qe,null))}function Je(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,l.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function et(){const{toggle:e,shown:t}=(0,I.e)();return r.createElement("button",{onClick:e,"aria-label":(0,c.I)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button"},r.createElement(Je,null))}const tt="colorModeToggle_x44X";function nt(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(Ze,(0,l.Z)({},e,{key:t})))))}function rt(e){let{left:t,right:n}=e;const{siteConfig:a}=(0,ue.Z)();return(0,r.useEffect)((()=>{var e=document.createElement("script");e.type="text/javascript",e.src="https://buttons.github.io/buttons.js",document.querySelector("head").append(e)})),r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},r.createElement("div",{style:{marginTop:"8px",marginRight:"15px"}},r.createElement("a",{className:"github-button",href:`https://github.com/sponsors/${a.organizationName}`,"data-color-scheme":"no-preference: light; light: light; dark: dark;","data-icon":"octicon-heart","data-size":"large","aria-label":`Sponsor @${a.organizationName} on GitHub`},"Sponsor"),"\xa0",r.createElement("a",{className:"github-button",href:`https://github.com/${a.organizationName}/${a.projectName}`,"data-icon":"octicon-star","data-size":"large","data-show-count":"true","aria-label":`Star ${a.organizationName}/${a.projectName} on GitHub`},"Star"),"\xa0",r.createElement("a",{className:"github-button",href:`https://github.com/${a.organizationName}`,"data-size":"large","aria-label":`Follow @${a.organizationName} on GitHub`},`Follow @${a.organizationName}`)),n))}function at(){const e=(0,I.e)(),t=(0,w.L)().navbar.items,[n,a]=function(e){function t(e){return"left"===(e.position??"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(rt,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(et,null),r.createElement(K,null),r.createElement(nt,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(nt,{items:a}),r.createElement(q,{className:tt}),!o&&r.createElement(Be,null,r.createElement(De,null)))})}function ot(){return r.createElement(Qe,null,r.createElement(at,null))}function it(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...s}=t,c=(0,ee.Z)(n),u=(0,ee.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(J.Z,(0,l.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:c},s),o,a&&!(0,te.Z)(a)&&r.createElement(re.Z,null))}function lt(e){let{item:t}=e;return t.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement("li",{key:t.href??t.to,className:"footer__item"},r.createElement(it,{item:t}))}function st(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(lt,{key:t,item:e})))))}function ct(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(st,{key:t,column:e}))))}function ut(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function dt(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(it,{item:t})}function ft(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(dt,{item:e}),t.length!==n+1&&r.createElement(ut,null))))))}function pt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(ct,{columns:t}):r.createElement(ft,{links:t})}var mt=n(941);const ht="footerLogoLink_BH7S";function gt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,ee.C)(),o={light:n(t.src),dark:n(t.srcDark??t.src)};return r.createElement(mt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:o,width:t.width,height:t.height,style:t.style})}function bt(e){let{logo:t}=e;return t.href?r.createElement(J.Z,{href:t.href,className:ht,target:t.target},r.createElement(gt,{logo:t})):r.createElement(gt,{logo:t})}function vt(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function yt(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function wt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(yt,{style:o,links:n&&n.length>0&&r.createElement(pt,{links:n}),logo:a&&r.createElement(bt,{logo:a}),copyright:t&&r.createElement(vt,{copyright:t})})}const Et=r.memo(wt);var kt=n(12);const St="docusaurus.tab.",_t=r.createContext(void 0);const xt=(0,R.Qc)([z.S,E.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,kt.W)(`docusaurus.tab.${e}`).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,kt._)().forEach((t=>{if(t.startsWith(St)){const n=t.substring(St.length);e[n]=(0,kt.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const a=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:a})),[e,a])}();return r.createElement(_t.Provider,{value:n},t)},P.OC,ze.L5,i.VC,function(e){let{children:t}=e;return r.createElement(M.n2,null,r.createElement(I.M,null,r.createElement(F,null,t)))}]);function Tt(e){let{children:t}=e;return r.createElement(xt,null,t)}function Ct(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(c.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(c.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const At="mainWrapper_z2l0";function Nt(e){const{children:t,noFooter:n,wrapperClassName:l,title:s,description:c}=e;return(0,b.t)(),r.createElement(Tt,null,r.createElement(i.d,{title:s,description:c}),r.createElement(y,null),r.createElement(L,null),r.createElement(ot,null),r.createElement("div",{id:d,className:(0,a.Z)(g.k.wrapper.main,At,l)},r.createElement(o.Z,{fallback:e=>r.createElement(Ct,e)},t)),!n&&r.createElement(Et,null))}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(9960),i=n(4996),l=n(2263),s=n(6668),c=n(941);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(c.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){const{siteConfig:{title:t}}=(0,l.Z)(),{navbar:{title:n,logo:c}}=(0,s.L)(),{imageClassName:d,titleClassName:f,...p}=e,m=(0,i.Z)((null==c?void 0:c.href)||"/"),h=n?"":t,g=(null==c?void 0:c.alt)??h;return a.createElement(o.Z,(0,r.Z)({to:m},p,(null==c?void 0:c.target)&&{target:c.target}),c&&a.createElement(u,{logo:c,alt:g,imageClassName:d}),null!=n&&a.createElement("b",{className:f},n))}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(5742);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},941:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7462),a=n(7294),o=n(6010),i=n(2389),l=n(2949);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function c(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:c,className:u,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:c[e],alt:d,className:(0,o.Z)(s.themedImage,s[`themedImage--${e}`],u)},f)))))}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(7462),a=n(7294),o=n(412);function i(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(t??!1),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function c(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function u(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){const t=e.scrollHeight,n=(null==r?void 0:r.duration)??function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${(null==r?void 0:r.easing)??"ease-in-out"}`,height:`${t}px`}}function i(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return c(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,a.useRef)(null);return u({collapsibleRef:f,collapsed:n,animation:o}),a.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(c(f.current,n),null==i||i(n))},className:l},r)}function p(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(f,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?p:f;return a.createElement(r,n)}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(2389),o=n(12),i=n(902),l=n(6668);const s=(0,o.W)("docusaurus.announcement.dismiss"),c=(0,o.W)("docusaurus.announcement.id"),u=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&u()));(0,r.useEffect)((()=>{o(u())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&d(!1),!r&&u()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>g,S:()=>h});var r=n(7294),a=n(412),o=n(902),i=n(12),l=n(6668);const s=r.createContext(void 0),c="theme",u=(0,i.W)(c),d="light",f="dark",p=e=>e===f?f:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,r.useState)((e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,r.useEffect)((()=>{t&&u.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(i(t),a&&(e=>{u.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),u.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=u.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[o,s])}function h(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function g(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b,Oh:()=>w});var r=n(7294),a=n(143),o=n(9935),i=n(6668),l=n(2802),s=n(902),c=n(12);const u=e=>`docs-preferred-version-${e}`,d=(e,t,n)=>{(0,c.W)(u(e),{persistence:t}).set(n)},f=(e,t)=>(0,c.W)(u(e),{persistence:t}).get(),p=(e,t)=>{(0,c.W)(u(e),{persistence:t}).del()};const m=r.createContext(null);function h(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=h();return r.createElement(m.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?r.createElement(g,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=v(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,a._r)(),[t]=v();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(902);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2961:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3102),o=n(7524),i=n(6775),l=n(902);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var c=n(6668);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,c.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const u=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:i})),[e,n,u,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(u.Provider,{value:n},t)}function p(){const e=r.useContext(u);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(902);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{O:()=>l});var r=n(7294),a=n(6775),o=n(2263);const i="q";function l(){const e=(0,a.k6)(),{siteConfig:{baseUrl:t}}=(0,o.Z)(),[n,l]=(0,r.useState)("");(0,r.useEffect)((()=>{const e=new URLSearchParams(window.location.search).get(i)??"";l(e)}),[]);return{searchQuery:n,setSearchQuery:(0,r.useCallback)((t=>{const n=new URLSearchParams(window.location.search);t?n.set(i,t):n.delete(i),e.replace({search:n.toString()}),l(t)}),[e]),generateSearchPageLink:(0,r.useCallback)((e=>`${t}search?q=${encodeURIComponent(e)}`),[t])}}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>c});var r=n(7294),a=n(412);const o="desktop",i="mobile",l="ssr";function s(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function c(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{}}},2802:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>m,cE:()=>d,hI:()=>w,lO:()=>b,vY:()=>y,oz:()=>v,s1:()=>g});var r=n(7294),a=n(6775),o=n(8790),i=n(143),l=n(373),s=n(1116);function c(e){return Array.from(new Set(e))}var u=n(8596);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,u.Mg)(e,t);function m(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||((e,t)=>e.some((e=>m(e,t))))(e.items,t))}function h(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,u.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,u.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function g(){var e;const t=(0,s.V)(),{pathname:n}=(0,a.TH)();return!1!==(null==(e=(0,i.gA)())?void 0:e.pluginData.breadcrumbs)&&t?h({sidebarItems:t.items,pathname:n}):null}function b(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>c([t,n,a].filter(Boolean))),[t,n,a])}function v(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\n Available sidebar ids are:\n - ${Object.keys(t).join("\n- ")}`);return r[1]}),[e,n])}function y(e,t){const n=b(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`DocNavbarItem: couldn't find any doc with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${c(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function w(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,c=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:c}}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(2263);function a(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:a}=t;return null!=e&&e.trim().length?`${e.trim()} ${a} ${n}`:n}},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>u,VC:()=>p});var r=n(7294),a=n(6010),o=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2128);function u(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const u=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,u),t&&r.createElement("meta",{property:"og:title",content:u}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const i=`plugin-id-${n.plugin.id}`;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>c,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,a;super(),this.name="ReactContextError",this.message=`Hook ${(null==(n=this.stack)||null==(r=n.split("\n")[1])||null==(a=r.match(/at (?:\w+\.)?(?\w+)/))?void 0:a.groups.name)??""} is called outside the <${e}>. ${t??""}`}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},8022:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(723),o=n(2263);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:`${e}/`)?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(412),o=n(2389),i=n(902);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function c(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const u=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=c(),a=(0,r.useRef)(u()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=u();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),a=n(2263),o=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,a.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,o.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=(null==n?void 0:n.activePlugin.pluginId)===e?n.activeVersion:void 0,a=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{W:()=>l,_:()=>s});const r="localStorage";function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t}}(e);const n=a(null==t?void 0:t.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r{"use strict";n.d(t,{l:()=>o});var r=n(2263),a=n(6775);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace(`/${o}/`,"/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return`${a?t:""}${function(e){return e===n?`${l}`:`${l}${e}/`}(r)}${s}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6775),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(2263);function a(){return(0,r.Z)().siteConfig.themeConfig}},8802:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},8780:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>S,q_:()=>N,ob:()=>h,PP:()=>L,Ep:()=>m,Hp:()=>g});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),a=l(n);return r!==t||a!==n?e(r,a):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var c=n(2177);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function h(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=h(e,t,f(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},6882:(e,t,n)=>{"use strict";n.r(t)},8049:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,s=a(e),c=1;c{var r=n(5826);e.exports=p,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],v=n[5],y=n[6],w=n[7];l&&(r.push(l),l="");var E=null!=h&&null!=m&&m!==h,k="+"===y||"*"===y,S="?"===y||"*"===y,_=n[2]||u,x=b||v;r.push({name:g||o++,prefix:h||"",delimiter:_,optional:S,repeat:k,partial:E,asterisk:!!w,pattern:x?c(x):w?".*":"[^"+s(_)+"]+?"})}}return i{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=k.value.length,k=k.next){var _=k.value;if(t.length>e.length)return;if(!(_ instanceof a)){var x,T=1;if(v){if(!(x=o(E,S,e,b))||x.index>=e.length)break;var C=x.index,A=x.index+x[0].length,N=S;for(N+=k.value.length;C>=N;)N+=(k=k.next).value.length;if(S=N-=k.value.length,k.value instanceof a)continue;for(var O=k;O!==t.tail&&(Nd.reach&&(d.reach=R);var M=k.prev;if(I&&(M=s(t,M,I),S+=I.length),c(t,M,T),k=s(t,M,new a(f,g?r.tokenize(L,g):L,y,L)),P&&s(t,k,P),T>1){var D={cause:f+","+m,reach:R};i(e,t,n,k.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function c(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(c,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function c(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function u(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,u={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=a,n})).join(""),n,r),f=Object.keys(u);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=c(u[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++a;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];h&&v.push.apply(v,i([h])),v.push(g),b&&v.push.apply(v,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(v)):c.content=v}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},7874:()=>{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i{Prism.languages.hcl={comment:/(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,heredoc:{pattern:/<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,greedy:!0,alias:"string"},keyword:[{pattern:/(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,inside:{type:{pattern:/(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,lookbehind:!0,alias:"variable"}}},{pattern:/(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,inside:{type:{pattern:/(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,lookbehind:!0,alias:"variable"}}},/[\w-]+(?=\s+\{)/],property:[/[-\w\.]+(?=\s*=(?!=))/,/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/],string:{pattern:/"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,greedy:!0,inside:{interpolation:{pattern:/(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,lookbehind:!0,inside:{type:{pattern:/(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,lookbehind:!0,alias:"variable"},keyword:/\b(?:count|data|local|module|path|self|terraform|var)\b/i,function:/\w+(?=\()/,string:{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,punctuation:/[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/}}}},number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,boolean:/\b(?:false|true)\b/i,punctuation:/[=\[\]{}]/}},3335:()=>{Prism.languages.log={string:{pattern:/"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,greedy:!0},exception:{pattern:/(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,lookbehind:!0,greedy:!0,alias:["javastacktrace","language-javastacktrace"],inside:Prism.languages.javastacktrace||{keyword:/\bat\b/,function:/[a-z_][\w$]*(?=\()/,punctuation:/[.:()]/}},level:[{pattern:/\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,alias:["error","important"]},{pattern:/\b(?:WARN|WARNING|WRN)\b/,alias:["warning","important"]},{pattern:/\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,alias:["info","keyword"]},{pattern:/\b(?:DBG|DEBUG|FINE)\b/,alias:["debug","keyword"]},{pattern:/\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,alias:["trace","comment"]}],property:{pattern:/((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,lookbehind:!0},separator:{pattern:/(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,lookbehind:!0,alias:"comment"},url:/\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,email:{pattern:/(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,lookbehind:!0,alias:"url"},"ip-address":{pattern:/\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,alias:"constant"},"mac-address":{pattern:/\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,alias:"constant"},domain:{pattern:/(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,lookbehind:!0,alias:"constant"},uuid:{pattern:/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,alias:"constant"},hash:{pattern:/\b(?:[a-f0-9]{32}){1,2}\b/i,alias:"constant"},"file-path":{pattern:/\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,lookbehind:!0,greedy:!0,alias:"string"},date:{pattern:RegExp(/\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source+"|"+/\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source+"|"+/\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,"i"),alias:"number"},time:{pattern:/\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,alias:"number"},boolean:/\b(?:false|null|true)\b/i,number:{pattern:/(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,lookbehind:!0},operator:/[;:?<=>~/@!$%&+\-|^(){}*#]/,punctuation:/[\[\].,]/}},366:()=>{Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},767:()=>{!function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|)*\*\//.source,n=0;n<2;n++)t=t.replace(//g,(function(){return t}));t=t.replace(//g,(function(){return/[^\s\S]/.source})),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(Prism)},9930:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},3358:()=>{!function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(Prism)},6991:(e,t,n)=>{var r={"./prism-bash":7874,"./prism-hcl":4677,"./prism-log":3335,"./prism-python":366,"./prism-rust":767,"./prism-toml":9930,"./prism-yaml":3358};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6991},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n