Комментарии 4
Стоит отметить, что эта статья немного устарела. В Rust 1.0 и последующих версиях (и даже немного раньше 1.0) по умолчанию значения не копируются, а перемещаются, даже если тип содержит только Copy-данные внутри себя. Чтобы тип был копируем, нужно явно реализовать трейт Copy для него, например, с помощью
#[deriving(Copy, Clone)]
(реализовать также Clone нужно потому что Copy наследует Clone). Поэтому маркера NoCopy больше не существует.+6
Copy наследует Clone
Скорее не «наследует», а «требует», потому что это типаж, а не класс, а типажи не наследуют, а накладывают ограничения по типы, для которых их реализуют. И если бы Copy наследовал Clone, то выходило бы, что явно говорить, что надо реализовать Clone, было бы не нужно (ведь его функционал уже включён в Copy), а он именно требует, поэтому для каждой реализации Copy надо явно реализовать Clone.
0
Я в курсе, что «наследование» трейтов на самом деле не наследование в смысле наследования классов/интерфейсов, например, в Java. Но это официальная терминология, см. например, здесь:
(выделение моё)
Поэтому, так как
вполне корректно говорить, что
Traits may inherit from other traits.
(выделение моё)
Поэтому, так как
Copy
объявлен какtrait Copy : Clone {}
вполне корректно говорить, что
Copy
наследует Clone
.0
Хм, возможно. Просто я как-то привык к определённому значению слова «наследование» в ООП, а тут оно имеет несколько иное значение, поэтому пришлось мысленно выбирать другой термин для более точного понимания, так что я сам привык думать про эту концепцию в расте как о «требовании» или «ограничениях на тип», чтобы не путать с наследованием как его понимают в классическом ООП.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Заимствование и время существования в Rust