ใน Rust `` fn () -> () `คืออะไร?

Oct 10 2020

ฉันมีความเข้าใจของ (เมืองหลวง-F) ลักษณะ Fn A: Fn, ,FnMut FnOnceฉันเข้าใจว่าพวกเขาเป็นลักษณะและทำงานเหมือนลักษณะ

แล้วfn(ตัวพิมพ์เล็ก -F) ล่ะ? มันได้รับการระบายสีที่แตกต่างกันในบรรณาธิการซึ่งบอกฉันว่ามันไม่ใช่ลักษณะ นอกจากนี้ยังสามารถใช้ในบางสถานที่ที่คนอื่นทำไม่ได้ (และในทางกลับกัน) แม้ว่าจะมีพฤติกรรมคล้ายกันในกรณีอื่น ๆ ฉันไม่พบสิ่งใดที่อธิบายได้โดยตรงในเอกสาร

คำตอบ

8 trentcl Oct 10 2020 at 22:09

คำตอบของ prog-fhนั้นถูกต้องเป็นหลัก แต่ขาดความแตกต่างเล็กน้อย สนิมมีสามประเภทที่เหมือนฟังก์ชัน:

  1. รายการฟังก์ชั่นfn foo() {...}นี้เป็นสิ่งที่คุณได้รับเมื่อคุณสร้างฟังก์ชั่นโดยใช้ นอกจากนี้ยังเป็นประเภทของตัวสร้างของตัวแปรโครงสร้างหรือ enum ที่มีลักษณะคล้ายทูเพิล รายการฟังก์ชันมีขนาดเป็นศูนย์ (ไม่มีข้อมูล) และทุกฟังก์ชันที่ไม่ใช่ทั่วไปจะมีประเภทรายการฟังก์ชันที่ไม่ซ้ำกันและไม่สามารถระบุชื่อได้ ในข้อความแสดงข้อผิดพลาดคอมไพลเลอร์จะแสดง "ประเภทโวลเดอมอร์" เหล่านี้เหมือนfn() -> () {foo}(โดยมีชื่อของฟังก์ชันอยู่ใน{})

  2. การปิดเป็นค่าที่คล้ายกับรายการฟังก์ชัน แต่การปิดอาจมีข้อมูล: สำเนาหรือการอ้างอิงถึงตัวแปรใด ๆ ที่พวกเขาจับมาจากสภาพแวดล้อม ดังที่คุณทราบแล้วคุณสร้างการปิดโดยใช้ไวยากรณ์การปิด (|args| expression) เช่นเดียวกับรายการฟังก์ชันการปิดมีประเภทที่ไม่ซ้ำกันและไม่สามารถระบุชื่อได้ (แสดงผลโดยคอมไพเลอร์[closure@src/main.rs:4:11: 4:23])

  3. คำแนะนำการทำงานเป็นสิ่งที่คุณกำลังถามเกี่ยวกับ: fn() -> ()ประเภทที่มีลักษณะเหมือน พอยน์เตอร์ของฟังก์ชันไม่สามารถมีข้อมูลได้ แต่ไม่มีขนาดเป็นศูนย์ ตามชื่อของพวกเขาพวกเขาเป็นตัวชี้ ตัวชี้ฟังก์ชันอาจชี้ไปที่รายการฟังก์ชันหรือไปยังการปิดที่เก็บข้อมูลอะไรเลย แต่ไม่สามารถเป็นค่าว่างได้

รายการฟังก์ชั่นและการปิดจะถูกบังคับให้เป็นประเภทตัวชี้ฟังก์ชันที่เกี่ยวข้องโดยอัตโนมัติเมื่อเป็นไปได้นั่นคือเหตุผลที่ใช้let f: fn(i32) = |_| ();งานได้: เนื่องจากการปิดจับภาพสิ่งใดจึงสามารถบังคับให้ตัวชี้ฟังก์ชันได้

ทั้งสามฟังก์ชั่นเหมือนประเภทดำเนินการที่เกี่ยวข้องFn, FnMutและFnOnceลักษณะ (ยกเว้นปิดที่อาจจะไม่ดำเนินการFnหรือFnMutขึ้นอยู่กับสิ่งที่พวกเขาจับภาพ) รายการฟังก์ชั่นและคำแนะนำการทำงานยังดำเนินการCopy, Clone, SendและSync(ปิดดำเนินการเพียงลักษณะเหล่านี้เมื่อเนื้อหาของพวกเขาทุกคนทำ)

ตัวชี้การทำงานที่ชาญฉลาดเป็นสิ่งที่ประนีประนอมระหว่างวัตถุทั่วไปและวัตถุลักษณะ พวกเขาต้องถูกยกเลิกการอ้างอิงจึงจะเรียกได้ดังนั้นการเรียกใช้ตัวชี้ฟังก์ชันอาจช้ากว่าการเรียกรายการฟังก์ชันหรือการปิดโดยตรง แต่ยังเร็วกว่าการเรียกdyn Fnวัตถุลักษณะซึ่งเกี่ยวข้องกับการค้นหา vtable นอกเหนือจากการเรียกทางอ้อม

อ้างอิง

  • อะไรคือความแตกต่างในทางปฏิบัติระหว่างรายการ fn และตัวชี้ fn?
  • เหตุใดจึงต้องออกแบบภาษาด้วยประเภทที่ไม่ระบุตัวตน
  • ฉันจะสร้างโครงสร้างสำหรับ FFI ที่มีตัวชี้ฟังก์ชันที่เป็นโมฆะได้อย่างไร
  • เหตุใดการส่งผ่านการปิดไปยังฟังก์ชันที่ยอมรับตัวชี้ฟังก์ชันจึงไม่ทำงาน
3 prog-fh Oct 10 2020 at 21:07

มันเป็นตัวชี้ประเภทฟังก์ชั่น

มันหมายถึงเพียงการฟังก์ชั่นไม่ได้ปิดเพราะมันมีเพียงแค่อยู่ของฟังก์ชั่นไม่จับสภาพแวดล้อมการปิดความต้องการ

Fnลักษณะ (เมืองหลวง F) สามารถดูได้ว่าจะปิดหรือฟังก์ชั่น

NickDecroos Oct 10 2020 at 21:07

fn คือประเภทของตัวชี้ฟังก์ชัน ดูเพิ่มเติมที่นี่ในเอกสาร:https://doc.rust-lang.org/std/primitive.fn.html