zikwall
@zikwall

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

Привет, возможно вопрос звучит дико тупо, но не могу реализовать такую простую вещь как вызов двух методов у объекта.

Есть простая структура с двумя методами:

pub struct MimeType {
    pub extension: String,
    pub charset: String,
}

impl MimeType {
    pub fn new(extension: String, charset: String) -> MimeType {
        return MimeType {
            extension,
            charset,
        };
    }

    pub fn extension(self) -> String {
        return self.extension;
    }

    pub fn charset(self) -> String {
        return self.charset;
    }
}


Пытаюсь написать тесты к ним:

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn is() {
        let m = MimeType::new(
            "test".to_owned(),
            "UTF-8".to_owned()
        );

        assert_eq!("UTF-8", m.charset());
        assert_eq!("UTF-8", m.extension());
    }
}


Но получаю в ответ:

error[E0382]: use of moved value: `m`
  --> src\mime\mod.rs:35:29
   |
29 |         let m = MimeType::new(
   |             - move occurs because `m` has type `mime::MimeType`, which does not implement the `Copy` trait
...
34 |         assert_eq!("UTF-8", m.charset());
   |                               --------- `m` moved due to this method call
35 |         assert_eq!("UTF-8", m.extension());
   |                             ^ value used here after move
   |
note: this function consumes the receiver `self` by taking ownership of it, which moves `m`
  --> src\mime\mod.rs:18:20
   |
18 |     pub fn charset(self) -> String {
   |                    ^^^^

error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.
error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.
error: could not compile `r-mime`

To learn more, run the command again with --verbose.
warning: build failed, waiting for other jobs to finish...
error: build failed


Пробовал и implement the `Copy` trait (не факт, что правильно сделал), появлялись только другие ошибки связанные с этм же...

Что и как надо, толкните плиз :)

З.Ы. только учу раст.
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
попробуйте написать
pub struct MimeType {
    extension: String,
    charset: String,
}

impl MimeType {
    pub fn new(extension: String, charset: String) -> MimeType {
        return MimeType { extension, charset };
    }

    pub fn extension(&self) -> &String {
        return &self.extension;
    }

    pub fn charset(&self) -> &String {
        return &self.charset;
    }
}


строкой владеет MimeType, так что нельзя просто так взять её - нужно либо брать ссылку, либо клонировать.
Обратите ещё внимание на телеграм чаты сообщества - там гораздо проще и быстрее получить ответ на простой вопрос:
https://t.me/rust_beginners_ru
https://t.me/rustlang_ru
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@DarkEld3r
Добавлю, что лучше отдавать не &String, a &str.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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