У меня есть перечисление в Rust, у которого есть одно значение, которое принимает String
. Это может быть продемонстрировано с помощью этого простого примера:Как реализовать Clone/Copy для перечисления, содержащего String?
#[derive(Clone, Copy)]
enum Simple {
Error(String),
Okay,
Foo([u32; 5]),
}
fn main() {
let x = Simple::Error(String::from("blah"));
let y = x.clone();
}
Значение перечисления Foo
выше, представляет собой около 10 других перечислений, которые я использую, которые принимают Copyable типы или массивы из них. Компилятор, кажется, не жалуются на них, только Error(String)
, который вызывает это:
error: the trait `Copy` may not be implemented for this type; variant `Error` does not implement `Copy` [E0205]
#[derive(Clone, Copy)]
^~~~
note: in this expansion of #[derive_Copy] (defined in src\main.rs)
help: run `rustc --explain E0205` to see a detailed explanation
По какой-то причине String
не копируемыми. Я этого не понимаю. Как реализовать Clone
для перечисления только для одного типа, у которого есть проблема при использовании значения по умолчанию для остальных?
Я должен добавить, что я не понимаю, почему String не может реализовать принцип копирования в принципе или на практике - объекты QString в QT могут быть скопированы, и они совместно используют и поддерживают внутренний буфер. Если копия делает что-то изменчивое, буфер сначала клонируется, поэтому в других экземплярах сохраняется ссылка на исходный буфер. В QT по-прежнему лучше переходить по ссылке, чтобы избежать атомного пересчета, но копия в любом случае эффективна. – locka
@locka потому что * 'Copy' обозначает типы, для которых создание побитовой копии создает действительный экземпляр *. Копирование бит такой строки не может увеличивать атомный счетчик, потому что это не будет копировать. Вы можете выбрать, какие гарантии вам понадобятся. Вы можете [передать права собственности] (http://doc.rust-lang.org/std/rc/struct.Rc.html), [владеть акциями через потоки] (http://doc.rust-lang.org/std /sync/struct.Arc.html), реализовать [clone on write] (http://doc.rust-lang.org/std/borrow/enum.Cow.html) и т. д. Это не подходит для систем язык, чтобы принять это решение (и обременять ваш код) для вас. – Shepmaster