2017-03-14 18 views
5

Tôi đang triển khai trình phân tích cú pháp trong Rust và khoảng trắng là mẫu chung mà tôi muốn sử dụng lại trong các mẫu match.Làm thế nào tôi có thể lưu trữ một mẫu trong một biến trong Rust?

Mã này hoạt động:

let ch = ' '; 

match ch { 
    ' ' | '\n' | '\t' | '\r' => println!("whitespace"), 
    _ => println!("token"), 
} 

Điều này sẽ được thực sự lặp đi lặp lại nếu tôi cần phải tiếp tục xác định mẫu trắng mỗi lần. Tôi muốn xác định rằng một lần và tái sử dụng nó. Tôi muốn làm một cái gì đó như:

let whitespace = ' ' | '\n' | '\t' | '\r'; 

let ch = ' '; 

match ch { 
    whitespace => println!("whitespace"), 
    _   => println!("token"), 
} 

Trình biên dịch không thích việc gán ws. Nó diễn giải số | dưới dạng phép toán nhị phân thay vì luân phiên.

Các mẫu có thể được lưu trữ trong các biến bằng cách nào đó không? Có cách nào tốt hơn hay thành ngữ hơn để làm điều này?

+0

Trong C này sẽ giống như một ứng cử viên tốt cho một vĩ mô, tự hỏi nếu vĩ mô là con đường để đi trong Rust quá ... – turbulencetoo

+0

@ turbulencetoo một ý tưởng thú vị. Trong C, macro là thao tác văn bản ở mức độ thấp hơn, điều này có thể dẫn đến mã nguồn không hợp lệ. Trong Rust, số lượng địa điểm bạn có thể gọi macro bị giới hạn và việc mở rộng phải hợp lệ về cú pháp. Tôi không nghĩ rằng các mẫu đó nằm trong tập hợp các địa điểm hợp lệ. Bạn luôn có thể thực hiện một số kiểu kịch bản lệnh xây dựng để tạo các tệp văn bản xảy ra dẫn đến mã Rust hợp lệ. – Shepmaster

Trả lời

10

Các mẫu có thể được lưu trữ trong các biến bằng cách nào đó không?

Không. Mẫu là cấu trúc biên dịch và các biến chứa khái niệm thời gian chạy.

Có cách nào tốt hơn hoặc thành ngữ hơn để thực hiện việc này không?

Tạo hàm hoặc phương pháp luôn là giải pháp tốt để tránh lặp lại mã.

fn is_whitespace(c: char) -> bool { 
    match c { 
     ' ' | '\n' | '\t' | '\r' => true, 
     _ => false, 
    } 
} 

fn main() { 
    let ch = ' '; 

    match ch { 
     x if is_whitespace(x) => println!("whitespace"), 
     _ => println!("token"), 
    } 
} 

Tôi cũng muốn khuyên bạn sử dụng một trình phân tích hiện có, of which there are a multitude, nhưng mọi người đều muốn Rust của họ "hello world" được phân tích cú pháp, vì lý do gì.

Một thư viện phân tích cú pháp tôi sử dụng cho phép viết mã tương tự như này, nơi whitespace là một chức năng mà biết làm thế nào để phân tích các loại giá trị của khoảng trắng:

sequence!(pm, pt, { 
    _   = literal("if"); 
    ws   = whitespace; 
    _   = literal("let"); 
    ws   = append_whitespace(ws); 
    pattern = pattern; 
    ws   = optional_whitespace(ws); 
    _   = literal("="); 
    ws   = optional_whitespace(ws); 
    expression = expression; 
}, |_, _| /* do something with pieces */); 

Mỗi trong những điều ở phía bên tay phải là các hàm riêng lẻ vẫn biết cách phân tích cú pháp một cái gì đó cụ thể.

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