john36allTa
@john36allTa
That`s calling Walker

Как заставить rustc клонировать переменные динамического типа?

Начал знакомство с rust и никак не могу понять "восхваляемое волшебство трэйтов"..
Задача проста, хочу структуру с динамичным типом, к примеру i32 или f64. Rust не знает размер T и не может его копировать.. это Ок!
В книге описан пример использования trait с явным указанием типа данных.
Он работает
5c7e180d72814659884879.png

Попытался повторить -
FAIL
5c7e18465db43117501029.png

Что я сделал не так - не могу понять
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
ozkriff
@ozkriff
Крабообразный
(Не надо кидать код картинкой)

MCVE для твоей ошибки выглядит так:

fn foo<T>(a: T) -> (T, T) {
    (a, a)
}

fn main() {
    foo(1);
}


playground

Как и написано в ошибке, дело в том, что используемый тобой типаж `T` не требует маркерного типажа Copy, а значит переменные с его типом при первом складывании в поле структуры перемещаются, т.е. во второе поле класть уже нечего.

Самый простой способ исправить ошибки в данном случае - добавить требование Copy:

fn foo<T: Copy>(a: T) -> (T, T) {
    (a, a)
}


Playground

Но типаж Copy работает только для POD типов, для более сложных типов в такой ситуации нужен уже типаж Clone.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы