คำถามติดแท็ก rust

Rust เป็นภาษาการเขียนโปรแกรมระบบโดยไม่ต้องมีตัวรวบรวมขยะโดยมุ่งเน้นที่เป้าหมายสามประการ ได้แก่ ความปลอดภัยความเร็วและการทำงานพร้อมกัน ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัสที่เขียนใน Rust ใช้แท็กเฉพาะของรุ่นสำหรับคำถามที่อ้างถึงรหัสที่ต้องใช้กับรุ่นใดรุ่นหนึ่งเช่น [rust-2018] ใช้แท็กเฉพาะเจาะจงมากขึ้นสำหรับหัวข้อย่อยเช่น [การเกิดสนิมสินค้า] และ [การเกิดสนิมมาโคร]

1
การปิดใช้ Fn, FnMut และ FnOnce เมื่อใด
อะไรคือเงื่อนไขที่เฉพาะเจาะจงสำหรับการปิดการใช้Fn, FnMutและFnOnceลักษณะ? นั่นคือ: เมื่อใดที่การปิดไม่ใช้FnOnceลักษณะ? เมื่อใดที่การปิดไม่ใช้FnMutลักษณะ? เมื่อใดที่การปิดไม่ใช้Fnลักษณะ? ยกตัวอย่างเช่นกรรมวิธีรัฐของการปิดบนของร่างกายทำให้คอมไพเลอร์ไม่ได้ดำเนินการFnเกี่ยวกับมัน
114 rust  closures 

5
เป็นไปได้ไหมที่จะใช้ตัวแปรส่วนกลางใน Rust
ฉันรู้ว่าโดยทั่วไปต้องหลีกเลี่ยงตัวแปรส่วนกลาง อย่างไรก็ตามฉันคิดว่าในทางปฏิบัติบางครั้งก็เป็นที่พึงปรารถนา (ในสถานการณ์ที่ตัวแปรเป็นส่วนสำคัญของโปรแกรม) ที่จะใช้พวกเขา เพื่อเรียนรู้ Rust ฉันกำลังเขียนโปรแกรมทดสอบฐานข้อมูลโดยใช้ sqlite3 และแพ็คเกจ Rust / sqlite3 บน GitHub ดังนั้นสิ่งนี้จำเป็น (ในโปรแกรมทดสอบของฉัน) (เป็นทางเลือกแทนตัวแปรส่วนกลาง) เพื่อส่งผ่านตัวแปรฐานข้อมูลระหว่างฟังก์ชันที่มีประมาณหนึ่งโหล ตัวอย่างอยู่ด้านล่าง เป็นไปได้และเป็นไปได้หรือไม่ที่จะใช้ตัวแปรส่วนกลางใน Rust จากตัวอย่างด้านล่างฉันสามารถประกาศและใช้ตัวแปรส่วนกลางได้หรือไม่ extern crate sqlite; fn main() { let db: sqlite::Connection = open_database(); if !insert_data(&db, insert_max) { return; } } ฉันลองทำสิ่งต่อไปนี้ แต่ดูเหมือนจะไม่ถูกต้องนักและส่งผลให้เกิดข้อผิดพลาดด้านล่าง (ฉันลองด้วยunsafeบล็อกด้วย): extern crate sqlite; static mut DB: Option<sqlite::Connection> …

2
วิธีใช้ลังที่ไม่ได้เผยแพร่ในท้องถิ่น
ฉันสร้างห้องสมุด: cargo new my_lib และฉันต้องการใช้ไลบรารีนั้นในโปรแกรมอื่น: cargo new my_program --bin extern crate my_lib; fn main { println!("Hello, World!"); } ฉันต้องทำอย่างไรจึงจะได้ผล ไม่ได้อยู่ในโฟลเดอร์โครงการเดียวกัน . ├── my_lib └── my_program หวังว่านี่จะสมเหตุสมผล ฉันคิดว่าจะสามารถลบล้างเส้นทางได้ตามคู่มือการขนส่งสินค้าแต่มันระบุ คุณไม่สามารถใช้คุณสมบัตินี้เพื่อบอกคาร์โก้ว่าจะหาลังที่ไม่ได้เผยแพร่ในท้องถิ่นได้อย่างไร นี่คือเมื่อใช้ Rust (1.3) เวอร์ชันเสถียรล่าสุด

