2014-07-23 14 views
6

Tôi rất thích để có thể giống như sau:Có thể viết macro Rust sẽ mở rộng thành chữ ký hàm/phương thức không?

macro_rules! impl_a_method(
    ($obj:ident, $body:block) => (
     fn a_method(foo: Foo, bar: Bar, baz: Baz) -> $obj $body 
    ) 
) 

// Implementation would look like: 

impl_a_method!(MyType, { 
    MyType { 
     foo: foo.blah(), 
     bar: bar.bloo(), 
     baz: baz.floozy(), 
    } 
}) 

ví dụ thực tế của tôi tính năng các phương pháp có chữ ký lớn hơn nhiều mà tôi phải thực hiện theo những cách độc đáo cho 30 + các loại khác nhau.

Tôi đã thử một cái gì đó tương tự như vĩ mô trên, tuy nhiên tôi chạy vào lỗi nơi rustc coi foo, barbaz tên chưa được giải quyết tại địa điểm mở rộng (mặc dù tôi chắc chắn rằng việc kê khai vĩ mô lexically trước việc sử dụng).

Có thể làm điều gì đó như thế này không?

Nếu không, bạn có thể đề xuất phương pháp tiếp cận sẽ đạt được điều gì đó tương tự không?

Trả lời

5

Điều đó là không thể do vệ sinh macro. Bất kỳ số nhận dạng nào được giới thiệu trong phần thân macro được đảm bảo khác với bất kỳ số nhận dạng nào tại trang web cuộc gọi macro. Bạn phải cung cấp tất cả các định danh chính mình, mà phần nào bất chấp mục đích của vĩ mô:

impl_a_method!(MyType, (foo, bar, baz), { 
    MyType { 
     foo: foo.blah(), 
     bar: bar.bloo(), 
     baz: baz.floozy(), 
    } 
}) 

này được thực hiện bằng macro này:

loại
macro_rules! impl_a_method(
    ($obj:ty, ($_foo:ident, $_bar:ident, $_baz:ident), $body:expr) => (
     fn a_method($_foo: Foo, $_bar: Bar, $_baz: Baz) -> $obj { $body } 
    ) 
) 

Điều duy nhất bạn đang thực sự tiết kiệm ở đây là viết của các tham số phương thức.

+0

Câu trả lời hay, chỉ cần nói rằng tôi không phải là người hâm mộ cách Rust làm macro. Toàn bộ các điểm của macro là chúng thay thế một cách mù quáng văn bản và "vệ sinh vĩ mô" là một oxymoron. Nó chỉ làm cho tôi phải đối phó với cách cú pháp hơn, trong khi tôi không gặp khó khăn đôi khi làm những công cụ nguy hiểm như thế này trong C. – sudo

+3

"vệ sinh vĩ mô" thực sự là một ý tưởng khá được xác định rõ ràng: https://en.wikipedia.org/wiki/Hygienic_macro – solidsnack

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