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

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

3
Rust มีอะไรแทนคนเก็บขยะ?
ฉันเข้าใจว่า Rust ไม่มีตัวเก็บขยะและฉันสงสัยว่าหน่วยความจำจะถูกปลดปล่อยขึ้นมาได้อย่างไรเมื่อการผูกไม่อยู่ในขอบเขต ดังนั้นในตัวอย่างนี้ฉันเข้าใจว่า Rust เรียกคืนหน่วยความจำที่จัดสรรให้กับ 'a' เมื่อมันอยู่นอกขอบเขต { let a = 4 } ปัญหาที่ฉันพบคือประการแรกสิ่งนี้เกิดขึ้นได้อย่างไรและประการที่สองนี่ไม่ใช่การเก็บขยะหรือไม่? แตกต่างจากการเก็บขยะ 'โดยทั่วไป' อย่างไร?
95 rust 

1
“ ตัวชี้ไขมัน” คืออะไร?
ฉันได้อ่านคำว่า "fat pointer" ในหลาย ๆ บริบทแล้ว แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไรและเมื่อใดที่ใช้ใน Rust ตัวชี้ดูเหมือนจะใหญ่กว่าตัวชี้ปกติถึงสองเท่า แต่ฉันไม่เข้าใจว่าทำไม ดูเหมือนว่าจะมีบางอย่างเกี่ยวข้องกับวัตถุลักษณะ
95 pointers  rust 

2
ประเภทสนิมที่แสดงด้วยเครื่องหมายวรรคตอนเดียวคืออะไร?
ฉันพบหลายประเภทใน Rust ที่แสดงด้วยเครื่องหมายวรรคตอนเดียว: 'static 'r 'a ความสำคัญของเครื่องหมายวรรคตอนนั้นคืออะไร? อาจเป็นตัวปรับเปลี่ยนการอ้างอิง ( &)? การพิมพ์ทั่วไปเฉพาะสำหรับการอ้างอิง? ฉันไม่รู้ว่าเอกสารสำหรับเรื่องนี้ซ่อนอยู่ที่ไหน
94 rust 

1
ฉันจะแปลงจากจำนวนเต็มเป็นสตริงได้อย่างไร
ฉันไม่สามารถรวบรวมโค้ดที่แปลงประเภทจากจำนวนเต็มเป็นสตริงได้ ฉันใช้ตัวอย่างจากบทช่วยสอน Rust for Rubyistsซึ่งมีการแปลงประเภทต่างๆเช่น: "Fizz".to_str()และ num.to_str()( numจำนวนเต็มอยู่ที่ไหน) ฉันคิดว่าการto_str()เรียกใช้ฟังก์ชันเหล่านี้ส่วนใหญ่ (ถ้าไม่ใช่ทั้งหมด) ได้เลิกใช้งานแล้ว วิธีปัจจุบันในการแปลงจำนวนเต็มเป็นสตริงคืออะไร? ข้อผิดพลาดที่ฉันได้รับคือ: error: type `&'static str` does not implement any method in scope named `to_str` error: type `int` does not implement any method in scope named `to_str`

4
ฉันจะใช้มาโครข้ามไฟล์โมดูลได้อย่างไร
ฉันมีสองโมดูลในไฟล์แยกกันภายในลังเดียวกันซึ่งลังmacro_rulesเปิดใช้งาน ฉันต้องการใช้มาโครที่กำหนดไว้ในโมดูลหนึ่งในโมดูลอื่น // macros.rs #[macro_export] // or not? is ineffectual for this, afaik macro_rules! my_macro(...) // something.rs use macros; // use macros::my_macro; <-- unresolved import (for obvious reasons) my_macro!() // <-- how? ขณะนี้ฉันพบข้อผิดพลาดของคอมไพเลอร์ " macro undefined: 'my_macro'" ... ซึ่งสมเหตุสมผล ระบบมาโครทำงานก่อนระบบโมดูล ฉันจะหลีกเลี่ยงสิ่งนั้นได้อย่างไร

1
ช่วงชีวิตที่ไม่ใช่ศัพท์คืออะไร?
Rust มีRFCที่เกี่ยวข้องกับอายุขัยที่ไม่ใช่ศัพท์ซึ่งได้รับการอนุมัติให้ใช้งานในภาษาเป็นเวลานาน เมื่อเร็ว ๆ นี้การรองรับฟีเจอร์นี้ของ Rust ได้พัฒนาไปมากและถือว่าสมบูรณ์ คำถามของฉันคืออายุการใช้งานที่ไม่ใช่ศัพท์คืออะไร?


