การปิดใช้ Fn, FnMut และ FnOnce เมื่อใด


114

อะไรคือเงื่อนไขที่เฉพาะเจาะจงสำหรับการปิดการใช้Fn, FnMutและFnOnceลักษณะ?

นั่นคือ:

  • เมื่อใดที่การปิดไม่ใช้FnOnceลักษณะ?
  • เมื่อใดที่การปิดไม่ใช้FnMutลักษณะ?
  • เมื่อใดที่การปิดไม่ใช้Fnลักษณะ?

ยกตัวอย่างเช่นกรรมวิธีรัฐของการปิดบนของร่างกายทำให้คอมไพเลอร์ไม่ได้ดำเนินการFnเกี่ยวกับมัน


11
คุณเคยเห็นบทความดีๆล่าสุดเกี่ยวกับการปิดหรือไม่?
Shepmaster

คำตอบ:


126

ลักษณะแต่ละอย่างแสดงถึงคุณสมบัติที่เข้มงวดมากขึ้นเกี่ยวกับการปิด / ฟังก์ชันซึ่งระบุโดยลายเซ็นของcall_...วิธีการและโดยเฉพาะอย่างยิ่งประเภทของself:

  • FnOnce( self) เป็นฟังก์ชันที่สามารถเรียกใช้ได้ครั้งเดียว
  • FnMut( &mut self) เป็นฟังก์ชันที่สามารถเรียกใช้ได้หากมี&mutการเข้าถึงสภาพแวดล้อม
  • Fn( &self) เป็นฟังก์ชันที่สามารถเรียกใช้ได้หากมีเพียง&การเข้าถึงสภาพแวดล้อมเท่านั้น

การปิด|...| ...จะดำเนินการโดยอัตโนมัติให้มากที่สุดเท่าที่จะทำได้

  • การปิดทั้งหมดใช้FnOnce: การปิดที่ไม่สามารถเรียกได้ครั้งเดียวไม่สมควรได้รับชื่อ โปรดทราบว่าหากการปิดดำเนินการFnOnceเพียงครั้งเดียวสามารถเรียกใช้ได้เพียงครั้งเดียว
  • การปิดที่ไม่เคลื่อนออกจากการใช้งานการดักจับFnMutทำให้สามารถเรียกได้มากกว่าหนึ่งครั้ง (หากมีการเข้าถึงวัตถุฟังก์ชันโดยไม่ได้กำหนด)
  • การปิดที่ไม่ต้องการการเข้าถึงที่ไม่ซ้ำกัน / เปลี่ยนแปลงได้ในการใช้งานการจับภาพFnทำให้สามารถเรียกได้ทุกที่

ข้อ จำกัด เหล่านี้เป็นไปตามโดยตรงจากประเภทselfและ "desugaring" ของการปิดเป็นโครงสร้าง; อธิบายไว้ในบล็อกของฉันโพสต์Finding ปิดใน Rust

สำหรับข้อมูลเกี่ยวกับการปิดดูปิด: ฟังก์ชั่นที่ไม่ระบุชื่อที่สามารถจับสภาพแวดล้อมของพวกเขาในสนิมโปรแกรมภาษา


หากการปิดดำเนินการFnOnceเพียงครั้งเดียวหมายความว่าสามารถเรียกได้เพียงครั้งเดียวหรือไม่?
nalply

@nalply ใช่เพียงครั้งเดียว
huon

9
ฉันอ่านความคิดเห็นของ nalply ผิดและมันทำให้ฉันสับสน ผู้อ่านในอนาคตโปรดทราบว่าเขากล่าวว่า "หากการปิดดำเนินการเท่านั้นFnOnce "
sleeparrow

2
รายละเอียดการใช้งาน: จะนำไปใช้โดยอัตโนมัติให้มากที่สุดเท่าที่จะทำได้ ไม่เป็นความจริงทั้งหมดมันจะนำไปใช้โดยอัตโนมัติหากดูเหมือนว่าจำเป็น คุณสามารถตรวจพบ Fn-im ที่หายไปสำหรับการปิดที่ใช้สำหรับอาร์กิวเมนต์ FnMut โดยใช้ความเชี่ยวชาญ นี่คือ bug github.com/rust-lang/rust/issues/26085
bluss
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.