Giới hạn đặc điểm được xác định bên trong mệnh đề where
là một phần lớn các giới hạn đặc điểm được khai báo nội dòng. Kiểu nội tuyến tồn tại trước mệnh đề where
; mệnh đề where
là introduced in RFC 135:
Thêm where
khoản, trong đó cung cấp một phương tiện biểu cảm hơn quy định cụ thể giới hạn tham số đặc điểm. [...] Ký hiệu giới hạn hiện tại sẽ vẫn là đường cú pháp cho các mệnh đề where
.
Dưới đây là danh sách các hạn chế với cú pháp giới hạn hiện tại mà vượt qua với nơi cú pháp:
Nó không thể diễn tả giới hạn về bất cứ điều gì khác hơn là tham số kiểu. Do đó, nếu bạn có một hàm tổng quát trong T
, bạn có thể viết T:MyTrait
tuyên bố rằng T
phải thực hiện MyTrait
, nhưng bạn không thể viết Option<T> : MyTrait
hoặc (int, T) : MyTrait
. Các hình thức này ít hơn thường được yêu cầu nhưng vẫn quan trọng.
Nó không hoạt động tốt với các loại được liên kết. Điều này là do không có không gian để xác định giá trị của một loại liên quan. Các ngôn ngữ khác sử dụng các mệnh đề (hoặc một cái gì đó tương tự) cho mục đích này.
Thật khó đọc. Kinh nghiệm cho thấy rằng khi số lượng giới hạn tăng lên, cú pháp hiện tại trở nên khó đọc và định dạng .
Kể từ đó bạn cũng có thể sử dụng đặc điểm cao thứ hạng tiếp giáp (for <'a> ...
) trong một khoản where
:
fn foo<T, U>()
where
// higher-ranked trait bounds
for<'a> T: SomethingElse<'a>,
// Bound not directly on the generic type
i32: From<U>,
T: Iterator,
// Bound on an associated type
T::Item: Clone,
// Just really long
U: ReallyLong + AnotherReallyLong + WowReallyLong,
{}
Nếu nhu cầu của bạn có thể được đáp ứng bởi các giới hạn inline đặc điểm, sau đó không có tác động đến mã của bạn. Nếu bạn cần thêm sức mạnh chỉ có where
bật, thì bạn cần sử dụng where
.
phong cách cá nhân của tôi là để luôn sử dụng mẫu where
.Có một hình duy nhất cũng dễ dàng hơn để git diff
khi thêm giới hạn mới đáng giá thêm dòng mã cho tôi.
TBH đó là một trong những trường hợp mà tôi mong đợi cho Zen của Python :) Ngoài ra, về mặt lịch sử đã có sự khác biệt nhỏ, tôi nhớ '? Sized' chỉ có thể được sử dụng trong mệnh đề' where' trong một thời gian. –
@MatthieuM. đó là cách khác xung quanh - '? Sized' chỉ làm việc nội tuyến. Tôi nhớ vì tôi cũng thích một phong cách duy nhất (sử dụng 'where') nhưng nó không hoạt động cho'? Sized' ... – Shepmaster