Указатели как аргументы функции при реализации структуры - PullRequest
1 голос
/ 20 сентября 2019

Почему в функции full_name() есть символ & перед self, а в функции to_tuple() его нет?Когда я смотрю на них, использование self одинаково в обеих функциях, но зачем использовать &.Также, когда я добавляю & к to_tuple() или удаляю его из full_name(), это выдает ошибку.Может кто-нибудь объяснить это?

fn full_name(&self) -> String {
    format!("{} {}", self.first_name, self.last_name)
}

fn to_tuple(self) -> (String, String) {
    (self.first_name, self.last_name)
}

1 Ответ

3 голосов
/ 20 сентября 2019

full_name не использует self, он использует ссылку через &self: элементы используются только через ссылки в качестве аргументов для format!(), поэтому ссылка достаточна.

to_tuple(как следует из названия to_...) потребляет self: перемещает членов из self в возвращаемый кортеж.Поскольку исходный self больше не является действительной памятью после перемещения (self больше не владеет памятью), его необходимо использовать, следовательно, перемещение через self.

Вы можете изменить full_name использовать self, то есть переместить владение.Это стало бы неудобным, поскольку вызов функции потреблял бы структуру без необходимости.

to_tuple можно было бы изменить, чтобы она не потребляла self, однако для этого потребуется .clone() (сделатькопия) членов, что дорого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...