Нет, не тот новый тип.

Я начал следующую главу своего исследования Rust, а именно: «напишите свой собственный список». Если вы не знаете, написать список в Rust действительно сложно, потому что Rust не позволяет срезать углы. Списки как минимум на 50% состоят из указателей, а время жизни приведения и темы ref/deref неудобно близки.

В Rust любой уважающий себя список — это Option<Box<Node>>, по сути список может быть None (ничего внутри, пустой), а может иметь Some штук в куче.

Когда вы создаете тип List (или любой другой тип), идиоматично писать impl для этого типа. И первое, что я обнаружил, это то, что Rust действительно заботится о происхождении типов (Защищенное обозначение происхождения, как это называют в Европе. Prosciutto‹San Daniele› и т.д.).

Есть два способа определить новый тип: псевдоним типа и новый тип.

Псевдоним типа — это просто сокращенное имя существующего типа (отсюда и псевдоним).

F.e.:

type List=Option<Box<Node>>;

newtypes — это особый шаблон ‹s›quirk‹/s› в определении структуры:

struct List(Option<Box<Node>>);

Они выглядят как вариант формализма, пока вы не попытаетесь их реализовать:

impl List{
...
}

Что случается?

Если у вас есть псевдоним типа, вы не можете реализовать его. Это псевдоним для Option, и поверьте мне, Option уже хорошо реализован где-то здесь.

|_^ impl for type defined outside of crate.

Если вы создаете новый тип, это в буквальном смысле новый тип, и, поскольку вы его создали, у вас есть полная свобода, которую вы хотите, чтобы написать любую реализацию, которую вы осмелитесь написать.

Обходной путь для псевдонимов

Хотя вы не можете реализовать «защищенный исходный тип» (тип за пределами вашего ящика), вы можете найти обходной путь: создать свой собственный трейт.

trait MyTrait {
}
impl MyTrait for List {
}

Что на самом деле читается Rust как:

impl MyTrait for Option<Box<Node>>{
}

В конце нет изюминки, я просто понял разницу между ними и решил записать это (совершенно банальное для большинства пользователей Rust) наблюдение.