2015-02-09 38 views
13

Thật không may, tài liệu của Rust liên quan đến where là rất thiếu. Từ khóa chỉ xuất hiện trong một hoặc hai ví dụ không có liên quan trong tham chiếu.Cú pháp và ngữ nghĩa của từ khóa `where` là gì?

  1. Sự khác biệt ngữ nghĩa nào where thực hiện trong mã sau? Có sự khác biệt nào không? Biểu mẫu nào được ưu tiên hơn?

    fn double_a<T>(a:T) -> T where T:std::num::Int { 
        a+a 
    } 
    
    fn double_b<T: std::num::Int>(a:T) -> T { 
        a+a 
    } 
    
  2. Trong việc thực hiện các đặc điểm CharEq, có vẻ như where đang được sử dụng như một số loại "chọn" để thực hiện Trait cho bất cứ điều gì phù hợp với một số loại đóng cửa. Tôi có đúng không?

Có cách nào để có được bức ảnh đẹp hơn, đầy đủ hơn về where không? (đầy đủ đặc điểm kỹ thuật về cách sử dụng và cú pháp)

Trả lời

15

Trong ví dụ của bạn, hai mã này hoàn toàn tương đương nhau.

Các where khoản đã được giới thiệu để cho phép biểu cảm hơn ràng buộc kiểm tra, làm ví dụ:

fn foo<T>(a: T) where Bar<T>: MyTrait { /* ... */ } 

nào không thể chỉ sử dụng các cú pháp cũ.

Sử dụng where thay vì cú pháp ban đầu thường được ưu tiên cho khả năng đọc ngay cả khi cú pháp cũ vẫn có thể được sử dụng.

Bạn có thể tưởng tượng ví dụ công trình xây dựng như

fn foo<A, B, C>(a: A, b: B, c: C) 
    where A: SomeTrait + OtherTrait, 
      B: ThirdTrait<A>+ OtherTrait, 
      C: LastTrait<A, B> 
{ 
    /* stuff here */ 
} 

mà là nhiều hơn nữa có thể đọc theo cách này, ngay cả khi vẫn có thể được thể hiện bằng cách sử dụng cú pháp cũ.

Đối với câu hỏi của bạn về CharEq đặc điểm, mã này là:

impl<F> CharEq for F where F: FnMut(char) -> bool { 
    #[inline] 
    fn matches(&mut self, c: char) -> bool { (*self)(c) } 

    #[inline] 
    fn only_ascii(&self) -> bool { false } 
} 

Nó có nghĩa là: Thực hiện đặc điểm CharEq cho tất cả các loại F rằng đã thực hiện các đặc điểm FnMut(char) -> bool (có nghĩa là, một đóng cửa hoặc một chức năng lấy số char và trả lại bool).

Để biết thêm chi tiết, bạn có thể ghé qua RFC mà giới thiệu where khoản: https://github.com/rust-lang/rfcs/pull/135

+0

cũng là lý do cả hai giới hạn đặc điểm và nơi điều khoản tồn tại là nikomatsakis "đã quyết định chống lại điều này cả hai để tránh phá vỡ rất nhiều mã hiện có và vì cú pháp hiện tại thuận tiện nhiều trong thời gian. " Phần thứ hai xung đột với "thường được ưa thích", bạn có bất kỳ nguồn nào trên kiểu tùy chọn/mã hóa đó không? –

+1

Nguồn ... Không, tôi không. Tôi chủ yếu cho rằng nó nhìn thấy những mệnh đề được sử dụng khá nhiều ở mọi nơi tôi nhìn. – Levans

+0

Tôi nhận thấy điều tương tự, cảm ơn :) –

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