1507 lines
73 KiB
HTML
1507 lines
73 KiB
HTML
<!DOCTYPE HTML>
|
||
<html lang="en" class="coal" dir="ltr">
|
||
<head>
|
||
<!-- Book generated using mdBook -->
|
||
<meta charset="UTF-8">
|
||
<title>rust grammar - Andrew's Blog</title>
|
||
|
||
|
||
<!-- Custom HTML head -->
|
||
|
||
<meta name="description" content="Andrew Ryan's Blog">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<meta name="theme-color" content="#ffffff">
|
||
|
||
<link rel="icon" href="../../favicon.svg">
|
||
<link rel="shortcut icon" href="../../favicon.png">
|
||
<link rel="stylesheet" href="../../css/variables.css">
|
||
<link rel="stylesheet" href="../../css/general.css">
|
||
<link rel="stylesheet" href="../../css/chrome.css">
|
||
|
||
<!-- Fonts -->
|
||
<link rel="stylesheet" href="../../FontAwesome/css/font-awesome.css">
|
||
<link rel="stylesheet" href="../../fonts/fonts.css">
|
||
|
||
<!-- Highlight.js Stylesheets -->
|
||
<link rel="stylesheet" href="../../highlight.css">
|
||
<link rel="stylesheet" href="../../tomorrow-night.css">
|
||
<link rel="stylesheet" href="../../ayu-highlight.css">
|
||
|
||
<!-- Custom theme stylesheets -->
|
||
<link rel="stylesheet" href="../../src/style/custom.css">
|
||
|
||
<!-- MathJax -->
|
||
<script async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||
</head>
|
||
<body class="sidebar-visible no-js">
|
||
<div id="body-container">
|
||
<!-- Provide site root to javascript -->
|
||
<script>
|
||
var path_to_root = "../../";
|
||
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "coal" : "coal";
|
||
</script>
|
||
|
||
<!-- Work around some values being stored in localStorage wrapped in quotes -->
|
||
<script>
|
||
try {
|
||
var theme = localStorage.getItem('mdbook-theme');
|
||
var sidebar = localStorage.getItem('mdbook-sidebar');
|
||
|
||
if (theme.startsWith('"') && theme.endsWith('"')) {
|
||
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
|
||
}
|
||
|
||
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
|
||
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
|
||
}
|
||
} catch (e) { }
|
||
</script>
|
||
|
||
<!-- Set the theme before any content is loaded, prevents flash -->
|
||
<script>
|
||
var theme;
|
||
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
|
||
if (theme === null || theme === undefined) { theme = default_theme; }
|
||
var html = document.querySelector('html');
|
||
html.classList.remove('coal')
|
||
html.classList.add(theme);
|
||
var body = document.querySelector('body');
|
||
body.classList.remove('no-js')
|
||
body.classList.add('js');
|
||
</script>
|
||
|
||
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden">
|
||
|
||
<!-- Hide / unhide sidebar before it is displayed -->
|
||
<script>
|
||
var body = document.querySelector('body');
|
||
var sidebar = null;
|
||
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
|
||
if (document.body.clientWidth >= 1080) {
|
||
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
|
||
sidebar = sidebar || 'visible';
|
||
} else {
|
||
sidebar = 'hidden';
|
||
}
|
||
sidebar_toggle.checked = sidebar === 'visible';
|
||
body.classList.remove('sidebar-visible');
|
||
body.classList.add("sidebar-" + sidebar);
|
||
</script>
|
||
|
||
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
|
||
<div class="sidebar-scrollbox">
|
||
<ol class="chapter"><li class="chapter-item affix "><a href="../../index.html">Andrew's Blog</a></li><li class="chapter-item "><a href="../../posts/linux/linux.html"><strong aria-hidden="true">1.</strong> linux</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/linux/install_linux.html"><strong aria-hidden="true">1.1.</strong> install linux</a></li><li class="chapter-item "><a href="../../posts/linux/bash_profile.html"><strong aria-hidden="true">1.2.</strong> bash profile</a></li><li class="chapter-item "><a href="../../posts/linux/command_list.html"><strong aria-hidden="true">1.3.</strong> command list</a></li><li class="chapter-item "><a href="../../posts/linux/git_guide.html"><strong aria-hidden="true">1.4.</strong> git guide</a></li><li class="chapter-item "><a href="../../posts/linux/tar.html"><strong aria-hidden="true">1.5.</strong> tar</a></li><li class="chapter-item "><a href="../../posts/linux/run_x86_elf_in_x64_setup.html"><strong aria-hidden="true">1.6.</strong> run x86 elf in x64 setup</a></li></ol></li><li class="chapter-item "><a href="../../posts/mac/mac.html"><strong aria-hidden="true">2.</strong> mac</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/mac/macos_profiles.html"><strong aria-hidden="true">2.1.</strong> macos profiles</a></li></ol></li><li class="chapter-item "><a href="../../posts/swift/swift.html"><strong aria-hidden="true">3.</strong> swift</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/swift/learn_swift.html"><strong aria-hidden="true">3.1.</strong> learn swift basics</a></li><li class="chapter-item "><a href="../../posts/swift/swift_extensions.html"><strong aria-hidden="true">3.2.</strong> Swift extensions</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_extension.html"><strong aria-hidden="true">3.3.</strong> SwiftUI extensions</a></li><li class="chapter-item "><a href="../../posts/swift/install_swift.html"><strong aria-hidden="true">3.4.</strong> install swift</a></li><li class="chapter-item "><a href="../../posts/swift/task_planner.html"><strong aria-hidden="true">3.5.</strong> implment task panner app with SwiftUI</a></li><li class="chapter-item "><a href="../../posts/swift/swift_cheat_sheet.html"><strong aria-hidden="true">3.6.</strong> Swift Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/swift/yinci_url.html"><strong aria-hidden="true">3.7.</strong> Personal privacy protocol</a></li><li class="chapter-item "><a href="../../posts/swift/swift_regular_exressions.html"><strong aria-hidden="true">3.8.</strong> Swift regular exressions</a></li><li class="chapter-item "><a href="../../posts/ios/how_to_create_beautiful_ios_charts_in_swift.html"><strong aria-hidden="true">3.9.</strong> How to Create Beautiful iOS Charts in鑱絊wift</a></li><li class="chapter-item "><a href="../../posts/swift/swiftui_source_code.html"><strong aria-hidden="true">3.10.</strong> SwiftUI source code</a></li><li class="chapter-item "><a href="../../posts/swift/use_swift_fetch_iciba_api.html"><strong aria-hidden="true">3.11.</strong> use swift fetch iciba API</a></li></ol></li><li class="chapter-item "><a href="../../posts/ios/ios.html"><strong aria-hidden="true">4.</strong> ios</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ios/cocaposd_setup_and_install_for_ios_project.html"><strong aria-hidden="true">4.1.</strong> cocaposd setup and install for ios project</a></li><li class="chapter-item "><a href="../../posts/ios/swiftui_show_gif_image.html"><strong aria-hidden="true">4.2.</strong> SwiftUI show gif image</a></li><li class="chapter-item "><a href="../../posts/ios/implement_task_planner_app.html"><strong aria-hidden="true">4.3.</strong> implement Task planner App</a></li></ol></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c.html"><strong aria-hidden="true">5.</strong> objective_c</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/objective_c/objective_c_cheat_sheet.html"><strong aria-hidden="true">5.1.</strong> Objective-C Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/objective_c/objective_c_for_absolute_beginners_read_note.html"><strong aria-hidden="true">5.2.</strong> Objective-C Note</a></li></ol></li><li class="chapter-item "><a href="../../posts/dart/dart.html"><strong aria-hidden="true">6.</strong> dart</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/dart/flutter.html"><strong aria-hidden="true">6.1.</strong> Flutter Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/dart/dart_cheat_sheet.html"><strong aria-hidden="true">6.2.</strong> Dart Cheat Sheet</a></li><li class="chapter-item "><a href="../../posts/flutter/flutter_dev_test.html"><strong aria-hidden="true">6.3.</strong> Flutter dev test</a></li></ol></li><li class="chapter-item expanded "><a href="../../posts/rust/rust.html"><strong aria-hidden="true">7.</strong> rust</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/rust/offline_use_rust.html"><strong aria-hidden="true">7.1.</strong> Offline use rust</a></li><li class="chapter-item expanded "><a href="../../posts/rust/rust_grammer.html" class="active"><strong aria-hidden="true">7.2.</strong> rust grammar</a></li><li class="chapter-item "><a href="../../posts/rust/pase_string_and_decimal_conversion.html"><strong aria-hidden="true">7.3.</strong> pase string and decimal conversion</a></li><li class="chapter-item "><a href="../../posts/rust/parse_types.html"><strong aria-hidden="true">7.4.</strong> rust types</a></li><li class="chapter-item "><a href="../../posts/rust/rust_life_cycle.html"><strong aria-hidden="true">7.5.</strong> Rust life cycle</a></li><li class="chapter-item "><a href="../../posts/rust/rust_generic.html"><strong aria-hidden="true">7.6.</strong> rust generics</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implment_matrix.html"><strong aria-hidden="true">7.7.</strong> Rust implement matrix</a></li><li class="chapter-item "><a href="../../posts/rust/rust_sort.html"><strong aria-hidden="true">7.8.</strong> Rust implement sort algorithms</a></li><li class="chapter-item "><a href="../../posts/rust/implement_aes_encryption.html"><strong aria-hidden="true">7.9.</strong> Rust implement AEC encryption and decryption</a></li><li class="chapter-item "><a href="../../posts/rust/implement_trie_data_structure.html"><strong aria-hidden="true">7.10.</strong> implement trie data structure</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_tree.html"><strong aria-hidden="true">7.11.</strong> implement tree data_structure</a></li><li class="chapter-item "><a href="../../posts/rust/list_dir.html"><strong aria-hidden="true">7.12.</strong> list dir</a></li><li class="chapter-item "><a href="../../posts/rust/fast_way_to_implment_object_trait.html"><strong aria-hidden="true">7.13.</strong> fast way to implment object trait</a></li><li class="chapter-item "><a href="../../posts/rust/compress_rust_binary_size.html"><strong aria-hidden="true">7.14.</strong> compress rust binary size</a></li><li class="chapter-item "><a href="../../posts/rust/implment_file_upload_backend.html"><strong aria-hidden="true">7.15.</strong> impliment file upload</a></li><li class="chapter-item "><a href="../../posts/rust/this_is_add_post_cli_implementation_in_rust.html"><strong aria-hidden="true">7.16.</strong> this is add_post cli implementation in rust</a></li><li class="chapter-item "><a href="../../posts/rust/use_rust_implment_a_copyclipbord_cli.html"><strong aria-hidden="true">7.17.</strong> Use rust implment a copyclipbord CLI</a></li><li class="chapter-item "><a href="../../posts/rust/sqlite_database_add_delete_update_show_in_rust.html"><strong aria-hidden="true">7.18.</strong> sqlite database add delete update show in rust</a></li><li class="chapter-item "><a href="../../posts/rust/implementing_tokio_joinhandle_for_wasm.html"><strong aria-hidden="true">7.19.</strong> Implementing tokio JoinHandle for wasm</a></li><li class="chapter-item "><a href="../../posts/rust/rust_implement_a_crate_for_encode_and_decode_brainfuck_and_ook.html"><strong aria-hidden="true">7.20.</strong> rust implement a crate for encode and decode brainfuck and ook</a></li><li class="chapter-item "><a href="../../posts/rust/slint_builtin_elements.html"><strong aria-hidden="true">7.21.</strong> Slint Builtin Elements</a></li><li class="chapter-item "><a href="../../posts/rust/corporate_network_install_rust_on_windows.html"><strong aria-hidden="true">7.22.</strong> Corporate network install Rust on windows</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_file_how_to_judge_static_link_or_dynamic_link_in_macos.html"><strong aria-hidden="true">7.23.</strong> rust binary file how to judge static link or dynamic link in Macos</a></li><li class="chapter-item "><a href="../../posts/rust/rust_binary_include_dir_and_get_contents.html"><strong aria-hidden="true">7.24.</strong> rust binary include dir and get contents</a></li><li class="chapter-item "><a href="../../posts/rust/rust_logger_non-block.html"><strong aria-hidden="true">7.25.</strong> rust logger non-block</a></li><li class="chapter-item "><a href="../../posts/rust/rust_connect_sql_server_database.html"><strong aria-hidden="true">7.26.</strong> rust connect sql server database</a></li><li class="chapter-item "><a href="../../posts/rust/rust_websocket_implment.html"><strong aria-hidden="true">7.27.</strong> rust websocket implment</a></li></ol></li><li class="chapter-item "><a href="../../posts/java/java.html"><strong aria-hidden="true">8.</strong> java</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/java/java_grammar.html"><strong aria-hidden="true">8.1.</strong> java grammar and codewar</a></li><li class="chapter-item "><a href="../../posts/java/run_jar.html"><strong aria-hidden="true">8.2.</strong> java run .jar</a></li><li class="chapter-item "><a href="../../posts/java/java_pomxml_add_defaultgoal_to_build.html"><strong aria-hidden="true">8.3.</strong> Java pomxml add defaultGoal to build</a></li><li class="chapter-item "><a href="../../posts/java/java_set_mvn_mirror.html"><strong aria-hidden="true">8.4.</strong> Java set mvn mirror</a></li></ol></li><li class="chapter-item "><a href="../../posts/python/python.html"><strong aria-hidden="true">9.</strong> python</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/python/convert_pesn.html"><strong aria-hidden="true">9.1.</strong> convert pesn</a></li><li class="chapter-item "><a href="../../posts/python/find_remove_dir.html"><strong aria-hidden="true">9.2.</strong> find and remove dir</a></li><li class="chapter-item "><a href="../../posts/python/timing_message.html"><strong aria-hidden="true">9.3.</strong> wechat send message</a></li><li class="chapter-item "><a href="../../posts/python/use_python_openpyxl_package_read_and_edit_excel_files.html"><strong aria-hidden="true">9.4.</strong> Use python openpyxl package read and edit excel files</a></li></ol></li><li class="chapter-item "><a href="../../posts/go/go.html"><strong aria-hidden="true">10.</strong> go</a></li><li class="chapter-item "><a href="../../posts/js/js.html"><strong aria-hidden="true">11.</strong> js</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/js/js_tutorial.html"><strong aria-hidden="true">11.1.</strong> js tutorial</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_map.html"><strong aria-hidden="true">11.2.</strong> ja map</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_math.html"><strong aria-hidden="true">11.3.</strong> js math</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_object.html"><strong aria-hidden="true">11.4.</strong> js object</a></li><li class="chapter-item "><a href="../../posts/js/js_tutorial_set.html"><strong aria-hidden="true">11.5.</strong> js set</a></li><li class="chapter-item "><a href="../../posts/js/single_thread_and_asynchronous.html"><strong aria-hidden="true">11.6.</strong> single thread and asynchronous</a></li><li class="chapter-item "><a href="../../posts/js/this.html"><strong aria-hidden="true">11.7.</strong> js this</a></li><li class="chapter-item "><a href="../../posts/js/js_implment_aes.html"><strong aria-hidden="true">11.8.</strong> js implment aes</a></li><li class="chapter-item "><a href="../../posts/js/getting_started_with_ajax.html"><strong aria-hidden="true">11.9.</strong> getting started with ajax</a></li><li class="chapter-item "><a href="../../posts/js/BinarySearchTree.html"><strong aria-hidden="true">11.10.</strong> binary search tree</a></li><li class="chapter-item "><a href="../../posts/js/goole_zx.html"><strong aria-hidden="true">11.11.</strong> goole zx</a></li><li class="chapter-item "><a href="../../posts/js/es6.html"><strong aria-hidden="true">11.12.</strong> es6</a></li></ol></li><li class="chapter-item "><a href="../../posts/ruby/ruby.html"><strong aria-hidden="true">12.</strong> ruby</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ruby/rails_setup_env.html"><strong aria-hidden="true">12.1.</strong> ruby on rails setup environment</a></li><li class="chapter-item "><a href="../../posts/ruby/learn_ruby.html"><strong aria-hidden="true">12.2.</strong> learn ruby</a></li><li class="chapter-item "><a href="../../posts/ruby/ruby_note.html"><strong aria-hidden="true">12.3.</strong> Ruby Note</a></li><li class="chapter-item "><a href="../../posts/ruby/setup_ruby_for_ctf.html"><strong aria-hidden="true">12.4.</strong> Setup ruby for CTF</a></li></ol></li><li class="chapter-item "><a href="../../posts/react/react.html"><strong aria-hidden="true">13.</strong> react</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/react/react_life_cycle.html"><strong aria-hidden="true">13.1.</strong> react life cycle</a></li><li class="chapter-item "><a href="../../posts/react/react_router.html"><strong aria-hidden="true">13.2.</strong> react router</a></li><li class="chapter-item "><a href="../../posts/react/react_this.html"><strong aria-hidden="true">13.3.</strong> react this</a></li><li class="chapter-item "><a href="../../posts/react/react_interviw.html"><strong aria-hidden="true">13.4.</strong> react interview</a></li><li class="chapter-item "><a href="../../posts/react/important_react_interview.html"><strong aria-hidden="true">13.5.</strong> important react interview</a></li><li class="chapter-item "><a href="../../posts/react/react_quick_reference.html"><strong aria-hidden="true">13.6.</strong> react quick reference</a></li><li class="chapter-item "><a href="../../posts/react/redux_quick_reference.html"><strong aria-hidden="true">13.7.</strong> redux quick reference</a></li></ol></li><li class="chapter-item "><a href="../../posts/vue/vue.html"><strong aria-hidden="true">14.</strong> vue</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/vue/vue_ajax.html"><strong aria-hidden="true">14.1.</strong> vue ajax</a></li></ol></li><li class="chapter-item "><a href="../../posts/angular/angular.html"><strong aria-hidden="true">15.</strong> angular</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/angular/controller_communication.html"><strong aria-hidden="true">15.1.</strong> controller communication</a></li><li class="chapter-item "><a href="../../posts/angular/creating_custom_directives.html"><strong aria-hidden="true">15.2.</strong> creating custom directives</a></li><li class="chapter-item "><a href="../../posts/angular/directive_notes.html"><strong aria-hidden="true">15.3.</strong> directive notes</a></li><li class="chapter-item "><a href="../../posts/angular/directive_communication.html"><strong aria-hidden="true">15.4.</strong> directive communication</a></li><li class="chapter-item "><a href="../../posts/angular/post_params.html"><strong aria-hidden="true">15.5.</strong> post params</a></li><li class="chapter-item "><a href="../../posts/angular/read_json_angular.html"><strong aria-hidden="true">15.6.</strong> read json angular</a></li><li class="chapter-item "><a href="../../posts/angular/same_route_reload.html"><strong aria-hidden="true">15.7.</strong> same route reload</a></li></ol></li><li class="chapter-item "><a href="../../posts/css/css.html"><strong aria-hidden="true">16.</strong> css</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/css/use_css_media.html"><strong aria-hidden="true">16.1.</strong> use css media</a></li></ol></li><li class="chapter-item "><a href="../../posts/php/php.html"><strong aria-hidden="true">17.</strong> php</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/php/for_php_string_implment_some_extemtion_functions.html"><strong aria-hidden="true">17.1.</strong> for php string implment some extemtion functions</a></li><li class="chapter-item "><a href="../../posts/php/php_cheatsheet.html"><strong aria-hidden="true">17.2.</strong> PHP cheatsheet</a></li></ol></li><li class="chapter-item "><a href="../../posts/leetcode/leetcode.html"><strong aria-hidden="true">18.</strong> leetcode</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/leetcode/rust_leetcode.html"><strong aria-hidden="true">18.1.</strong> rust leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_codewar.html"><strong aria-hidden="true">18.2.</strong> rust codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/swift_codewar.html"><strong aria-hidden="true">18.3.</strong> swift codewar</a></li><li class="chapter-item "><a href="../../posts/leetcode/js_leetcode.html"><strong aria-hidden="true">18.4.</strong> js leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/java_leetcode.html"><strong aria-hidden="true">18.5.</strong> java leetcode</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_huawei.html"><strong aria-hidden="true">18.6.</strong> huawei test</a></li><li class="chapter-item "><a href="../../posts/leetcode/rust_utils.html"><strong aria-hidden="true">18.7.</strong> rust common functions</a></li><li class="chapter-item "><a href="../../posts/leetcode/olympiad_training.html"><strong aria-hidden="true">18.8.</strong> Computer olympiad training</a></li></ol></li><li class="chapter-item "><a href="../../posts/ctf/CTF.html"><strong aria-hidden="true">19.</strong> ctf</a><a class="toggle"><div>❱</div></a></li><li><ol class="section"><li class="chapter-item "><a href="../../posts/ctf/CTF_Note.html"><strong aria-hidden="true">19.1.</strong> CTF Note</a></li><li class="chapter-item "><a href="../../posts/ctf/0.1_Web.html"><strong aria-hidden="true">19.2.</strong> Web</a></li><li class="chapter-item "><a href="../../posts/ctf/4.1_Misc.html"><strong aria-hidden="true">19.3.</strong> Misc</a></li><li class="chapter-item "><a href="../../posts/ctf/3.2_PWN_note.html"><strong aria-hidden="true">19.4.</strong> PWN</a></li><li class="chapter-item "><a href="../../posts/ctf/3.1_Crypto.html"><strong aria-hidden="true">19.5.</strong> Crypto</a></li><li class="chapter-item "><a href="../../posts/ctf/3.4_RSA_note.html"><strong aria-hidden="true">19.6.</strong> Rsa attack</a></li><li class="chapter-item "><a href="../../posts/ctf/3.5_Base64.html"><strong aria-hidden="true">19.7.</strong> Base64</a></li><li class="chapter-item "><a href="../../posts/ctf/0.0_SQL Injection Cheatsheet.html"><strong aria-hidden="true">19.8.</strong> SQL Injection Cheatsheet</a></li><li class="chapter-item "><a href="../../posts/ctf/1.1_SQL_injection.html"><strong aria-hidden="true">19.9.</strong> SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.2_SQL_injection_UNION_attacks.html"><strong aria-hidden="true">19.10.</strong> SQL Injection UNION attacks</a></li><li class="chapter-item "><a href="../../posts/ctf/1.3_Blind SQL injection.html"><strong aria-hidden="true">19.11.</strong> Blind SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.4_Code Injection.html"><strong aria-hidden="true">19.12.</strong> Code Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.5_SSRF.html"><strong aria-hidden="true">19.13.</strong> SSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.6_OS command injection.html"><strong aria-hidden="true">19.14.</strong> OS command injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.7_Local file inclusion.html"><strong aria-hidden="true">19.15.</strong> Local file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.8_Remote file inclusion.html"><strong aria-hidden="true">19.16.</strong> Remote file inclusion</a></li><li class="chapter-item "><a href="../../posts/ctf/1.9_CSRFm.html"><strong aria-hidden="true">19.17.</strong> CSRF</a></li><li class="chapter-item "><a href="../../posts/ctf/1.10_NoSQL injection.html"><strong aria-hidden="true">19.18.</strong> NoSQL injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.11_JSON injection.html"><strong aria-hidden="true">19.19.</strong> JSON injection</a></li><li class="chapter-item "><a href="../../posts/ctf/1.12_CTF_Web_SQL_Note.html"><strong aria-hidden="true">19.20.</strong> CTF Web SQL Note</a></li><li class="chapter-item "><a href="../../posts/ctf/2.1_XXE.html"><strong aria-hidden="true">19.21.</strong> XXE</a></li><li class="chapter-item "><a href="../../posts/ctf/2.2_XSS.html"><strong aria-hidden="true">19.22.</strong> XSS</a></li><li class="chapter-item "><a href="../../posts/ctf/2.3_Upload File.html"><strong aria-hidden="true">19.23.</strong> Upload File</a></li><li class="chapter-item "><a href="../../posts/ctf/2.4_serialize_unserialize.html"><strong aria-hidden="true">19.24.</strong> serialize unserialize</a></li><li class="chapter-item "><a href="../../posts/ctf/2.5_Race condition.html"><strong aria-hidden="true">19.25.</strong> Race condition</a></li><li class="chapter-item "><a href="../../posts/ctf/3.2_PWN_note.html"><strong aria-hidden="true">19.26.</strong> PWN_note</a></li><li class="chapter-item "><a href="../../posts/ctf/3.3_pwn HCTF2016 brop.html"><strong aria-hidden="true">19.27.</strong> pwn HCTF2016 brop</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_patch_defense_skill.html"><strong aria-hidden="true">19.28.</strong> PWN Patch defense skill</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_stack_overflow.html"><strong aria-hidden="true">19.29.</strong> PWN stack overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_heap_overflow.html"><strong aria-hidden="true">19.30.</strong> PWN heap overflow</a></li><li class="chapter-item "><a href="../../posts/ctf/pwn_format_string_vulnerability.html"><strong aria-hidden="true">19.31.</strong> PWN Format String Vulnerability</a></li><li class="chapter-item "><a href="../../posts/ctf/kali_linux_tutorials.html"><strong aria-hidden="true">19.32.</strong> Kali linux tutorials</a></li><li class="chapter-item "><a href="../../posts/ctf/google_dorks_2023_lists.html"><strong aria-hidden="true">19.33.</strong> Google Dorks 2023 Lists</a></li><li class="chapter-item "><a href="../../posts/ctf/dvwa_writeup.html"><strong aria-hidden="true">19.34.</strong> DVWA WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/bwapp_writeup.html"><strong aria-hidden="true">19.35.</strong> bWAPP WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/sqlilabs_writeup.html"><strong aria-hidden="true">19.36.</strong> sqlilabs WriteUp</a></li><li class="chapter-item "><a href="../../posts/ctf/ctf_train_at_hangzhou.html"><strong aria-hidden="true">19.37.</strong> ctf train at hangzhou</a></li><li class="chapter-item "><a href="../../posts/ctf/ctf_common_mindmap_list.html"><strong aria-hidden="true">19.38.</strong> ctf common mindmap list</a></li><li class="chapter-item "><a href="../../posts/ctf/error_based_sql_injection.html"><strong aria-hidden="true">19.39.</strong> Error Based SQL Injection</a></li><li class="chapter-item "><a href="../../posts/ctf/urlfinder_tutorial.html"><strong aria-hidden="true">19.40.</strong> URLFinder Tutorial</a></li><li class="chapter-item "><a href="../../posts/ctf/observer_ward_tutorial.html"><strong aria-hidden="true">19.41.</strong> observer_ward Tutorial</a></li><li class="chapter-item "><a href="../../posts/ctf/mysql_udf_.html"><strong aria-hidden="true">19.42.</strong> MySQL UDF 提权</a></li><li class="chapter-item "><a href="../../posts/ctf/nuclei__tutorial.html"><strong aria-hidden="true">19.43.</strong> Nuclei Tutorial</a></li><li class="chapter-item "><a href="../../posts/ctf/2024_ctf_solution_thinking.html"><strong aria-hidden="true">19.44.</strong> 2024 ctf solution thinking</a></li><li class="chapter-item "><a href="../../posts/ctf/man_che_si_te_bian_ma.html"><strong aria-hidden="true">19.45.</strong> 曼彻斯特编码</a></li></ol></li></ol>
|
||
</div>
|
||
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
|
||
<div class="sidebar-resize-indicator"></div>
|
||
</div>
|
||
</nav>
|
||
|
||
<!-- Track and set sidebar scroll position -->
|
||
<script>
|
||
var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
|
||
sidebarScrollbox.addEventListener('click', function(e) {
|
||
if (e.target.tagName === 'A') {
|
||
sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
|
||
}
|
||
}, { passive: true });
|
||
var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
|
||
sessionStorage.removeItem('sidebar-scroll');
|
||
if (sidebarScrollTop) {
|
||
// preserve sidebar scroll position when navigating via links within sidebar
|
||
sidebarScrollbox.scrollTop = sidebarScrollTop;
|
||
} else {
|
||
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
|
||
var activeSection = document.querySelector('#sidebar .active');
|
||
if (activeSection) {
|
||
activeSection.scrollIntoView({ block: 'center' });
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<div id="page-wrapper" class="page-wrapper">
|
||
|
||
<div class="page">
|
||
<div id="menu-bar-hover-placeholder"></div>
|
||
<div id="menu-bar" class="menu-bar sticky">
|
||
<div class="left-buttons">
|
||
<label id="sidebar-toggle" class="icon-button" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">
|
||
<i class="fa fa-bars"></i>
|
||
</label>
|
||
<button id="theme-toggle" class="icon-button" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">
|
||
<i class="fa fa-paint-brush"></i>
|
||
</button>
|
||
<ul id="theme-list" class="theme-popup" aria-label="Themes" role="menu">
|
||
<li role="none"><button role="menuitem" class="theme" id="light">Light</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li>
|
||
<li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li>
|
||
</ul>
|
||
<button id="search-toggle" class="icon-button" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">
|
||
<i class="fa fa-search"></i>
|
||
</button>
|
||
</div>
|
||
|
||
<h1 class="menu-title">Andrew's Blog</h1>
|
||
|
||
<div class="right-buttons">
|
||
<a href="https://gitlink.org.cn/dnrops/dnrops.gitlink.net.git" title="Git repository" aria-label="Git repository">
|
||
<i id="git-repository-button" class="fa fa-github"></i>
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div id="search-wrapper" class="hidden">
|
||
<form id="searchbar-outer" class="searchbar-outer">
|
||
<input type="search" id="searchbar" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header">
|
||
</form>
|
||
<div id="searchresults-outer" class="searchresults-outer hidden">
|
||
<div id="searchresults-header" class="searchresults-header"></div>
|
||
<ul id="searchresults">
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- Apply ARIA attributes after the sidebar and the sidebar toggle button are added to the DOM -->
|
||
<script>
|
||
document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
|
||
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
|
||
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
|
||
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
|
||
});
|
||
</script>
|
||
|
||
<div id="content" class="content">
|
||
<main>
|
||
<h1 id="rust-learn-notebook"><a class="header" href="#rust-learn-notebook">Rust learn notebook</a></h1>
|
||
<h2 id="trait-in-rust"><a class="header" href="#trait-in-rust">trait in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>struct Person{
|
||
name:String,
|
||
age:i128
|
||
}
|
||
trait VoiceBox {
|
||
// speak
|
||
fn speak(&self);
|
||
// can speak
|
||
fn can_speak(&self) ->bool;
|
||
}
|
||
impl VoiceBox for Person{
|
||
fn speak(&self) {
|
||
println!("I am {}",self.name);
|
||
}
|
||
fn can_speak(&self) ->bool {
|
||
if self.age>0{
|
||
return true;
|
||
}else{
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
pub fn run(){
|
||
let this_person = Person{name:String::from("Alen"),age:24};
|
||
println!("{}can speak?{}",this_person.name,this_person.can_speak());
|
||
this_person.speak();
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="btreemap-类似于-python-的-mapjs-的-set-val-不能重复"><a class="header" href="#btreemap-类似于-python-的-mapjs-的-set-val-不能重复">BTreeMap (类似于 python 的 map,js 的 Set) ,val 不能重复</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>#[allow(unused_variables)]
|
||
use std::collections::BTreeMap;
|
||
pub fn run() {
|
||
let mut each_value = String::new();
|
||
std::io::stdin().read_line(&mut each_value).unwrap();
|
||
let mut bmap = BTreeMap::new();
|
||
bmap.insert("A", 1);
|
||
bmap.insert("B", 2);
|
||
bmap.insert("C", 3);
|
||
bmap.insert("D", 4);
|
||
bmap.insert("E", 5);
|
||
println!("{:?}", bmap);
|
||
// remove key-value
|
||
bmap.remove("C");
|
||
println!("{:?}", bmap);
|
||
// check for a specific one.
|
||
if !bmap.contains_key("C") {
|
||
//有的话return true 没有的话false
|
||
println!("{:?}", "C not font");
|
||
}
|
||
let mut data_vector = vec!["A", "B", "D"];
|
||
let str_value: &str = &each_value;
|
||
data_vector.push(str_value);
|
||
println!("{:?}", data_vector);
|
||
let mut out = BTreeMap::new();
|
||
for i in data_vector.iter() {
|
||
if bmap.get(i) != None {
|
||
let get_val = bmap.get(i);
|
||
out.insert(get_val, get_val);
|
||
println!("{:?}", get_val.to_owned());
|
||
}
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="types-in-rust"><a class="header" href="#types-in-rust">Types in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>pub fn run() {
|
||
// 默认情况下rust不需要声明
|
||
let x = 3; //默认i32
|
||
let y = 2.5; //默认f64
|
||
//添加声明
|
||
let k: i64 = 4515165161;
|
||
// i8最大小值
|
||
println!("MIN i8 {}", std::i8::MIN);
|
||
println!("MAX i8 {}", std::i8::MAX);
|
||
// i32最大小值
|
||
println!("MIN i32 {}", std::i32::MIN);
|
||
println!("MAX i32 {}", std::i32::MAX);
|
||
// i64最大小值
|
||
println!("MIN i64 {}", std::i64::MIN);
|
||
println!("MAX i64 {}", std::i64::MAX);
|
||
// i128最大小值
|
||
println!("MIN i128 {}", std::i128::MIN);
|
||
println!("MAX i128 {}", std::i128::MAX);
|
||
// isize (有符合)
|
||
let var_isize: isize = 9223372036854775807;
|
||
println!("{}", var_isize);
|
||
// usize (无符号)
|
||
let var_usize: usize = 1515;
|
||
println!("{}", var_usize);
|
||
//布尔类型
|
||
let name = true;
|
||
//声明布尔类型
|
||
let is_big: bool = 10 > 5;
|
||
let face = '\u{1f151}';
|
||
let a = 'a'; //char
|
||
println!("{:?}", (x, y, k, name, is_big, a, face));
|
||
// 无符号数
|
||
let data: u8 = 150;
|
||
println!("{:?}", data);
|
||
let data: u16 = 150;
|
||
println!("{:?}", data);
|
||
let data: u32 = 150;
|
||
println!("{:?}", data);
|
||
let data: u64 = 150;
|
||
println!("{:?}", data);
|
||
let data: u128 = 150;
|
||
println!("{:?}", data);
|
||
// 浮点数
|
||
let float_num: f32 = 2.;
|
||
println!("{}", float_num);
|
||
let float_num: f64 = 0.22222222;
|
||
println!("{}", float_num);
|
||
// char 字符
|
||
let chars: char = 'A'; //need to be '' ,not can be ""
|
||
let cn_name: char = '艾';
|
||
println!("{},{}", chars, cn_name);
|
||
// change type in rust
|
||
// int to float or u64,u32..
|
||
// as
|
||
let int_data: i32 = 2020;
|
||
let float_data = int_data as f32;
|
||
let u64_data: u64 = int_data as u64;
|
||
println!("int to float:{}", float_data + 0.5);
|
||
println!("int to u64:{}", u64_data);
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="vector-in-rust"><a class="header" href="#vector-in-rust">Vector in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>//vector是向量
|
||
pub fn run() {
|
||
let mut n: Vec<i32> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; //[元素属性;向量的元素个数]
|
||
//改某一个元素值
|
||
n[9] = 10;
|
||
//添加元素
|
||
n.push(23); //最后面添加元素
|
||
n.push(15);
|
||
//删除最后一个元素
|
||
let popeditem = n.pop();
|
||
// 输出删除的元素
|
||
println!("poped itemis :{}", popeditem.unwrap());
|
||
println!("{:#?}", n); //竖直输出
|
||
println!("{:?}", n); //横向输出
|
||
//单一输出
|
||
println!("frist value:{:?}", n[0]); //输出第一个元素
|
||
println!("last value:{:?}", n[n.len() - 1]); //输出最后一个元素
|
||
//向量长度
|
||
println!("向量长度:{}", n.len());
|
||
//向量所占空间
|
||
println!("occupies {} byte", std::mem::size_of_val(&n)); //每一个元素占4byte
|
||
//向量切片
|
||
let s = &n[0..5]; //从第0到第4个元素
|
||
println!("{:?}", s);
|
||
//向量的遍历
|
||
for x in n.iter() {
|
||
println!("{}", x);
|
||
}
|
||
//向量遍历时改值
|
||
for x in n.iter_mut() {
|
||
*x *= 3; //每一个元素乘2
|
||
}
|
||
println!("{:?}", n);
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="vecdeque-双向链表"><a class="header" href="#vecdeque-双向链表">VecDeque (双向链表)</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>use std::{collections::VecDeque};
|
||
pub fn run(){
|
||
let mut buff = VecDeque::new();
|
||
// add to front buffer
|
||
buff.push_front(1);
|
||
buff.push_front(4);
|
||
// add to end buffer
|
||
buff.push_back(10);
|
||
buff.push_back(40);
|
||
println!("{:?}", buff);
|
||
// Swaps elements at indices i and j.
|
||
buff.swap(0, 2);
|
||
println!("{:?}",buff);
|
||
//get capacity 占的空间
|
||
let len = buff.capacity();
|
||
println!("{}",len);
|
||
//get length
|
||
let length = buff.len();
|
||
println!("{}",length);
|
||
buff.reserve_exact(len);
|
||
println!("{:?}",buff);
|
||
//to Vec
|
||
let c: Vec<&i32> = buff.iter().collect();
|
||
println!("vec: {:?}",c);
|
||
//lop value
|
||
for num in buff.iter() {
|
||
let val = *num;
|
||
println!("{}",val);
|
||
}
|
||
//loop value and change
|
||
for num in buff.iter_mut() {
|
||
*num = *num - 2; }
|
||
println!("{:?}",buff);
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="enum-in-rust"><a class="header" href="#enum-in-rust">enum in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>#[allow(dead_code)]
|
||
enum Alphabet{
|
||
A,
|
||
B,
|
||
C,
|
||
D,
|
||
E,
|
||
Z,
|
||
W
|
||
}
|
||
impl Alphabet {
|
||
fn is_end_leter(&self) ->bool{
|
||
match self {
|
||
&Alphabet::Z =>return true,
|
||
_ =>return false
|
||
}
|
||
}
|
||
}
|
||
pub fn run(){
|
||
let d = Alphabet::Z;
|
||
println!("{:?}",d.is_end_leter());
|
||
}
|
||
//another example
|
||
enum Colors {
|
||
Red = 0xff0000,
|
||
Black = 0x000fff,
|
||
}
|
||
struct Bank{
|
||
pub cardnumber: String,
|
||
pub amount: f32,
|
||
}
|
||
enum Payments {
|
||
Cash(f32),
|
||
CirditCard(String,f32),
|
||
BankCard(Bank),
|
||
OnlineCard{user:String,amount:f32},
|
||
}
|
||
pub fn run(){
|
||
// use color enum
|
||
println!("{:06x}",Colors::Red as i32);
|
||
println!("{:06x}",Colors::Black as i32);
|
||
//use Payments enum
|
||
let cashpay = Payments::Cash(3000000.5);
|
||
process_payment(cashpay);
|
||
let cc_pay = Payments::CirditCard("jiaotong".to_owned(),1000000.66);
|
||
process_payment(cc_pay);
|
||
let bank_pay = Payments::BankCard(Bank{cardnumber:"622000111222111".to_owned(),amount:23000.});
|
||
process_payment(bank_pay);
|
||
let online = Payments::OnlineCard{user:"Alen".to_owned(),amount:600000.};
|
||
process_payment(online);
|
||
}
|
||
fn process_payment(pay:Payments){
|
||
match pay{
|
||
Payments::Cash(amt)=> {println!("It is{}",amt);}
|
||
Payments::CirditCard(_,amt)=> {println!("It is{}",amt);}
|
||
Payments::BankCard(data)=> {println!("It is{} {}",data.cardnumber,data.amount);}
|
||
Payments::OnlineCard{user,amount}=> {println!("It is{} {}",user,amount);}
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="sum-up-ascii_code"><a class="header" href="#sum-up-ascii_code">sum up ascii_code</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>fn sum_up_ascii_code(b: String) -> f64 {
|
||
let mut sum: u32 = 0;
|
||
for i in b.chars() {
|
||
sum += i as u32
|
||
}
|
||
return (sum as i32) as f64;
|
||
}
|
||
let result_1 = sum_up_ascii_code("AB".to_string());
|
||
println!("{}", result_1);
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="cell-in-rust"><a class="header" href="#cell-in-rust">Cell in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>#[allow(unused_variables)]
|
||
use std::cell::Cell;
|
||
/**
|
||
* Cell 原生值可以改
|
||
*/
|
||
#[allow(dead_code)]
|
||
struct Book {
|
||
name: String,
|
||
price: Cell<u32>,
|
||
}
|
||
pub fn run() {
|
||
let rust_book = Book {
|
||
name: "rust-book".into(),
|
||
price: Cell::new(99),
|
||
};
|
||
assert_eq!(rust_book.name, "rust-book");
|
||
assert_eq!(rust_book.price.get(), 99);
|
||
rust_book.price.set(199); //Cell 原生值可以改
|
||
assert_eq!(rust_book.price.get(), 199);
|
||
let s: String = "rust-book".into();
|
||
let bar = Cell::new(s);
|
||
bar.set("15".into()); //可以改值
|
||
let x = bar.into_inner(); //Get String value from Cell
|
||
println!("{}", x);
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="refcell-in-rust"><a class="header" href="#refcell-in-rust">RefCell in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>#[allow(unused_variables)]
|
||
use std::cell::RefCell;
|
||
/**
|
||
* RefCell 原生值可以改
|
||
*/
|
||
#[allow(dead_code)]
|
||
struct Book {
|
||
name: String,
|
||
price: RefCell<u32>,
|
||
}
|
||
pub fn run() {
|
||
let mut rust_book = Book {
|
||
name: "rust-book".into(),
|
||
price: RefCell::new(99),
|
||
};
|
||
assert_eq!(rust_book.name, "rust-book");
|
||
rust_book.price.borrow_mut(); //RefCell 原生值可以改
|
||
println!("{:?}", rust_book.price.borrow()); //99
|
||
println!("{:?}", rust_book.price.as_ptr()); //指针地址 0x7ffcb13f2c40
|
||
println!("{:?}", *rust_book.price.get_mut() + 10); //99+10 =>109
|
||
let s: String = "rust-book".into();
|
||
let bar = RefCell::new(s);
|
||
bar.borrow_mut().push_str(" 15"); //可以改值 为rust-book 15
|
||
let x = bar.into_inner(); //Get String value from refCell
|
||
println!("{}", x);
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="generic-in-rust"><a class="header" href="#generic-in-rust">generic in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>#[allow(dead_code)]
|
||
// structF32 Point{
|
||
// x:i32,
|
||
// y:i32,
|
||
// }
|
||
// structF64 Point{
|
||
// x:i32,
|
||
// y:i32,
|
||
// } //为了 通用不同的type 可以用以下的操作
|
||
//struct can be generic
|
||
struct Point<T, U> {
|
||
x: T,
|
||
y: U, //要是x y 的type不一样 <T,U>
|
||
}
|
||
// enum canbe generic
|
||
enum Selection<T> {
|
||
// OptionA(T),
|
||
OptionB(T),
|
||
// OptionC,
|
||
}
|
||
//function can be generic
|
||
// std::ops::Add is a trait
|
||
// fn dog<T:std::ops::Add<Output=T> + std::ops::Sub<Output=T> + std::fmt::Debug>(dog_age:T,father_age:T,child_age:E) -> T{
|
||
// println!("{:?}",father_age);
|
||
// let sub = dog_age-father_age;
|
||
// // let add = dog_age+father_age;
|
||
// sub
|
||
// } //这样写代码太长 下面做一些改善
|
||
fn dog<T, E>(dog_age: T, father_age: T, child_age: E) -> T
|
||
where
|
||
T: std::ops::Add<Output = T> + std::ops::Sub<Output = T> + std::fmt::Debug,
|
||
E: std::fmt::Debug,
|
||
{
|
||
println!("{:?}", father_age);
|
||
println!("{:?}", child_age);
|
||
dog_age + father_age
|
||
}
|
||
// create owen trait
|
||
// add str to string
|
||
trait AddStr {
|
||
fn add(&self, a: &str, b: &str) -> String;
|
||
}
|
||
#[allow(non_snake_case)]
|
||
#[allow(dead_code)]
|
||
// use trait
|
||
fn add_str_to_String<T>(var: &T) -> String
|
||
where
|
||
T: AddStr + std::fmt::Debug,
|
||
{
|
||
println!("{:?}", var);
|
||
var.add("Alen", "Andry")
|
||
}
|
||
// sttuct can be generic
|
||
struct Person<T, U>
|
||
where
|
||
T: std::fmt::Debug,
|
||
U: std::fmt::Debug,
|
||
{
|
||
name_t: T,
|
||
age_u: U,
|
||
}
|
||
impl<T, U> Person<T, U>
|
||
where
|
||
T: std::fmt::Debug,
|
||
U: std::fmt::Debug,
|
||
{
|
||
fn log(&self) {
|
||
println!("{:?} {:?}", self.name_t, self.age_u);
|
||
}
|
||
}
|
||
pub fn run() {
|
||
// generic struct
|
||
let a = Point {
|
||
x: 10_f32,
|
||
y: 30_i32,
|
||
}; //f32
|
||
println!("{} {}", a.x, a.y);
|
||
let a = Point {
|
||
x: 10.10_f32,
|
||
y: 30.6_f64,
|
||
}; //f64
|
||
println!("{} {}", a.x, a.y);
|
||
// generic enum
|
||
let s = Selection::OptionB("sting");
|
||
match s {
|
||
// Selection::OptionA(e)=> println!("{}",e),
|
||
Selection::OptionB(f) => println!("{}", f),
|
||
// Selection::OptionC => println!("option c"),
|
||
}
|
||
// generic function
|
||
let f = dog(10, 20, 5);
|
||
println!("{:?}", f);
|
||
// add_str_to_String
|
||
// use struct generic
|
||
let alen = Person {
|
||
name_t: "23",
|
||
age_u: "11",
|
||
};
|
||
alen.log();
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="linkedlist-链表"><a class="header" href="#linkedlist-链表">LinkedList (链表)</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>use std::collections::LinkedList;
|
||
// 链表
|
||
pub fn run() {
|
||
let mut list = LinkedList::new();
|
||
list.push_front("1");
|
||
list.push_front("2");
|
||
list.push_front("3");
|
||
list.push_back("10");
|
||
list.push_back("20");
|
||
list.push_back("30");
|
||
println!("{:?}", list);
|
||
// change list item type Sting ti int
|
||
let mut str_to_int = LinkedList::new();
|
||
for item in list.iter() {
|
||
str_to_int.push_back(item.parse::<i32>().unwrap());
|
||
}
|
||
println!("to int:{:?}", str_to_int);
|
||
let mut new_list = LinkedList::new();
|
||
new_list.push_front(1);
|
||
new_list.push_front(2);
|
||
new_list.push_front(3);
|
||
new_list.push_back(10);
|
||
new_list.push_back(20);
|
||
new_list.push_back(30);
|
||
println!("{:?}", new_list);
|
||
//change new_list type int to String
|
||
let mut int_to_string = LinkedList::new();
|
||
for item in new_list.iter() {
|
||
int_to_string.push_back(item.to_string());
|
||
}
|
||
println!("to str:{:?}", int_to_string);
|
||
// append Moves all elements from list2 to the end of the list.
|
||
// list.append(list2) list2 become empty
|
||
// convert a &str to a String is to_owned
|
||
// list 中的元素是&str int_to_string 是String 所以会出错
|
||
let mut list_sting = LinkedList::new();
|
||
for item in list.iter_mut() {
|
||
let new_item: String = item.to_owned(); //&str converto string
|
||
list_sting.push_back(new_item);
|
||
}
|
||
list_sting.append(&mut int_to_string); //int_to_string to the end of list_sting
|
||
println!("{:?}", list_sting);
|
||
// pub fn back(&self) -> Option<&T>
|
||
// assert_eq!(list_sting.back(),Some(&Sting::from("30")));
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="module-in-rust"><a class="header" href="#module-in-rust">module in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>// 可以直接定义mod
|
||
mod printer{
|
||
pub fn print(data:String){
|
||
println!("{}",data);
|
||
}
|
||
// 也可以在mod 里面定义mod
|
||
pub mod show{
|
||
pub fn show_age(age:&str){
|
||
println!("age :{}",age);
|
||
}
|
||
}
|
||
}
|
||
pub fn run(){
|
||
printer::print("Alen".to_string());
|
||
printer::show::show_age("24");
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="options-in-rust"><a class="header" href="#options-in-rust">options in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>pub fn run() {
|
||
println!(
|
||
"job is {}",
|
||
match get_job("Alen") {
|
||
Some(j) => j,
|
||
None => "no find",
|
||
}
|
||
);
|
||
}
|
||
fn get_job(name: &str) -> Option<&str> {
|
||
match name {
|
||
"Alen" => Some("Software developer"),
|
||
"Andry" => Some("Web Disigner"),
|
||
_ => None,
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="parse-json-in-rust"><a class="header" href="#parse-json-in-rust">parse json in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>extern crate serde;
|
||
extern crate serde_json;
|
||
// #[macro_use]
|
||
// extern crate serde_derive;
|
||
#[allow(unused_imports)]
|
||
use serde_json::Value as jsonvalue;
|
||
// #[derive(Serialize,Deserialize)]
|
||
#[allow(dead_code)]
|
||
// struct Person {
|
||
// name: String,
|
||
// age: u32,
|
||
// is_male: bool,
|
||
// language: String,
|
||
// }
|
||
pub fn run() {
|
||
let json_string = r#"
|
||
{
|
||
"name":"Alen Andry",
|
||
"age":"24",
|
||
"is_male":true,
|
||
"language":"English"
|
||
}
|
||
"#;
|
||
let res = serde_json::from_str(json_string);
|
||
if res.is_ok() {
|
||
let p: jsonvalue = res.unwrap();
|
||
println!("name = {:?}", &p["name"].as_str().unwrap());
|
||
println!("age = {:?}", &p["age"].as_str().unwrap());
|
||
println!("is_male = {:?}", &p["is_male"]);
|
||
println!("language = {:?}", &p["language"]);
|
||
} else {
|
||
println!("not get json");
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="generate-random-number-in-rust"><a class="header" href="#generate-random-number-in-rust">generate random number in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>extern crate rand;
|
||
use rand::Rng;
|
||
pub fn run() {
|
||
{
|
||
//range random num
|
||
let random_num = rand::thread_rng().gen_range(10, 25); //1-24
|
||
println!("{}", random_num);
|
||
}
|
||
{
|
||
//randim boolean value
|
||
let bool = rand::thread_rng().gen_weighted_bool(2); //概率0.5 为true
|
||
let bool1 = rand::thread_rng().gen_weighted_bool(5); //概率1/5=0.2 为true
|
||
println!("random boolean {} {}", bool, bool1);
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="read-file-in-rust"><a class="header" href="#read-file-in-rust">read file in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>use std::fs::File;
|
||
use std::io::prelude::*;
|
||
#[allow(unused_imports)]
|
||
use std::io::{BufRead, BufReader, Error, Write};
|
||
#[allow(dead_code)]
|
||
pub fn run() {
|
||
{
|
||
//read toml file
|
||
let mut toml_file = File::open("toml_file.toml").expect("Can't open");
|
||
let mut content = String::new();
|
||
toml_file
|
||
.read_to_string(&mut content)
|
||
.expect("Can't to string");
|
||
println!("toml file content:{}", content);
|
||
}
|
||
{
|
||
//read txt file
|
||
let mut txt_file =
|
||
File::open("/home/alen/code/rust_code/rust_grammar/txt_file.txt").expect("Can't open");
|
||
let mut content = String::new();
|
||
txt_file
|
||
.read_to_string(&mut content)
|
||
.expect("Can't to string");
|
||
println!("txt file content:{}", content);
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="write-file-in-rust"><a class="header" href="#write-file-in-rust">write file in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>use std::fs::File;
|
||
use std::io::prelude::*;
|
||
pub fn run() {
|
||
{
|
||
//write toml
|
||
let mut toml_file = File::create("output.toml").expect("can't create file");
|
||
toml_file
|
||
.write_all(b"[output]\ndata = \"output.toml\"")
|
||
.expect("can't write");
|
||
}
|
||
{
|
||
//write txt
|
||
let mut txt_file = File::create("output.txt").expect("can't create file");
|
||
txt_file
|
||
.write_all(b"txt file\ndata = \"output.txt\"")
|
||
.expect("can't write");
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="regex-in-rust"><a class="header" href="#regex-in-rust">regex in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>extern crate regex;
|
||
use regex::Regex;
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>pub fn run() {
|
||
{//captures
|
||
let re = Regex::new(r"(?x)(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})").unwrap();
|
||
let caps = re.captures("2010-03-1400").unwrap();
|
||
dbg!(&caps[0]);
|
||
dbg!(&caps["year"]);
|
||
}
|
||
{//captures_iter 可遍历
|
||
let re = Regex::new(r"(?x)(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})").unwrap();
|
||
let caps = re.captures_iter("2010-03-1400");
|
||
for i in caps {
|
||
dbg!(&i);
|
||
}
|
||
}
|
||
{
|
||
let re = Regex::new(r"(\d{5})").unwrap(); //match 5个数
|
||
let txt = "12345";
|
||
println!("{}", re.is_match(txt));
|
||
match re.captures(txt) {
|
||
Some(val) => println!("{}", &val[0]),
|
||
None => println!("none"),
|
||
}
|
||
}
|
||
{//str to vec! split str to Vec
|
||
let re = Regex::new(r"[ \t]+").unwrap();
|
||
let fields: Vec<&str> = re.split("a b \t c\td e").collect();
|
||
dbg!(&fields);
|
||
assert_eq!(fields, vec!["a", "b", "c", "d", "e"]);
|
||
}
|
||
{//is match 返回 true flase
|
||
let text = "I categorically deny having";
|
||
dbg!(Regex::new(r"\b\w{4}\b").unwrap().is_match(text)); //regex 匹配四个字母 存在的话返回true
|
||
assert!(Regex::new(r"\b\w{4}\b").unwrap().is_match(text));
|
||
}
|
||
{//find
|
||
let text = "I alen categorically deny having triskaidekaphobia.";
|
||
let mat = Regex::new(r"\b\w{4}\b").unwrap().find(text).unwrap(); //从左开始匹配 返回满足条件的开始 结束index
|
||
dbg!(mat);
|
||
}
|
||
{//NoExpand
|
||
use regex::NoExpand;
|
||
let re = Regex::new(r"(?P<last>[^,\s]+),\s+(\S+)").unwrap();
|
||
let result = re.replace("^Springsteen, Bruce", NoExpand("$2 $last"));
|
||
dbg!(result);
|
||
}
|
||
{//返回first match 的位置
|
||
let text = "aaaaa";
|
||
let pos = Regex::new(r"a+").unwrap().shortest_match(text);
|
||
dbg!(pos.unwrap());
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="字符串反转-reverse-string"><a class="header" href="#字符串反转-reverse-string">字符串反转 reverse string</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>fn reverse(phrase:&str)-> String {
|
||
let mut i = phrase.len();
|
||
let mut reversed = String::new();
|
||
while i > 0 {
|
||
reversed.push(phrase.chars().nth(i - 1).unwrap());
|
||
i -= 1;
|
||
}
|
||
reversed
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="等待执行-函数"><a class="header" href="#等待执行-函数">等待执行 函数</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>use std::thread;
|
||
use std::time::{Duration, Instant};
|
||
fn expensive_function() {
|
||
//一秒后执行的函数
|
||
thread::sleep(Duration::from_secs(1));
|
||
}
|
||
pub fn run() {
|
||
let start = Instant::now(); //开始计时
|
||
expensive_function();
|
||
expensive_function();
|
||
expensive_function();
|
||
expensive_function();
|
||
expensive_function();
|
||
let duration = start.elapsed(); //停止计时
|
||
println!("Time elapsed in expensive_function() is: {:?}", duration); //run expensive_function() 经历的时间
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="string-in-rust"><a class="header" href="#string-in-rust">String in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>#[allow(unused_variables)]
|
||
pub fn run() {
|
||
// str 不可变
|
||
let str: &str = "Hello";
|
||
println!("{}", str);
|
||
// string 可变
|
||
let string = String::from("Hello world");
|
||
println!("{}", string);
|
||
// convert &srt to String &str转化为string
|
||
let some_str: &str = "data";
|
||
let sring_from_str = some_str.to_owned();
|
||
assert_eq!(sring_from_str, String::from("data"));
|
||
{
|
||
// string to &str
|
||
let name = String::from("Alen Andry");
|
||
let name_str: &str = name.as_str();
|
||
println!("&str:{}", name_str);
|
||
}
|
||
let i = 5;
|
||
let five = String::from("5");
|
||
assert_eq!(five, i.to_string());
|
||
let mut name = String::from("Alen ");
|
||
//添加char
|
||
name.push('A');
|
||
//添加string
|
||
name.push_str("ndry");
|
||
//长度
|
||
let length = name.len();
|
||
//所占字节
|
||
let capacity = name.capacity();
|
||
// 字符串是否空
|
||
let is_empty = name.is_empty();
|
||
//是否包含子串
|
||
let contains = name.contains("Andry");
|
||
//交换子串
|
||
let change = name.replace("Andry", "Dnrops"); // Andry->Dnrops
|
||
println!("name:{:?}\nlength:{:?}", (name), (length));
|
||
println!("capacity:{:?}\nis_empy:{:?}", (capacity), (is_empty));
|
||
println!("Is Andry contains name:{:?}", (contains));
|
||
println!("{}", change);
|
||
//遍历string (按空格)
|
||
for word in name.split_whitespace() {
|
||
println!("{}", word);
|
||
}
|
||
// 按字节新建string
|
||
let mut s = String::with_capacity(10); //新建大小为10字节的string
|
||
s.push('a'); //在string里添加元素
|
||
s.push('B');
|
||
println!("{}", s);
|
||
//断言测试 (测试左右值是否相等)
|
||
//assert_eq!(1,2);
|
||
//只有不相等时提示错误
|
||
assert_eq!(2, s.len());
|
||
assert_eq!(10, s.capacity());
|
||
// push
|
||
let mut some_string = String::new();
|
||
some_string.push('a');
|
||
some_string.push('a');
|
||
some_string.push('a');
|
||
some_string.push('a');
|
||
// push_str
|
||
some_string.push_str("\tmy name is alen");
|
||
println!("{}", some_string);
|
||
//combine two string
|
||
let new_some_string = String::from(" mali");
|
||
let mut_string = String::from(" Andry");
|
||
let my_mali: String = String::from("I LOVE MICHELLE");
|
||
let combined_string = some_string + &new_some_string + &mut_string + &my_mali;
|
||
println!("{}", combined_string);
|
||
// substring
|
||
let sub_string = &combined_string[..5]; //0-4
|
||
let sub_string1 = &combined_string[16..]; //16-end
|
||
let sub_string2 = &combined_string[16..20]; //16-20
|
||
println!("{}\n{}\n{}", sub_string, sub_string1, sub_string2);
|
||
// get char by index
|
||
let mali: String = String::from("I LOVE MICHELLE");
|
||
let get_char_index2 = &mali.chars().nth(2).unwrap();
|
||
println!("{}", get_char_index2);
|
||
// for 遍历 String
|
||
for item in 0..mali.len() {
|
||
println!("{}", &mali.chars().nth(item).unwrap());
|
||
}
|
||
// match Sting
|
||
let get_char_index3 = &mali.chars().nth(5);
|
||
match get_char_index3 {
|
||
Some(i) => println!("It is {}", i),
|
||
None => {}
|
||
}
|
||
// if let 跟 match 一样
|
||
if let Some(i) = &mali.chars().nth(5) {
|
||
println!("It is {}", i);
|
||
}
|
||
//删除俩端的空格
|
||
{
|
||
let name = " Alen ".to_string();
|
||
println!("before :{}", name);
|
||
let after = name.trim();
|
||
println!("after:{}", after);
|
||
}
|
||
{
|
||
//转化为大写
|
||
let mut s = String::from("foobar");
|
||
let s_mut_str = s.as_mut_str();
|
||
s_mut_str.make_ascii_uppercase();
|
||
println!("uppercase :{}", s_mut_str);
|
||
}
|
||
{
|
||
//转化为ascii码
|
||
let s = String::from("hello");
|
||
let s_ascii_str: &[u8] = s.as_bytes();
|
||
println!("ascii:{:?}", s_ascii_str);
|
||
}
|
||
{
|
||
//string 反转化
|
||
let mut s = String::from("hello");
|
||
unsafe {
|
||
let vec = s.as_mut_vec();
|
||
assert_eq!(&[104, 101, 108, 108, 111][..], &vec[..]);
|
||
vec.reverse();
|
||
}
|
||
assert_eq!(s, "olleh");
|
||
println!("reversed:{}", s);
|
||
}
|
||
{
|
||
//清空string
|
||
let mut s = String::from("foo");
|
||
s.clear();
|
||
assert!(s.is_empty());
|
||
assert_eq!(0, s.len());
|
||
assert_eq!(3, s.capacity());
|
||
}
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="struct-结构体"><a class="header" href="#struct-结构体">struct 结构体</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>//结构体(name field struct)
|
||
// struct name 第一个字母必须得大写
|
||
struct Book {
|
||
name: String,
|
||
athur: String,
|
||
}
|
||
//tuple struct (元组结构体)
|
||
struct Cellphone(&'static str, String, u64);
|
||
//单元结构体
|
||
struct Empty;
|
||
//结构体创建函数
|
||
struct Person {
|
||
f_name: String,
|
||
l_name: String,
|
||
}
|
||
//结构体创建函数
|
||
impl Person {
|
||
//
|
||
fn new_str(m: &str, n: &str) -> Person {
|
||
// return Person{name:f_name,lname:l_name};
|
||
Person {
|
||
f_name: m.to_string(),
|
||
l_name: n.to_string(),
|
||
}
|
||
}
|
||
//full name // 使用在impl里面
|
||
fn full_name(&self) -> String {
|
||
format!("{} {}", self.f_name, self.l_name)
|
||
}
|
||
//set last name
|
||
fn set_last_name(&mut self, last: &str) {
|
||
self.l_name = last.to_string();
|
||
}
|
||
//name to tuple(转化为元组)
|
||
fn to_tuple(self) -> (String, String) {
|
||
(self.f_name, self.l_name)
|
||
}
|
||
}
|
||
// define some struct
|
||
struct FrameworkAndCompany {
|
||
msn: String,
|
||
pytorch: String,
|
||
tensorflow: String,
|
||
}
|
||
pub fn run() {
|
||
//调用(name field struct)
|
||
let mut c = Book {
|
||
name: "RUST".to_string(),
|
||
athur: String::from("Alen"),
|
||
};
|
||
c.athur = String::from("Andry");
|
||
println!("{} {}", c.name, c.athur);
|
||
//调用(tuple struct)
|
||
let mut phone = Cellphone("redmi", String::from("alen"), 2019);
|
||
phone.1 = String::from("Alen");
|
||
println!("marka is {} owener: {} year:{}", phone.0, phone.1, phone.2);
|
||
//调用单元结构体
|
||
let x = Empty;
|
||
println!("{:p}", &x); //输出X的内存地址
|
||
//调用结构体创建函数
|
||
let mut p = Person::new_str("marry", "tusun");
|
||
println!("{} {}", p.f_name, p.l_name);
|
||
println!("full name: {}", p.full_name());
|
||
p.set_last_name("abduginy");
|
||
println!("full name: {}", p.full_name());
|
||
println!("full name to tuple: {:?}", p.to_tuple());
|
||
// use framework struct
|
||
let mut frames = FrameworkAndCompany {
|
||
tensorflow: "google".to_owned(),
|
||
msn: "MSN".to_owned(),
|
||
pytorch: "facebook".to_owned(),
|
||
};
|
||
//change name
|
||
frames.tensorflow = String::from("GOOGLE");
|
||
println!(" {:?}", frames.tensorflow);
|
||
println!(" {:?}", frames.msn);
|
||
println!(" {:?}", frames.pytorch);
|
||
let frames2 = FrameworkAndCompany {
|
||
msn: String::from("Dark Commany"),
|
||
..frames // 来填充剩下的 struct element
|
||
};
|
||
println!("{:?}", frames2.pytorch);
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="test-code-in-rust"><a class="header" href="#test-code-in-rust">Test code in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>//结构体(name field struct)
|
||
// struct name 第一个字母必须得大写
|
||
struct Book {
|
||
name: String,
|
||
athur: String,
|
||
}
|
||
//tuple struct (元组结构体)
|
||
struct Cellphone(&'static str, String, u64);
|
||
//单元结构体
|
||
struct Empty;
|
||
//结构体创建函数
|
||
struct Person {
|
||
f_name: String,
|
||
l_name: String,
|
||
}
|
||
//结构体创建函数
|
||
impl Person {
|
||
//
|
||
fn new_str(m: &str, n: &str) -> Person {
|
||
// return Person{name:f_name,lname:l_name};
|
||
Person {
|
||
f_name: m.to_string(),
|
||
l_name: n.to_string(),
|
||
}
|
||
}
|
||
//full name // 使用在impl里面
|
||
fn full_name(&self) -> String {
|
||
format!("{} {}", self.f_name, self.l_name)
|
||
}
|
||
//set last name
|
||
fn set_last_name(&mut self, last: &str) {
|
||
self.l_name = last.to_string();
|
||
}
|
||
//name to tuple(转化为元组)
|
||
fn to_tuple(self) -> (String, String) {
|
||
(self.f_name, self.l_name)
|
||
}
|
||
}
|
||
// define some struct
|
||
struct FrameworkAndCompany {
|
||
msn: String,
|
||
pytorch: String,
|
||
tensorflow: String,
|
||
}
|
||
pub fn run() {
|
||
//调用(name field struct)
|
||
let mut c = Book {
|
||
name: "RUST".to_string(),
|
||
athur: String::from("Alen"),
|
||
};
|
||
c.athur = String::from("Andry");
|
||
println!("{} {}", c.name, c.athur);
|
||
//调用(tuple struct)
|
||
let mut phone = Cellphone("redmi", String::from("alen"), 2019);
|
||
phone.1 = String::from("Alen");
|
||
println!("marka is {} owener: {} year:{}", phone.0, phone.1, phone.2);
|
||
//调用单元结构体
|
||
let x = Empty;
|
||
println!("{:p}", &x); //输出X的内存地址
|
||
//调用结构体创建函数
|
||
let mut p = Person::new_str("marry", "tusun");
|
||
println!("{} {}", p.f_name, p.l_name);
|
||
println!("full name: {}", p.full_name());
|
||
p.set_last_name("abduginy");
|
||
println!("full name: {}", p.full_name());
|
||
println!("full name to tuple: {:?}", p.to_tuple());
|
||
// use framework struct
|
||
let mut frames = FrameworkAndCompany {
|
||
tensorflow: "google".to_owned(),
|
||
msn: "MSN".to_owned(),
|
||
pytorch: "facebook".to_owned(),
|
||
};
|
||
//change name
|
||
frames.tensorflow = String::from("GOOGLE");
|
||
println!(" {:?}", frames.tensorflow);
|
||
println!(" {:?}", frames.msn);
|
||
println!(" {:?}", frames.pytorch);
|
||
let frames2 = FrameworkAndCompany {
|
||
msn: String::from("Dark Commany"),
|
||
..frames // 来填充剩下的 struct element
|
||
};
|
||
println!("{:?}", frames2.pytorch);
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="数组中找到最小的"><a class="header" href="#数组中找到最小的">数组中找到最小的</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>pub fn find_smallest_int(arr: &[i32]) -> i32 {
|
||
let mut arr_vec = arr.to_vec(); //to_vec 是 arr转化为 vec
|
||
arr_vec.sort();
|
||
println!("{}", arr_vec[0]);
|
||
arr_vec[0]
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="fib-in-rust"><a class="header" href="#fib-in-rust">fib in rust</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>pub fn run() {
|
||
//produce fib
|
||
fn product_fib(prod: u64) {
|
||
// your code
|
||
let mut p: i64 = prod as i64;
|
||
fn fib(n: u64) -> u64 {
|
||
match n {
|
||
0 => 1,
|
||
1 => 1,
|
||
_ => fib(n - 1) + fib(n - 2),
|
||
}
|
||
}
|
||
let mut list: Vec<u64> = Vec::new();
|
||
while p > -1 {
|
||
list.push(fib(p as u64));
|
||
p -= 1;
|
||
}
|
||
println!("{:?}", list);
|
||
}
|
||
product_fib(8); //produce 8 number
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="rust-数组中删除重复的部分"><a class="header" href="#rust-数组中删除重复的部分">rust 数组中删除重复的部分</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>#[allow(dead_code)]
|
||
#[allow(unused_variables)]
|
||
#[allow(unused_mut)]
|
||
pub fn run() {
|
||
fn unique_in_order<T>(sequence: T) -> Vec<T::Item>
|
||
where
|
||
T: std::iter::IntoIterator,
|
||
T::Item: std::cmp::PartialEq + std::fmt::Debug,
|
||
{
|
||
let mut v: Vec<_> = sequence.into_iter().collect();
|
||
v.dedup();
|
||
v
|
||
}
|
||
let data = vec!["A", "A", "B", "b", "b", "b"];
|
||
let data2 = "AAAABBBCCDAABBB".chars();
|
||
println!("{:?}", unique_in_order(data)); //["A", "B", "b"]
|
||
println!("{:?}", unique_in_order(data2)); //['A', 'B', 'C', 'D', 'A', 'B']
|
||
}
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="enumerate-遍历"><a class="header" href="#enumerate-遍历">enumerate (遍历)</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust">pub mod c {
|
||
pub fn run() {
|
||
use proconio::{input, marker::*};
|
||
input! {
|
||
mut s: Chars,
|
||
}
|
||
let s = s
|
||
.iter_mut()
|
||
.map(|x| x.to_string().parse::<i32>().unwrap())
|
||
.collect::<Vec<_>>();
|
||
// println!("{:?}", s);
|
||
let mut items = Vec::new();
|
||
let mut indexs = Vec::new();
|
||
for (index, item) in s.iter().enumerate() {
|
||
items.push(item.to_string());
|
||
indexs.push(index.to_string());
|
||
// println!(
|
||
// "{} {}",
|
||
// s.len() as i32 - index.to_owned() as i32,
|
||
// item.to_owned()
|
||
// );
|
||
}
|
||
//if s = 145
|
||
println!("{:?}", indexs); //["0", "1", "2"]
|
||
println!("{:?}", items); //["1", "4", "5"]
|
||
}
|
||
}
|
||
fn main() {
|
||
c::run();
|
||
}</code></pre></pre>
|
||
<h2 id="quick-start-iter-fold"><a class="header" href="#quick-start-iter-fold">quick start iter fold()</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>let a = [1, 2, 3];
|
||
// the sum of all of the elements of the array
|
||
let sum = a.iter().fold((0,0), |init, x|
|
||
{
|
||
let n = init.0+*x;
|
||
let m = init.1+*x;
|
||
(n,m)
|
||
}
|
||
);
|
||
eprintln!("{:?}",sum);
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<h2 id="select-mul-atcoder_abc_221_c"><a class="header" href="#select-mul-atcoder_abc_221_c">Select Mul (Atcoder_abc_221_C)</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust"><span class="boring">#![allow(unused)]
|
||
</span><span class="boring">fn main() {
|
||
</span>Sample Input 1
|
||
123
|
||
Sample Output 1
|
||
63
|
||
As described in Problem Statement, there are six ways to separate it:
|
||
12 and 3,
|
||
21 and 3,
|
||
13 and 2,
|
||
31 and 2,
|
||
23 and 1,
|
||
32 and 1.
|
||
The products of these pairs, in this order, are 36, 63, 26, 62, 23, 32, with 63 being the maximum.
|
||
<span class="boring">}</span></code></pre></pre>
|
||
<pre><pre class="playground"><code class="language-rust">//solution for problem C
|
||
/*
|
||
input: 123
|
||
out: 63
|
||
{"1": "23", "12": "3", "3": "21", "31": "2", "32": "1"}
|
||
[23, 32, 36, 62, 63] ->out max value
|
||
*/
|
||
pub mod c {
|
||
pub fn run() {
|
||
use proconio::{input, marker::*};
|
||
use std::collections::BTreeMap;
|
||
input! {
|
||
mut s: Chars,
|
||
}
|
||
//reverse
|
||
fn reverse(phrase: String) -> String {
|
||
let mut i = phrase.len();
|
||
let mut reversed = String::new();
|
||
while i > 0 {
|
||
reversed.push(phrase.chars().nth(i - 1).unwrap());
|
||
i -= 1;
|
||
}
|
||
reversed
|
||
}
|
||
let s = s.iter_mut().map(|x| x.to_string()).collect::<Vec<_>>();
|
||
//generate bmap
|
||
fn generate_bmap(s: Vec<String>) {
|
||
let s_string = s.join("").to_string();
|
||
let mut bmap: BTreeMap<String, String> = BTreeMap::new();
|
||
for i in 1..s_string.len() {
|
||
let mut s_string = s.clone().join("").to_string();
|
||
let s_string_l = s_string.split_off(i);
|
||
bmap.insert(s_string, s_string_l);
|
||
}
|
||
for i in 1..s_string.len() {
|
||
let mut s_string = reverse(s.clone().join("").to_string());
|
||
let s_string_l = s_string.split_off(i);
|
||
bmap.insert(s_string, s_string_l);
|
||
}
|
||
let mut first_last_string = s.clone()[s.len() - 1].to_string();
|
||
first_last_string.push_str(&s.clone()[0].to_owned());
|
||
let mut middle_string = String::new();
|
||
for i in 1..s.len() - 1 {
|
||
middle_string.push_str(&s.clone()[i]);
|
||
}
|
||
bmap.insert(first_last_string, middle_string);
|
||
let mut vec = vec![];
|
||
for (v, k) in &bmap {
|
||
vec.push(
|
||
v.to_owned().parse::<i128>().unwrap() * k.to_owned().parse::<i128>().unwrap(),
|
||
);
|
||
}
|
||
vec.sort();
|
||
println!("{:?}", vec[vec.len() - 1]);
|
||
// println!("{:?}", bmap);
|
||
// println!("{:?}", vec);
|
||
}
|
||
generate_bmap(s.clone());
|
||
}
|
||
}
|
||
fn main() {
|
||
c::run();
|
||
}</code></pre></pre>
|
||
<h2 id="online-games-atcoder_abc_221_d"><a class="header" href="#online-games-atcoder_abc_221_d">Online games (Atcoder_abc_221_D)</a></h2>
|
||
<pre><pre class="playground"><code class="language-rust">//solution for problem D
|
||
// 3
|
||
// 1 2
|
||
// 2 3
|
||
// 3 1
|
||
mod d {
|
||
pub fn run() {
|
||
proconio::input! {
|
||
n: usize,
|
||
ab: [(u32, u32); n],
|
||
}
|
||
let mut m = std::collections::BTreeMap::new();
|
||
for (a, b) in ab {
|
||
*m.entry(a).or_insert(0) += 1;
|
||
*m.entry(a + b).or_insert(0) -= 1;
|
||
}
|
||
let mut d = vec![0; n + 1];
|
||
let mut p = 0;
|
||
let mut k = 0;
|
||
for (i, j) in m {
|
||
d[k as usize] += i - p;
|
||
p = i;
|
||
k += j;
|
||
}
|
||
d.remove(0);
|
||
println!(
|
||
"{:?}",
|
||
d.iter_mut()
|
||
.map(|x| x.to_string())
|
||
.collect::<Vec<_>>()
|
||
.join(" ")
|
||
);
|
||
}
|
||
}
|
||
fn main() {
|
||
d::run();
|
||
}</code></pre></pre>
|
||
|
||
</main>
|
||
|
||
<nav class="nav-wrapper" aria-label="Page navigation">
|
||
<!-- Mobile navigation buttons -->
|
||
<a rel="prev" href="../../posts/rust/offline_use_rust.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||
<i class="fa fa-angle-left"></i>
|
||
</a>
|
||
|
||
<a rel="next prefetch" href="../../posts/rust/pase_string_and_decimal_conversion.html" class="mobile-nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||
<i class="fa fa-angle-right"></i>
|
||
</a>
|
||
|
||
<div style="clear: both"></div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<nav class="nav-wide-wrapper" aria-label="Page navigation">
|
||
<a rel="prev" href="../../posts/rust/offline_use_rust.html" class="nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left">
|
||
<i class="fa fa-angle-left"></i>
|
||
</a>
|
||
|
||
<a rel="next prefetch" href="../../posts/rust/pase_string_and_decimal_conversion.html" class="nav-chapters next" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right">
|
||
<i class="fa fa-angle-right"></i>
|
||
</a>
|
||
</nav>
|
||
|
||
</div>
|
||
|
||
|
||
|
||
<script>
|
||
window.playground_line_numbers = true;
|
||
</script>
|
||
|
||
<script>
|
||
window.playground_copyable = true;
|
||
</script>
|
||
|
||
<script src="../../ace.js"></script>
|
||
<script src="../../editor.js"></script>
|
||
<script src="../../mode-rust.js"></script>
|
||
<script src="../../theme-dawn.js"></script>
|
||
<script src="../../theme-tomorrow_night.js"></script>
|
||
|
||
<script src="../../elasticlunr.min.js"></script>
|
||
<script src="../../mark.min.js"></script>
|
||
<script src="../../searcher.js"></script>
|
||
|
||
<script src="../../clipboard.min.js"></script>
|
||
<script src="../../highlight.js"></script>
|
||
<script src="../../book.js"></script>
|
||
|
||
<!-- Custom JS scripts -->
|
||
<script src="../../src/js/custom.js"></script>
|
||
|
||
|
||
</div>
|
||
</body>
|
||
</html>
|