2016-08-26 17 views
7

Tôi muốn thực hiện một đặc điểm tùy chỉnh cho &'a str và cho số nguyên lên đến i32, nhưng Rust không cho phép tôi để:triển khai mâu thuẫn của đặc điểm ở Rust

use std::convert::Into; 

pub trait UiId { 
    fn push(&self); 
} 

impl<'a> UiId for &'a str { 
    fn push(&self) {} 
} 

impl<T: Into<i32>> UiId for T { 
    fn push(&self) {} 
} 

fn main() {} 

này thất bại trong việc biên dịch với các lỗi sau:

error[E0119]: conflicting implementations of trait `UiId` for type `&str`: 
    --> src/main.rs:11:1 
    | 
7 |/impl<'a> UiId for &'a str { 
8 | |  fn push(&self) {} 
9 | | } 
    | |_- first implementation here 
10 | 
11 |/impl<T: Into<i32>> UiId for T { 
12 | |  fn push(&self) {} 
13 | | } 
    | |_^ conflicting implementation for `&str` 

&'a str không thực hiện Into<i32>. Có thể triển khai UiId cho &'a str và mọi thứ có thể được chuyển đổi thành i32 mà không chỉ định loại cụ thể không? Làm thế nào tôi có thể làm điều đó?

+0

Tôi nghĩ rằng nó phải là một hạn chế trong cách Rust xác định xem triển khai phủ (hoặc có thể chồng chéo), nhưng tôi đã không tìm thấy bất cứ nơi nào các quy tắc được viết ra. :-(Oh, cho một đặc tả ngôn ngữ thích hợp –

Trả lời

8

Thực tế là &'a str không thực hiện Into<i32> không được tính đến, vì không có đảm bảo rằng nó không thể được thêm vào sau này. Điều này sau đó sẽ phá vỡ mã của bạn.

Vì vậy, nếu điều này được cho phép, có thể vỡ sẽ làm cho việc thêm triển khai vào các đặc điểm của thư viện trở nên khó khăn hơn.

Rất tiếc, tôi không thể tìm thấy tài liệu cho điều đó, không phải trong The Rust Programming Language Sách cũng như trong số Reference Manual.

Điều tốt nhất tôi có thể tìm thấy là RFC 1023, mà nói rằng một thùng [...] có thể không dựa rằng Type: !Trait giữ trừ Type hoặc Trait là địa phương.

+0

Tôi thực sự không nghĩ rằng đó là sự thật.Đây không phải là những gì các quy tắc mồ côi là cho? Bạn không thể thêm đặc điểm nước ngoài 'impl's cho một loại nước ngoài. của đặc điểm và kiểu phải được định nghĩa trong thùng hiện tại ... để cho trình biên dịch có lý do về các trường hợp như thế này, * Tôi nghĩ * –

+0

@LukasKalbertodt Xem bản chỉnh sửa của tôi. Nó giống như câu lệnh ophan trong RFC 1023. – starblue

+0

Oh thực sự, điều đó nghe có vẻ hợp lý. –

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