2017-10-17 41 views
7

Trong the docs cho Send đặc điểm, tôi nhìn thấy cả haiSự khác nhau giữa <T: Trait> và nơi T: Trait

impl<T> Send for LinkedList<T> 
where 
    T: Send, 

impl<T: Send> Send for LinkedList<T> 

sự khác biệt giữa hai cú pháp này là gì, và làm thế nào sẽ nó tác động mã của tôi nếu tôi đang viết tờ khai impl cho đặc điểm của riêng tôi?

Trả lời

8

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 đề whereintroduced 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.

+2

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. –

+3

@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

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