2
เมื่อใดจึงเหมาะสมที่จะใช้ประเภทที่เกี่ยวข้องกับประเภททั่วไป
ในคำถามนี้ปัญหาเกิดขึ้นที่สามารถแก้ไขได้โดยเปลี่ยนความพยายามในการใช้พารามิเตอร์ประเภททั่วไปเป็นประเภทที่เกี่ยวข้อง นั่นทำให้เกิดคำถาม "เหตุใดประเภทที่เกี่ยวข้องจึงเหมาะสมกว่าที่นี่" ซึ่งทำให้ฉันต้องการทราบข้อมูลเพิ่มเติม RFC ที่นำประเภทที่เกี่ยวข้องพูดว่า: RFC นี้ชี้แจงการจับคู่ลักษณะโดย: การปฏิบัติต่อพารามิเตอร์ชนิดลักษณะทั้งหมดเป็นประเภทอินพุตและ การให้บริการประเภทที่เกี่ยวข้องซึ่งเป็นประเภทเอาท์พุท RFC ใช้โครงสร้างกราฟเป็นตัวอย่างที่สร้างแรงจูงใจและยังใช้ในเอกสารประกอบแต่ฉันจะยอมรับว่าไม่เห็นคุณค่าประโยชน์ของเวอร์ชันประเภทที่เกี่ยวข้องอย่างเต็มที่ในเวอร์ชัน type-parameterized สิ่งสำคัญคือdistanceวิธีการไม่จำเป็นต้องสนใจเกี่ยวกับEdgeประเภท นี่เป็นสิ่งที่ดี แต่ดูเหมือนจะค่อนข้างตื้นสำหรับเหตุผลที่มีประเภทที่เกี่ยวข้องเลย ฉันพบว่าประเภทที่เกี่ยวข้องนั้นค่อนข้างใช้งานง่ายในทางปฏิบัติ แต่ฉันพบว่าตัวเองกำลังลำบากเมื่อต้องตัดสินใจว่าควรใช้ที่ไหนและเมื่อใดใน API ของฉันเอง เมื่อเขียนโค้ดฉันควรเลือกประเภทที่เกี่ยวข้องกับพารามิเตอร์ประเภททั่วไปเมื่อใดและเมื่อใดที่ฉันควรทำตรงกันข้าม
111 types  rust  idiomatic 

1
จะค้นหาและแทรกลงใน HashMap อย่างมีประสิทธิภาพได้อย่างไร?
ฉันต้องการทำสิ่งต่อไปนี้: ค้นหาVecคีย์ที่ต้องการและเก็บไว้เพื่อใช้ในภายหลัง หากไม่มีอยู่ให้สร้างช่องว่างVecสำหรับคีย์ แต่ยังคงเก็บไว้ในตัวแปร จะทำอย่างไรให้มีประสิทธิภาพ? โดยปกติฉันคิดว่าฉันสามารถใช้match: use std::collections::HashMap; // This code doesn't compile. let mut map = HashMap::new(); let key = "foo"; let values: &Vec<isize> = match map.get(key) { Some(v) => v, None => { let default: Vec<isize> = Vec::new(); map.insert(key, default); &default } }; เมื่อฉันลองมันทำให้ฉันมีข้อผิดพลาดเช่น: error[E0502]: cannot borrow `map` …
107 hashmap  rust  lookup 

1
มีวิธีที่เร็วกว่า / สั้นกว่าในการเริ่มต้นตัวแปรในโครงสร้างสนิมหรือไม่?
ในตัวอย่างต่อไปนี้ฉันต้องการกำหนดค่าให้กับแต่ละฟิลด์ในโครงสร้างในการประกาศฟิลด์ หรืออีกวิธีหนึ่งคือใช้คำสั่งเพิ่มเติมอย่างมีประสิทธิภาพสำหรับแต่ละฟิลด์เพื่อกำหนดค่าให้กับฟิลด์ สิ่งที่ฉันต้องการทำได้คือกำหนดค่าเริ่มต้นเมื่อโครงสร้างถูกสร้างอินสแตนซ์ มีวิธีที่รวบรัดกว่านี้หรือไม่? struct cParams { iInsertMax: i64, iUpdateMax: i64, iDeleteMax: i64, iInstanceMax: i64, tFirstInstance: bool, tCreateTables: bool, tContinue: bool, } impl cParams { fn new() -> cParams { cParams { iInsertMax: -1, iUpdateMax: -1, iDeleteMax: -1, iInstanceMax: -1, tFirstInstance: false, tCreateTables: false, tContinue: false, } } }
106 rust 

3
ฉันจะแปลงเวกเตอร์ไบต์ (u8) เป็นสตริงได้อย่างไร
ฉันพยายามเขียนไคลเอนต์ TCP / IP อย่างง่ายใน Rust และฉันต้องการพิมพ์บัฟเฟอร์ที่ได้รับจากเซิร์ฟเวอร์ ฉันจะแปลง a Vec<u8>(หรือ a &[u8]) เป็น a ได้Stringอย่างไร
106 rust 

3
ฉันจะสร้างไบนารีหลายรายการด้วย Cargo ได้อย่างไร
ฉันต้องการสร้างโปรเจ็กต์ที่มี a daemonและ a clientโดยเชื่อมต่อผ่านซ็อกเก็ตยูนิกซ์ A clientและ a daemonต้องใช้สองไบนารีดังนั้นฉันCargoจะบอกได้อย่างไรว่าจะสร้างสองเป้าหมายจากแหล่งที่มาที่แตกต่างกันสองแหล่ง เพื่อเพิ่มความเป็นแฟนตาซีฉันอยากจะมีlibraryส่วนหลักของdaemonมันและแค่มีไบนารีเพื่อพันรอบมันและสื่อสารผ่านซ็อกเก็ต ดังนั้นเราจึงมีสถาปัตยกรรมต้นไม้ประเภทนี้: ├── Cargo.toml ├── target | └── debug | ├── daemon │ └── client └── src ├── daemon │ ├── bin │ │ └── main.rs │ └── lib │ └── lib.rs └── client └── bin └── main.rs ฉันสามารถสร้างไฟล์ปฏิบัติการซึ่งจัดการข้อกังวลทั้งสองได้ แต่นั่นไม่ใช่สิ่งที่ฉันต้องการทำเว้นแต่จะเป็นแนวทางปฏิบัติที่ดีมาก
106 rust  rust-cargo 

5
แบ่งโมดูลออกเป็นหลาย ๆ ไฟล์
ฉันต้องการมีโมดูลที่มีโครงสร้างหลายชุดแต่ละโมดูลอยู่ในไฟล์ของตัวเอง ใช้Mathโมดูลเป็นตัวอย่าง: Math/ Vector.rs Matrix.rs Complex.rs ฉันต้องการให้โครงสร้างแต่ละตัวอยู่ในโมดูลเดียวกันซึ่งฉันจะใช้จากไฟล์หลักของฉันดังนี้: use Math::Vector; fn main() { // ... } อย่างไรก็ตามระบบโมดูลของ Rust (ซึ่งค่อนข้างสับสนในการเริ่มต้น) ไม่ได้ให้วิธีที่ชัดเจนในการทำเช่นนี้ ดูเหมือนว่าจะอนุญาตให้คุณมีโมดูลทั้งหมดในไฟล์เดียวเท่านั้น นี่คือบ้านนอก? ถ้าไม่ฉันจะทำอย่างไร
104 module  rust 


3
เป็นไปได้ไหมที่จะเขียนฟังก์ชัน InvSqrt () ของ Quake ใน Rust?
นี่เป็นเพียงเพื่อสนองความอยากรู้อยากเห็นของฉันเอง มีการดำเนินการตามนี้หรือไม่: float InvSqrt (float x) { float xhalf = 0.5f*x; int i = *(int*)&x; i = 0x5f3759df - (i>>1); x = *(float*)&i; x = x*(1.5f - xhalf*x*x); return x; } ในสนิม ถ้ามีอยู่โพสต์รหัส ฉันลองแล้วล้มเหลว ฉันไม่ทราบวิธีเข้ารหัสตัวเลขทศนิยมโดยใช้รูปแบบจำนวนเต็ม นี่คือความพยายามของฉัน: fn main() { println!("Hello, world!"); println!("sqrt1: {}, ",sqrt2(100f64)); } fn sqrt1(x: f64) -> f64 …

1
สำนวนการโทรกลับใน Rust
ใน C / C ++ ปกติแล้วฉันจะโทรกลับด้วยตัวชี้ฟังก์ชันธรรมดาซึ่งอาจส่งผ่านvoid* userdataพารามิเตอร์ด้วย สิ่งนี้: typedef void (*Callback)(); class Processor { public: void setCallback(Callback c) { mCallback = c; } void processEvents() { for (...) { ... mCallback(); } } private: Callback mCallback; }; วิธีสำนวนในการทำสนิมคืออะไร? โดยเฉพาะsetCallback()ฟังก์ชันของฉันควรใช้ประเภทใดและควรmCallbackเป็นประเภทใด ควรใช้เวลาFn? อาจจะFnMut? ฉันบันทึกไว้Boxedไหม ตัวอย่างจะน่าทึ่ง
100 callback  rust 

5
ฉันจะทำซ้ำในช่วงด้วยขั้นตอนที่กำหนดเองได้อย่างไร
ฉันจะทำซ้ำในช่วงใน Rust ด้วยขั้นตอนอื่นที่ไม่ใช่ 1 ได้อย่างไร ฉันมาจากพื้นหลัง C ++ ดังนั้นฉันต้องการทำสิ่งที่ชอบ for(auto i = 0; i <= n; i+=2) { //... } ใน Rust ฉันจำเป็นต้องใช้rangeฟังก์ชันนี้และดูเหมือนว่าจะไม่มีอาร์กิวเมนต์ที่สามสำหรับการมีขั้นตอนที่กำหนดเอง ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?
100 rust 


2
เป็นไปได้ไหมที่จะทำให้ประเภทที่เคลื่อนย้ายได้และไม่สามารถคัดลอกได้
หมายเหตุบรรณาธิการ : คำถามนี้ถูกถามก่อน Rust 1.0 และคำยืนยันบางส่วนในคำถามนั้นไม่จำเป็นต้องเป็นจริงใน Rust 1.0 คำตอบบางส่วนได้รับการอัปเดตเพื่อระบุทั้งสองเวอร์ชัน ฉันมีโครงสร้างนี้ struct Triplet { one: i32, two: i32, three: i32, } ถ้าฉันส่งสิ่งนี้ไปยังฟังก์ชันฟังก์ชันนั้นจะถูกคัดลอกโดยปริยาย ตอนนี้บางครั้งฉันอ่านว่าค่าบางค่าไม่สามารถคัดลอกได้จึงต้องย้าย เป็นไปได้ไหมที่จะทำให้โครงสร้างนี้Tripletไม่สามารถคัดลอกได้ ตัวอย่างเช่นเป็นไปได้ไหมที่จะใช้ลักษณะที่ทำให้Tripletไม่สามารถคัดลอกได้และทำให้ "เคลื่อนย้ายได้" ฉันอ่านที่ไหนสักแห่งที่ต้องใช้Cloneลักษณะในการคัดลอกสิ่งที่ไม่สามารถคัดลอกได้โดยปริยาย แต่ฉันไม่เคยอ่านเกี่ยวกับวิธีอื่นนั่นคือมีบางสิ่งที่สามารถคัดลอกได้โดยปริยายและทำให้ไม่สามารถคัดลอกได้เพื่อให้ย้ายไปแทน มันสมเหตุสมผลหรือไม่?
96 rust 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.