2016-08-26 2 views
7

Я хочу, чтобы реализовать пользовательский признак для &'a str и для целых чисел до i32, но ржавчина не позволяет мне:Противоречивые реализации признака Руст

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() {} 

Это не может скомпилировать со следующей ошибкой:

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 не реализует Into<i32>. Возможно ли реализовать UiId для &'a str и все, что может быть преобразовано в i32 без указания конкретных типов? Как я могу это сделать?

+0

Я думаю, что это должно быть ограничение в отношении того, как Rust определяет, накладываются ли наложения (или могут перекрываться), но я не нашел нигде, где правила выписаны. :-(О, для правильной спецификации языка! –

ответ

8

Тот факт, что &'a str не реализует Into<i32>, не учитывается, потому что нет гарантии, что он не может быть добавлен позже. Это сломает ваш код.

Так что, если бы это было разрешено, возможный поломка затруднял бы добавление реализаций в библиотечные черты.

К сожалению, я не смог найти документацию для этого, ни в The Rust Programming Language Книга ни в Reference Manual.

Лучшее, что я смог найти RFC 1023, который говорит, что клеть [...] не может рассчитывать, что Type: !Trait держит, если Type или Trait не является локальным.

+0

Я действительно не думаю, что это правда. Разве это не те правила для сирот? Вы не можете добавить внешний признак 'impl' для иностранного типа. черты и тип должны быть определены в текущем ящике ..., чтобы позволить компилятору рассуждать о подобных случаях *, я думаю *. –

+0

@LukasKalbertodt См. мое редактирование. Это в том же предложении, что и правило сироты в RFC 1023. – starblue

+0

О, действительно, это звучит разумно. Спасибо! –

Смежные вопросы