После перехода с январьской версии компилятора Rust на beta. Обнаружил что код подобный этому не компилируется http://is.gd/oX7GWN
use std::fmt::{Display, Formatter, Error};
struct MyLocalType;
type MyResult = Result
impl Display for MyResult {
fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
f.write_str("some test string")
}
}
fn main() {
let r: MyResult = Ok(MyLocalType);
println!("{}" , r);
}
Это ошибка компилятора, или теперь внешние параметризованные типы нужно всегда "заворачивать" в свои ?
Ответ
Ответ, скопированый с англоязычного stackoverflow:
https://stackoverflow.com/questions/29789877/can-not-implement-trait-from-another-crate-for-generic-type-from-another-crate-p
There's no direct way to solve this for a pure alias like type.
The code is the same as
impl Display for Result
Описание на русском, как его понял я:
Теперь нет способа реализовывать типаж для стороннего обобщённого типа, пусть даже и параметризованного локальным типом. Так как компилятор не может быть уверен, что реализация будет согласована со всеми другими реализациями.
Чтобы решить эту проблему нужно сделать тип полностью локальным. Eсть несколько способов:
«Обернуть» его в локальный тип-обёртку, например: struct
MyResult(Result
Комментариев нет:
Отправить комментарий