ใน Rust `` fn () -> () `คืออะไร?
ฉันมีความเข้าใจของ (เมืองหลวง-F) ลักษณะ Fn A: Fn, ,FnMut FnOnceฉันเข้าใจว่าพวกเขาเป็นลักษณะและทำงานเหมือนลักษณะ
แล้วfn(ตัวพิมพ์เล็ก -F) ล่ะ? มันได้รับการระบายสีที่แตกต่างกันในบรรณาธิการซึ่งบอกฉันว่ามันไม่ใช่ลักษณะ นอกจากนี้ยังสามารถใช้ในบางสถานที่ที่คนอื่นทำไม่ได้ (และในทางกลับกัน) แม้ว่าจะมีพฤติกรรมคล้ายกันในกรณีอื่น ๆ ฉันไม่พบสิ่งใดที่อธิบายได้โดยตรงในเอกสาร
คำตอบ
คำตอบของ prog-fhนั้นถูกต้องเป็นหลัก แต่ขาดความแตกต่างเล็กน้อย สนิมมีสามประเภทที่เหมือนฟังก์ชัน:
รายการฟังก์ชั่น
fn foo() {...}นี้เป็นสิ่งที่คุณได้รับเมื่อคุณสร้างฟังก์ชั่นโดยใช้ นอกจากนี้ยังเป็นประเภทของตัวสร้างของตัวแปรโครงสร้างหรือ enum ที่มีลักษณะคล้ายทูเพิล รายการฟังก์ชันมีขนาดเป็นศูนย์ (ไม่มีข้อมูล) และทุกฟังก์ชันที่ไม่ใช่ทั่วไปจะมีประเภทรายการฟังก์ชันที่ไม่ซ้ำกันและไม่สามารถระบุชื่อได้ ในข้อความแสดงข้อผิดพลาดคอมไพลเลอร์จะแสดง "ประเภทโวลเดอมอร์" เหล่านี้เหมือนfn() -> () {foo}(โดยมีชื่อของฟังก์ชันอยู่ใน{})การปิดเป็นค่าที่คล้ายกับรายการฟังก์ชัน แต่การปิดอาจมีข้อมูล: สำเนาหรือการอ้างอิงถึงตัวแปรใด ๆ ที่พวกเขาจับมาจากสภาพแวดล้อม ดังที่คุณทราบแล้วคุณสร้างการปิดโดยใช้ไวยากรณ์การปิด (
|args| expression) เช่นเดียวกับรายการฟังก์ชันการปิดมีประเภทที่ไม่ซ้ำกันและไม่สามารถระบุชื่อได้ (แสดงผลโดยคอมไพเลอร์[closure@src/main.rs:4:11: 4:23])คำแนะนำการทำงานเป็นสิ่งที่คุณกำลังถามเกี่ยวกับ:
fn() -> ()ประเภทที่มีลักษณะเหมือน พอยน์เตอร์ของฟังก์ชันไม่สามารถมีข้อมูลได้ แต่ไม่มีขนาดเป็นศูนย์ ตามชื่อของพวกเขาพวกเขาเป็นตัวชี้ ตัวชี้ฟังก์ชันอาจชี้ไปที่รายการฟังก์ชันหรือไปยังการปิดที่เก็บข้อมูลอะไรเลย แต่ไม่สามารถเป็นค่าว่างได้
รายการฟังก์ชั่นและการปิดจะถูกบังคับให้เป็นประเภทตัวชี้ฟังก์ชันที่เกี่ยวข้องโดยอัตโนมัติเมื่อเป็นไปได้นั่นคือเหตุผลที่ใช้let f: fn(i32) = |_| ();งานได้: เนื่องจากการปิดจับภาพสิ่งใดจึงสามารถบังคับให้ตัวชี้ฟังก์ชันได้
ทั้งสามฟังก์ชั่นเหมือนประเภทดำเนินการที่เกี่ยวข้องFn, FnMutและFnOnceลักษณะ (ยกเว้นปิดที่อาจจะไม่ดำเนินการFnหรือFnMutขึ้นอยู่กับสิ่งที่พวกเขาจับภาพ) รายการฟังก์ชั่นและคำแนะนำการทำงานยังดำเนินการCopy, Clone, SendและSync(ปิดดำเนินการเพียงลักษณะเหล่านี้เมื่อเนื้อหาของพวกเขาทุกคนทำ)
ตัวชี้การทำงานที่ชาญฉลาดเป็นสิ่งที่ประนีประนอมระหว่างวัตถุทั่วไปและวัตถุลักษณะ พวกเขาต้องถูกยกเลิกการอ้างอิงจึงจะเรียกได้ดังนั้นการเรียกใช้ตัวชี้ฟังก์ชันอาจช้ากว่าการเรียกรายการฟังก์ชันหรือการปิดโดยตรง แต่ยังเร็วกว่าการเรียกdyn Fnวัตถุลักษณะซึ่งเกี่ยวข้องกับการค้นหา vtable นอกเหนือจากการเรียกทางอ้อม
อ้างอิง
- อะไรคือความแตกต่างในทางปฏิบัติระหว่างรายการ fn และตัวชี้ fn?
- เหตุใดจึงต้องออกแบบภาษาด้วยประเภทที่ไม่ระบุตัวตน
- ฉันจะสร้างโครงสร้างสำหรับ FFI ที่มีตัวชี้ฟังก์ชันที่เป็นโมฆะได้อย่างไร
- เหตุใดการส่งผ่านการปิดไปยังฟังก์ชันที่ยอมรับตัวชี้ฟังก์ชันจึงไม่ทำงาน
มันเป็นตัวชี้ประเภทฟังก์ชั่น
มันหมายถึงเพียงการฟังก์ชั่นไม่ได้ปิดเพราะมันมีเพียงแค่อยู่ของฟังก์ชั่นไม่จับสภาพแวดล้อมการปิดความต้องการ
Fnลักษณะ (เมืองหลวง F) สามารถดูได้ว่าจะปิดหรือฟังก์ชั่น
fn คือประเภทของตัวชี้ฟังก์ชัน ดูเพิ่มเติมที่นี่ในเอกสาร:https://doc.rust-lang.org/std/primitive.fn.html