Pull to refresh

Comments 4

Стоит отметить, что эта статья немного устарела. В Rust 1.0 и последующих версиях (и даже немного раньше 1.0) по умолчанию значения не копируются, а перемещаются, даже если тип содержит только Copy-данные внутри себя. Чтобы тип был копируем, нужно явно реализовать трейт Copy для него, например, с помощью #[deriving(Copy, Clone)] (реализовать также Clone нужно потому что Copy наследует Clone). Поэтому маркера NoCopy больше не существует.
Copy наследует Clone

Скорее не «наследует», а «требует», потому что это типаж, а не класс, а типажи не наследуют, а накладывают ограничения по типы, для которых их реализуют. И если бы Copy наследовал Clone, то выходило бы, что явно говорить, что надо реализовать Clone, было бы не нужно (ведь его функционал уже включён в Copy), а он именно требует, поэтому для каждой реализации Copy надо явно реализовать Clone.
Я в курсе, что «наследование» трейтов на самом деле не наследование в смысле наследования классов/интерфейсов, например, в Java. Но это официальная терминология, см. например, здесь:
Traits may inherit from other traits.

(выделение моё)

Поэтому, так как Copy объявлен как
trait Copy : Clone {}

вполне корректно говорить, что Copy наследует Clone.
Хм, возможно. Просто я как-то привык к определённому значению слова «наследование» в ООП, а тут оно имеет несколько иное значение, поэтому пришлось мысленно выбирать другой термин для более точного понимания, так что я сам привык думать про эту концепцию в расте как о «требовании» или «ограничениях на тип», чтобы не путать с наследованием как его понимают в классическом ООП.
Sign up to leave a comment.

Articles