9
เหตุใดจึงต้องออกแบบภาษาด้วยประเภทที่ไม่ระบุตัวตน
นี่เป็นสิ่งที่ทำให้ฉันติดขัดในฐานะคุณลักษณะของนิพจน์แลมบ์ดา C ++ ประเภทของนิพจน์แลมบ์ดา C ++ นั้นไม่เหมือนใครและไม่ระบุตัวตนฉันไม่สามารถเขียนมันลงไปได้ แม้ว่าฉันจะสร้างแลมบ์ดาสองตัวที่มีวากยสัมพันธ์เหมือนกันทุกประการ แต่ประเภทผลลัพธ์ก็ถูกกำหนดให้แตกต่างกัน ผลที่ตามมาคือ a) lambdas สามารถส่งผ่านไปยังฟังก์ชันเทมเพลตที่อนุญาตให้ส่งต่อเวลาคอมไพล์ประเภทที่ไม่สามารถบรรยายได้พร้อมกับออบเจ็กต์และ b) lambdas นั้นมีประโยชน์ก็ต่อเมื่อถูกลบผ่านประเภทstd::function<>เท่านั้น โอเค แต่นั่นเป็นเพียงวิธีที่ C ++ ทำฉันก็พร้อมที่จะเขียนมันออกมาเป็นเพียงคุณลักษณะที่น่ารำคาญของภาษานั้น อย่างไรก็ตามฉันเพิ่งเรียนรู้ว่า Rust ดูเหมือนจะเหมือนกัน: ฟังก์ชัน Rust หรือแลมบ์ดาแต่ละฟังก์ชันมีลักษณะเฉพาะและไม่ระบุตัวตน และตอนนี้ฉันสงสัยว่า: ทำไม? ดังนั้นคำถามของฉันคือ สิ่งนี้มีข้อดีอย่างไรจากมุมมองของนักออกแบบภาษาในการแนะนำแนวคิดของประเภทที่ไม่ซ้ำใครและไม่ระบุตัวตนในภาษา


