ภาคผนวก A: คำสงวน (Keywords)
รายการต่อไปนี้ประกอบด้วยคำสงวน (keywords) ที่ถูกจองไว้สำหรับการใช้งานในปัจจุบันหรือในอนาคตโดยภาษา Rust ด้วยเหตุนี้ คำเหล่านี้จึงไม่สามารถนำมาใช้เป็นตัวระบุ (identifiers) ได้ (ยกเว้นกรณีการใช้งานในรูปแบบตัวระบุดิบ (raw identifiers) ตามที่เราจะอธิบายในส่วน “ตัวระบุดิบ (Raw Identifiers)”) ตัวระบุ (Identifiers) คือชื่อของฟังก์ชัน, ตัวแปร, พารามิเตอร์, ฟิลด์ของโครงสร้างข้อมูล (struct fields), โมดูล (modules), เครต (crates), ค่าคงที่ (constants), มาโคร (macros), ค่าสแตติก (static values), แอตทริบิวต์ (attributes), ชนิดข้อมูล (types), เทรต (traits) หรืออายุขัยของข้อมูล (lifetimes)
คำสงวนที่ใช้งานอยู่ในปัจจุบัน
ด้านล่างนี้คือรายการของคำสงวนที่กำลังใช้งานอยู่ในปัจจุบันพร้อมทั้งคำอธิบายหน้าที่การทำงาน
as: ใช้ทำการแปลงชนิดข้อมูลพื้นฐาน (primitive casting), ช่วยชี้เฉพาะเจาะจงว่าเทรตใดมีไอเทมดังกล่าวเพื่อหลีกเลี่ยงความกำกวม หรือใช้เปลี่ยนชื่อไอเทมในคำสั่งuseasync: คืนค่ากลับมาเป็นFutureแทนที่จะทำการบล็อกการทำงานของเธรดปัจจุบันawait: หยุดการทำงานชั่วคราวไว้จนกว่าผลลัพธ์ของFutureจะพร้อมใช้งานbreak: ออกจากลูปในทันทีconst: นิยามไอเทมที่เป็นค่าคงที่ หรือตัวชี้ดิบที่เป็นค่าคงที่ (constant raw pointers)continue: ข้ามไปทำงานในรอบถัดไปของลูปทันทีcrate: ในเส้นทางของโมดูล (module path) จะหมายถึงรากของเครต (crate root)dyn: ทำการเรียกใช้งานเมธอดแบบไดนามิก (dynamic dispatch) ไปยังอ็อบเจกต์เทรต (trait object)else: ทางเลือกกรณีอื่นๆ สำหรับโครงสร้างควบคุมทิศทางแบบifและif letenum: นิยามชนิดข้อมูลแบบแจกแจงรายละเอียด (enumeration)extern: เชื่อมโยงกับฟังก์ชันหรือตัวแปรภายนอกfalse: ค่าบูลีนที่เป็นเท็จ (false literal)fn: นิยามฟังก์ชัน หรือชนิดข้อมูลตัวชี้ฟังก์ชัน (function pointer type)for: วนลูปผ่านไอเทมต่างๆ จากตัววนซ้ำ (iterator), การอิมพลิเมนต์เทรต (implement a trait) หรือการกำหนดอายุขัยในระดับที่สูงกว่า (higher ranked lifetime)if: การแยกสาขาการทำงานตามผลลัพธ์ของนิพจน์เงื่อนไขimpl: อิมพลิเมนต์ความสามารถเฉพาะตัว (inherent) หรือความสามารถของเทรต (trait functionality)in: ส่วนหนึ่งของไวยากรณ์การวนลูปforlet: ผูกตัวแปร (bind a variable)loop: วนลูปแบบไม่มีเงื่อนไขmatch: จับคู่ค่ากับรูปแบบ (patterns) ต่างๆmod: นิยามโมดูลmove: ทำให้โคลเชอร์ (closure) ยึดความเป็นเจ้าของ (take ownership) ของค่าทั้งหมดที่มันดึงเข้ามาใช้งานmut: ระบุความสามารถในการแก้ไขค่าได้ (mutability) ในตัวอ้างอิง (references), ตัวชี้ดิบ (raw pointers) หรือการผูกรูปแบบ (pattern bindings)pub: ระบุความสามารถในการเข้าถึงเป็นแบบสาธารณะ (public visibility) ในฟิลด์ของโครงสร้างข้อมูล, บล็อกimplหรือโมดูลref: ผูกค่าด้วยการอ้างอิง (bind by reference)return: คืนค่ากลับจากฟังก์ชันSelf: นามแฝงของชนิดข้อมูล (type alias) สำหรับชนิดข้อมูลที่เรากำลังนิยามหรือกำลังอิมพลิเมนต์อยู่self: ตัวตนที่เป็นผู้เรียกใช้เมธอด (method subject) หรือหมายถึงโมดูลปัจจุบันstatic: ตัวแปรส่วนกลาง (global variable) หรืออายุขัยที่คงอยู่ตลอดระยะเวลาที่โปรแกรมทำงานstruct: นิยามโครงสร้างข้อมูล (structure)super: โมดูลแม่ (parent module) ของโมดูลปัจจุบันtrait: นิยามเทรต (trait)true: ค่าบูลีนที่เป็นจริง (true literal)type: นิยามนามแฝงของชนิดข้อมูล (type alias) หรือชนิดข้อมูลที่เชื่อมโยงกัน (associated type)union: นิยามยูเนียน (union); จะเป็นคำสงวนเฉพาะเมื่อถูกใช้ในการประกาศยูเนียนเท่านั้น
คำสงวนที่จองไว้สำหรับการใช้งานในอนาคต
คำสงวนดังต่อไปนี้ยังไม่มีหน้าที่การทำงานใดๆ ในปัจจุบัน แต่ทาง Rust ได้จองไว้สำหรับการใช้งานที่อาจเกิดขึ้นในอนาคต:
abstractbecomeboxdofinalgenmacrooverrideprivtrytypeofunsizedvirtualyield
ตัวระบุดิบ (Raw Identifiers)
ตัวระบุดิบ (Raw identifiers) คือไวยากรณ์ที่ช่วยให้คุณสามารถใช้งานคำสงวนในตำแหน่งที่โดยปกติแล้วไม่ได้รับอนุญาตให้ใช้ได้ คุณสามารถใช้งานตัวระบุดิบได้โดยการเติมคำนำหน้าคำสงวนด้วย r#
ยกตัวอย่างเช่น match เป็นคำสงวน หากคุณพยายามคอมไพล์ฟังก์ชันต่อไปนี้ที่ใช้คำว่า match เป็นชื่อฟังก์ชัน:
ชื่อไฟล์: src/main.rs
fn match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
คุณจะพบกับข้อผิดพลาดนี้:
error: expected identifier, found keyword `match`
--> src/main.rs:4:4
|
4 | fn match(needle: &str, haystack: &str) -> bool {
| ^^^^^ expected identifier, found keyword
ข้อผิดพลาดนี้แสดงให้เห็นว่าคุณไม่สามารถใช้คำสงวน match เป็นตัวระบุชื่อฟังก์ชันได้ หากต้องการใช้ match เป็นชื่อฟังก์ชัน คุณจำเป็นต้องใช้ไวยากรณ์ตัวระบุดิบ ดังนี้:
ชื่อไฟล์: src/main.rs
fn r#match(needle: &str, haystack: &str) -> bool {
haystack.contains(needle)
}
fn main() {
assert!(r#match("foo", "foobar"));
}
โค้ดนี้จะสามารถคอมไพล์ได้โดยไม่มีข้อผิดพลาดใดๆ สังเกตการเติมคำนำหน้าด้วย r# ตรงชื่อฟังก์ชันในการนิยาม รวมถึงตำแหน่งที่เรียกใช้งานฟังก์ชันใน main
ตัวระบุดิบช่วยให้คุณสามารถเลือกใช้คำใดก็ได้เป็นตัวระบุ แม้ว่าคำนั้นจะตรงกับคำสงวนก็ตาม วิธีนี้ช่วยให้เรามีอิสระมากขึ้นในการเลือกชื่อตัวระบุ และยังช่วยให้เราสามารถเชื่อมโยงการทำงานร่วมกับโปรแกรมที่เขียนขึ้นด้วยภาษาที่คำเหล่านี้ไม่ได้เป็นคำสงวน นอกจากนี้ ตัวระบุดิบยังช่วยให้คุณใช้ไลบรารีที่เขียนขึ้นโดยใช้ Rust รุ่น (edition) อื่นที่ต่างจากรุ่นที่เครตของคุณใช้อยู่ด้วย ตัวอย่างเช่น คำว่า try ไม่ใช่คำสงวนในรุ่นปี 2015 แต่เป็นคำสงวนในรุ่นปี 2018, 2021 และ 2024 หากคุณต้องพึ่งพาไลบรารีที่เขียนขึ้นโดยใช้รุ่นปี 2015 และมีฟังก์ชันที่ชื่อว่า try คุณจำเป็นต้องใช้ไวยากรณ์ตัวระบุดิบ ซึ่งในกรณีนี้คือ r#try เพื่อเรียกใช้งานฟังก์ชันดังกล่าวจากโค้ดของคุณในรุ่นที่ใหม่กว่า ดูรายละเอียดเพิ่มเติมเกี่ยวกับรุ่น (editions) ได้ที่ ภาคผนวก E