2016-08-26 42 views
7

Chcę zaimplementować niestandardową cechę dla &'a str i dla liczb całkowitych aż do i32, ale rdza nie pozwala mi:Sprzeczne implementacje cechy 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() {} 

To nie skompilować z powodu następującego błędu:

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 nie implementuje Into<i32>. Czy jest możliwe wdrożenie UiId dla &'a str i wszystkiego, co można przekonwertować na i32 bez określania konkretnych typów? Jak mogę to zrobić?

+0

Myślę, że to musi być ograniczenie w sposobie, w jaki Rust określa, czy nakładka implementacji (lub może nakładać się), ale nie znalazłem nigdzie, gdzie zasady są podane. :-(Och, dla właściwej specyfikacji językowej! –

Odpowiedz

8

Fakt, że &'a str nie wykonuje Into<i32> nie jest brany pod uwagę, ponieważ nie ma gwarancji, że nie będzie można go później dodać. To by złamało twój kod.

Gdyby było to dozwolone, możliwe złamanie utrudniłoby dodawanie implementacji do cech biblioteki.

Niestety nie mogłem znaleźć dokumentacji, ani w The Rust Programming Language Book ani w Reference Manual.

Najlepszą udało mi się znaleźć to RFC 1023, który mówi, że paka [...] nie może polegać że Type: !Trait posiada chyba Type lub Trait jest lokalny.

+0

Właściwie nie sądzę, że to prawda.Nie jest to, co to są zasady sieroty? Nie można dodać cudzysłów 'impl's dla obcego typu. Cecha i typ muszą być zdefiniowane w bieżącej skrzyni ... aby pozwolić kompilatorowi powód na takie przypadki, * myślę, że *. –

+0

@LukasKalbertodt Zobacz moją edycję.Jest to w tym samym zdaniu co zasada ophana w RFC 1023. – starblue

+0

O tak, to brzmi rozsądnie. –