Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.10.2020
Сообщений: 3
1

Как обменять объекты пользовательского типа в Rust

04.10.2020, 23:24. Показов 531. Ответов 7
Метки rust (Все метки)

Довольно долго занимался программированием, пересмотрел много разных языков и со многими довелось поработать, а сейчас вот захотел попробовать разобраться с языком rust. Так уж сложилось, что я несколько избалован изобилием литературы и программ-примеров, которыми можно пользоваться при освоении новых языков, а вот отсутствие всего этого для раста меня несколько смутило. Собственно говоря, проблема заключается в следующем - имеется структура S, содержащая различные поля, одно из которых имеет тип String. Функция принимает на вход срез элементов типа S. Внутри функции, само собой, используются элементы среза, но вот беда - при компиляции выскакивает такая ошибка:


error[E0508]: cannot move out of type `[S]`, a non-copy slice
t = arr[i];
| ^^^^
| |
| cannot move out of here
| move occurs because `arr[_]` has type `S`, which does not implement the `Copy` trait

Чего с ней делать, честно говоря, ума не приложу. В качестве эксперимента попробовал переписать функцию для среза с целыми числами - как и предполагалось, никаких проблем с компиляцией не возникло. То ли я этот срез передаю как-то не так, то ли я структуру не так объявил. Может надо как-то прописать реализацию этого типажа? И если да, то как это сделать?
Буду очень признателен за любую помощь!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.10.2020, 23:24
Ответы с готовыми решениями:

Как заставить std::set хранить объекты пользовательского типа?
Здравствуйте. Как заставить set хранить объекты некоторого класса или структуры? #include...

Перегрузить operator*() для перемножения матриц (объекты пользовательского типа Matrix)
Помогите доделать программу. Там нужно всего пару ошибок исправить... У меня уже мозг взрывается(((...

[Rust] Как привязывать WinAPI-функции к коду на Rust?
Может кто-нить дать код, КАК привязывать вин апишные функции к растовскому коду (на примере...

Как создать в форме поле пользовательского типа?
Поля базовых типов создаются без проблем. Но когда пытаюсь создать поле моего типа возникает ошибка...

7
4135 / 2714 / 388
Регистрация: 01.06.2013
Сообщений: 5,714
Записей в блоге: 9
04.10.2020, 23:36 2
Лучше отправить десяток строк кода со словами: «после 7-ой строки я ожидал увидеть , но вместо этого получил », и скорее всего ответ вы получите.

Приведите минимального размера, но оформленный как целая программа код в котором проявляется эта ошибка.
1
0 / 0 / 0
Регистрация: 04.10.2020
Сообщений: 3
04.10.2020, 23:50  [ТС] 3
Код
struct S
{
    f1: String,
    f2: i32,
}

fn TransSl(mut arr: &mut [S])
{
    let mut i: i32;
    let mut t = S {f1:"".to_string(), f2:0};
    for i in 0..arr.len()
    {
        t = arr[i];
    }
}

fn main(){
    
}
0
4135 / 2714 / 388
Регистрация: 01.06.2013
Сообщений: 5,714
Записей в блоге: 9
05.10.2020, 01:09 4
Из кода непонятно что вы хотите.
Строки не копируются, они клонируются. Копирование, оно для примитивных типов (числа, символы ...).
Ваша структура содержит String, её нужно клонировать.
Например
Код
#[derive(Debug,Clone)]
struct S
{
    f1: String,
    f2: i32,
}

fn trans_sl(arr: &mut [S])
{
    let mut t;// Зачем это?
    for e in arr.iter()
    {
        t = (*e).clone();
        println!("{:?}", t); // просто для примера, надо же с t что то делать.
    }
}

fn main() {
    let mut a = vec![ 
        S{f1: "qwerty".to_string(), f2: 28},
        S{f1: "asdfgh".to_string(), f2: 82}
    ];
    trans_sl(&mut a);
}
2
0 / 0 / 0
Регистрация: 04.10.2020
Сообщений: 3
05.10.2020, 14:18  [ТС] 5
То что Вы предложили скомпилировалось, я рад, спасибо
Не подскажете, в чем разница между копированием и клонированием?
И для чего в первой строке указано Debug?
0
4135 / 2714 / 388
Регистрация: 01.06.2013
Сообщений: 5,714
Записей в блоге: 9
05.10.2020, 15:56 6
Цитата Сообщение от Victor Serov Посмотреть сообщение
в чем разница между копированием и клонированием?
Копирование побайтно, не обращая внимание на содержимое. А в вашей структуре, есть строка. В строке есть ссылка на собственно текст строки.
Побайтное копирование просто бы скопировало всю структуру с адресом ссылки, но не текст.
Для клонирования, для каждого клонируемого типа, определяют trait Clone со своей функцией clone в которой описывают как правильно клонировать, возможно, с копированием внутренних частей.
Цитата Сообщение от Victor Serov Посмотреть сообщение
для чего в первой строке указано Debug?
Что бы можно было выводить структуру в отладочном виде с помощью println!("{:?}",...).
1
║XLR8║
1107 / 854 / 256
Регистрация: 25.07.2009
Сообщений: 4,181
Записей в блоге: 5
09.10.2020, 01:07 7
Victor Serov, вам надо читать книгу и примеры, тогда все вопросы пропадут.
1
Модератор
Эксперт Python
28590 / 15454 / 3053
Регистрация: 12.02.2012
Сообщений: 25,333
Записей в блоге: 4
09.10.2020, 07:18 8
"Язык умнее тех, кто на нем говорит"... (автора не помню). Человек, который считает, что программа "прописывается", книг не читает. Зачем? Нужно спросить - и тебе подскажут, как "прописать" то или иное действие.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2020, 07:18

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

ListBox: Как передать данные из пользовательского типа?
Привет! Подскажите, пожалуйста. Следующая ситуация: Есть своя структура-тип: Public Type...

Как создать шаблон для пользовательского и встроенного типа?
Есть перегруженные операторы класса: void String::operator=(const char *a){ //Перегрпуженный...

Как создать элемент вектора пользовательского типа(класса)?
Делаю змейку в консоли, а по сути тренируюсь с классами и векторами. Есть класс с конструктором...

Как присвоить значения полям переменной пользовательского типа?
----------- Public Type MyType val_1 As Byte val_2 As Single End Type ----------- как...

Как вызвать метод из указателя на вектор пользовательского типа?
#include <iostream> #include <vector> #include <string> using namespace std; struct Client {...

[Rust] impl для примитивного типа
Привет всем! Решаю задачку на codewars.com, а там, видимо, rust более ранней версии чем свежий,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.