1
"ประเภทพื้นฐาน" ใน Rust คืออะไร?
บางแห่งฉันหยิบคำว่า "ประเภทพื้นฐาน" (และคุณลักษณะของมัน#[fundamental]) และตอนนี้ฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับมัน ฉันจำได้ว่ามันเกี่ยวกับการผ่อนคลายกฎการเชื่อมโยงกันในบางสถานการณ์ และฉันคิดว่าประเภทอ้างอิงเป็นประเภทพื้นฐานดังกล่าว น่าเสียดายที่การค้นหาเว็บไม่ได้ทำให้ฉันอยู่ไกล การอ้างอิงสนิมไม่ได้พูดถึงมัน (เท่าที่ฉันเห็น) ฉันเพิ่งพบปัญหาเกี่ยวกับการทำสิ่งอันดับประเภทพื้นฐานและRFC ที่แนะนำแอตทริบิวต์ อย่างไรก็ตาม RFC มีย่อหน้าเดียวเกี่ยวกับประเภทพื้นฐาน: #[fundamental]ประเภทFooเป็นหนึ่งที่ดำเนินการ Impl ผ้าห่มกว่าFooคือการเปลี่ยนแปลงที่จะหมด ตามที่อธิบายไว้&และ&mutเป็นพื้นฐาน แอ็ตทริบิวต์นี้จะถูกนำไปใช้Boxทำให้มีBox พฤติกรรมเหมือนกับ&และ&mutด้วยความเคารพต่อการเชื่อมโยงกัน ฉันพบว่าถ้อยคำยากที่จะเข้าใจและรู้สึกว่าฉันต้องการความรู้เชิงลึกของ RFC แบบเต็มเพื่อทำความเข้าใจเกี่ยวกับประเภทพื้นฐานนี้ ฉันหวังว่าใครบางคนสามารถอธิบายประเภทพื้นฐานในแง่ที่ค่อนข้างง่ายกว่า (โดยไม่ต้องทำให้ง่ายขึ้นมากเกินไป) คำถามนี้ยังใช้เป็นความรู้ที่ง่ายต่อการค้นหา เพื่อทำความเข้าใจประเภทพื้นฐานฉันต้องการตอบคำถามเหล่านี้ (นอกเหนือจากคำถามหลัก "พวกเขาคืออะไร" คำถาม: แน่นอน): ประเภทพื้นฐานสามารถทำได้มากกว่าประเภทที่ไม่ใช่พื้นฐานหรือไม่? ในฐานะผู้เขียนห้องสมุดฉันจะได้ประโยชน์จากการทำเครื่องหมายบางประเภทในบางวิธี#[fundamental]หรือไม่? ประเภทใดจากภาษาหลักหรือไลบรารีมาตรฐานเป็นพื้นฐาน?
37 rust 

1
const ทั่วโลกที่ไม่คัดลอกหรือโคลนทำงานใน Rust อย่างไร
บอกว่าฉันมีตัวอย่างต่อไปนี้ ( สนามเด็กเล่น ) struct A { pub val: u32 } const GLOBAL_A: A = A {val: 2}; fn main() { let some_a: A = GLOBAL_A; let other_a: A = GLOBAL_A; println!("double val = {}", some_a.val + other_a.val); } เนื่องจากAเป็นค่าCloneมิได้Copyผมจะถือว่าค่าของGLOBAL_Aจะถูกย้าย ที่ไม่สมเหตุสมผลสำหรับ const และตามที่แสดงไม่สามารถเป็นกรณีใด ๆ เพราะมันสามารถ "ย้าย" สองครั้ง มีกฎอะไรที่ช่วยให้ข้อมูลดังกล่าวข้างต้นในการทำงานพิจารณาAไม่ได้CloneหรือCopy?
20 rust  const  move 

1
อะไร "ไม่สามารถยืมเป็นไม่เปลี่ยนรูปเพราะมันก็ยืมเป็นไม่แน่นอน" หมายถึงในดัชนีอาร์เรย์ที่ซ้อนกัน?
ข้อผิดพลาดหมายถึงอะไรในกรณีนี้: fn main() { let mut v: Vec<usize> = vec![1, 2, 3, 4, 5]; v[v[1]] = 999; } error[E0502]: cannot borrow `v` as immutable because it is also borrowed as mutable --> src/main.rs:3:7 | 3 | v[v[1]] = 999; | --^---- | | | | | immutable borrow occurs here …

2
เพราะเหตุใด `std :: mem :: drop` จึงเหมือนกับการปิด | _ | () ในขอบเขตที่สูงกว่า
การใช้งานของstd::mem::dropเอกสารจะเป็นดังต่อไปนี้: pub fn drop<T>(_x: T) { } ดังนั้นฉันจึงคาดหวังว่าการปิด|_| ()(หรือที่รู้จักกันในชื่อการปิดห้องน้ำ ) จะเป็น 1: 1 ที่มีศักยภาพในการทดแทนdropทั้งสองทิศทาง อย่างไรก็ตามรหัสด้านล่างแสดงให้เห็นว่าdropไม่เข้ากันกับลักษณะการจัดอันดับที่สูงกว่าที่ถูกผูกไว้กับพารามิเตอร์ของฟังก์ชั่นในขณะที่การปิดห้องน้ำเป็น fn foo<F, T>(f: F, x: T) where for<'a> F: FnOnce(&'a T), { dbg!(f(&x)); } fn main() { foo(|_| (), "toilet closure"); // this compiles foo(drop, "drop"); // this does not! } ข้อความแสดงข้อผิดพลาดของคอมไพเลอร์: error[E0631]: type mismatch …

4
ฉันจะส่งคืนประเภทที่เชื่อมโยงจากคุณลักษณะที่ถูกจัดอันดับที่สูงกว่าได้อย่างไร
ฉันมีลักษณะที่มีฟังก์ชั่นสำหรับ deserializing ประเภทที่เกี่ยวข้อง อย่างไรก็ตามประเภทที่เกี่ยวข้องนั้นจำเป็นต้องมีอายุการใช้งานที่ผู้โทรตัดสินใจดังนั้นฉันจึงมีคุณลักษณะที่แยกต่างหากซึ่งฉันใช้คุณลักษณะที่มีอันดับสูงกว่าซึ่งผูกไว้กับ ฉันต้องใช้การปิดที่ส่งคืนประเภทที่เชื่อมโยงนี้ ฉันมีรหัสต่อไปนี้เพื่อทำ: #![allow(unreachable_code)] use std::marker::PhantomData; trait Endpoint: for<'a> EndpointBody<'a> {} trait EndpointBody<'a> { type Out: 'a; fn serialize(body: &Self::Out) -> Vec<u8>; fn deserialize(raw_body: &'a [u8]) -> Self::Out; } // ///////////////////////////////////////////////////////// /// Trait object compatible handler trait Handler { fn execute(&self, raw_body: &[u8]) -> Vec<u8>; } /// …

1
ฉันจะใส่ฟังก์ชั่น async ลงในแผนที่ใน Rust ได้อย่างไร
ฉันไม่สามารถจัดการกับฟังก์ชั่น async hyperเขียนเมื่อเราเตอร์สำหรับ รหัสนี้: use std::collections::HashMap; use std::future::Future; type BoxedResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>; type CalcFn = Box<dyn Fn(i32, i32) -> dyn Future<Output = BoxedResult<i32>>>; async fn add(a: i32, b: i32) -> BoxedResult<i32> { Ok(a + b) } async fn sub(a: i32, b: i32) -> BoxedResult<i32> …
11 rust  async-await 

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