2014-10-30 17 views
10

Kể từ dấu chấm phẩy là rõ ràng tùy chọn trong Rust, tại sao, nếu tôi làm điều này:Có phải dấu chấm phẩy tùy chọn trong Rust không?

fn fn1() -> i32 {  
    let a = 1 
    let b = 2 
    3 
} 

tôi nhận được lỗi:

error: expected one of `.`, `;`, `?`, or an operator, found `let` 
--> src/main.rs:3:9 
    | 
2 |   let a = 1 
    |     - expected one of `.`, `;`, `?`, or an operator here 
3 |   let b = 2 
    |   ^^^ unexpected token 

?

Trả lời

39

Chúng không bắt buộc. Dấu chấm phẩy sửa đổi hành vi của một câu lệnh biểu thức để nó phải là một quyết định có ý thức cho dù bạn sử dụng chúng hay không cho một dòng mã.

Hầu hết mọi thứ trong Rust là một biểu thức. Biểu thức là một cái gì đó trả về một giá trị. Nếu bạn đặt một dấu chấm phẩy bạn đang kìm nén kết quả của biểu thức này, mà trong hầu hết các trường hợp là những gì bạn muốn.

Mặt khác, điều này có nghĩa là nếu bạn kết thúc hàm bằng một biểu thức không có dấu chấm phẩy, kết quả của biểu thức cuối cùng này sẽ được trả về. Điều tương tự cũng có thể được áp dụng cho một khối trong câu lệnh match.

Bạn có thể sử dụng các biểu thức không có dấu chấm phẩy ở bất kỳ nơi nào khác mà giá trị được mong đợi.

Ví dụ:

let a = { 
    let inner = 2; 
    inner * inner 
}; 

Đây là biểu hiện inner * inner không kết thúc bằng dấu chấm phẩy, vì vậy giá trị của nó không bị đàn áp. Vì nó là biểu thức cuối cùng trong khối, giá trị của nó sẽ được trả về và gán cho a. Nếu bạn đặt dấu chấm phẩy trên cùng một dòng này, giá trị của inner * inner sẽ không được trả lại.

Trong trường hợp cụ thể của bạn, không chặn giá trị của câu lệnh let của bạn không có ý nghĩa và trình biên dịch đưa ra cho bạn lỗi. Trên thực tế, let không phải là một biểu thức.

+0

Bạn cũng có thể kiểm tra https://rustbyexample.com/expression.html về các biểu thức này cũng đề cập đến dấu chấm phẩy. – nbro

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