2016-12-18 15 views

Trả lời

14

Bạn nói đúng: nó gây nhầm lẫn. Đặc biệt, bởi vì hầu hết các tính năng này không ổn định và thay đổi khá thường xuyên. Nhưng tôi sẽ cố gắng tóm tắt tình hình hiện tại (tháng 12 năm 2016).


Venn-diagram showing compiler-plugins and syntax-extensions

Hãy bắt đầu với các Cú pháp mở rộng: nó là cái gì mà đã được "gọi" hoặc chú thích bằng tay để có hiệu lực. Có ba loại các phần mở rộng cú pháp, trong đó có sự khác biệt trong cách bạn chú thích cho họ:

  • chức năng giống như phần mở rộng cú pháp: đây là những lẽ là phần mở rộng cú pháp phổ biến nhất, còn gọi là "macro". Cú pháp để gọi chúng là foo!(…) hoặc (và điều này khá hiếm) foo! some_ident (…), trong đó foo là tên của macro. Lưu ý rằng dấu ngoặc đơn () có thể được thay thế bằng [] hoặc {}. Tiện ích cú pháp giống như chức năng có thể được xác định là macro "theo ví dụ" hoặc dưới dạng "macro thủ tục".

  • thuộc tính giống như phần mở rộng cú pháp: chúng được gọi như #[foo(…)] nơi ngoặc là không cần thiết và, một lần nữa, foo là tên của phần mở rộng cú pháp. Mục thuộc tính thuộc về sau đó có thể được sửa đổi hoặc mở rộng bằng các mục bổ sung (trang trí).

  • xuất phát tùy chỉnh: hầu hết các lập trình viên Rust đã sử dụng thuộc tính #[derive(…)]. Tất nhiên, derive chính nó có thể được xem là tiện ích cú pháp giống thuộc tính. Nhưng nó cũng có thể được mở rộng, mà sau đó được gọi là #[derive(Foo)], trong đó Foo là tên của xuất phát tùy chỉnh.


Hầu hết các phần mở rộng cú pháp cũng là "biên dịch plugins". Ngoại lệ duy nhất là tiện ích mở rộng cú pháp giống như chức năng được xác định qua macro "theo ví dụ" (nghĩa là cú pháp macro_rules!). Macro theo ví dụ có thể được xác định trong mã nguồn của bạn mà không cần viết một plugin trình biên dịch bất kỳ thứ gì.

Nhưng cũng có plugin trình biên dịch không phải là tiện ích cú pháp.Các loại trình biên dịch trình biên dịch là linters hoặc các plugin khác chạy một số mã ở một số giai đoạn của quá trình biên dịch. Họ không cần phải được gọi một cách thủ công: một khi được nạp, trình biên dịch sẽ gọi chúng tại một số điểm nhất định trong khi biên dịch.

Tất cả plugin trình biên dịch cần phải được tải - qua số #![plugin(foo)] tại trụ sở gốc hoặc với thông số dòng lệnh -Zextra-plugins=too,bar - trước khi chúng có thể có hiệu lực!

Trình biên dịch bổ sung hiện không ổn định, do đó bạn cần trình biên dịch hàng đêm để sử dụng chúng. Tuy nhiên, "Macro 1.1"-RFC có thể sẽ sớm được ổn định, có nghĩa là có thể sử dụng các gói nhỏ của plugin trình biên dịch với trình biên dịch ổn định.


Liên kết hữu ích:

+0

Xin vui lòng cho tôi biết nếu tôi thực hiện bất kỳ sai lầm! Vì tôi chưa bao giờ viết một trình biên dịch plugin, nó là khá khó khăn để có được tất cả các thông tin này. Nó không chắc rằng tôi đã phạm sai lầm! Hãy cho tôi biết (hoặc chỉ chỉnh sửa, nếu nó có thể được chỉnh sửa)! –

+1

'rustc' có tùy chọn dòng lệnh' -Zextra-plugins = too, bar' để thêm các plugin mà không chú thích mã. – llogiq

+0

@llogiq Cảm ơn! Tôi đã thêm nó vào câu trả lời của tôi. –

Các vấn đề liên quan