Size: a a a

Rust — русскоговорящее сообществo

2020 November 16

DS

Dmitry Sokolov in Rust — русскоговорящее сообществo
Stanislav Sagan
Очень большой длиннопост. А ещё есть тематический чатик как раз таки про rust async
Там 2/3 сначала можно не читать.
Суть в том, что автор редактировал код крейта, чтобы добавить туда Send
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
Добрый день,

Подскажите пожалуйста
Нужно сформировать новую строку исходя из наличия 'http' в &String
Делаю через clone но не уверен что это правильно хотя и работает.

host.domain является &String


let mut t = host.domain.clone();
if !host.domain.contains("http") {
   t =  format!("{}http://{}", url, t);
}

то есть надо получить в результате url c "http"
источник

L

Lain-dono in Rust — русскоговорящее сообществo
Mikail Bagishov
Мб erased-serde поможет
Вообще выглядит так, будто я могу это закостылять через typetag, но там толи ron не умеет толи чего. В итоге:

[
 {"A": (1, 2, 3)},
 {"B": ("abc")},
]


Вместо

[
 A(1, 2, 3),
 B("abc"),
]
источник

L

Lain-dono in Rust — русскоговорящее сообществo
Впрочем и так сойдёт
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Vasili Pascal
Добрый день,

Подскажите пожалуйста
Нужно сформировать новую строку исходя из наличия 'http' в &String
Делаю через clone но не уверен что это правильно хотя и работает.

host.domain является &String


let mut t = host.domain.clone();
if !host.domain.contains("http") {
   t =  format!("{}http://{}", url, t);
}

то есть надо получить в результате url c "http"
contains слишком расточительно, лучше использовать .starts_with().
И "http" - не достаточно конкретно (вдруг у меня хост называется http_host). Надо проверять хотя бы на "http:/", если не предполагается наличие https
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
@cykooz спасибо, то есть clone() в данном случае это ок ?
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Kirill (Cykooz) Kuzminykh
contains слишком расточительно, лучше использовать .starts_with().
И "http" - не достаточно конкретно (вдруг у меня хост называется http_host). Надо проверять хотя бы на "http:/", если не предполагается наличие https
let t = if !host.domain.starts_with("http:/") {
   format!("{}http://{}", url, host.domain)
}
else {
   host.domain.clone()
};


Только я не понял что такое url и почему его не должно быть в else ветке.
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
format!() сам создаёт новый String, не обязательно ему передавать клон исходной строки
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
@cykooz без clone проблема была такой
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Vasili Pascal
@cykooz спасибо, то есть clone() в данном случае это ок ?
Через match будет на пару строк меньше:
let t = match host.domain.starts_with("http:/") {
   true => host.domain.clone(),
   false => format!("{}http://{}", url, host.domain),
};
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Vasili Pascal
@cykooz без clone проблема была такой
Вы случайно не из Python в Rust пришли? 😊
Это обычно там такое практикуют - сначала присвоить переменной дефолтное значение, а потом одним if без else-ветки поменять его на другое значение.
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
да, через match тоже делал, я хотел избавиться от clone(). :).  Точно!  из python
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Vasili Pascal
да, через match тоже делал, я хотел избавиться от clone(). :).  Точно!  из python
Ну вот в Rust - это преждевременная операция, а в случае с clone() ещё и вероятно операция с системным вызовом и аллокацией памяти. Лучше сначала определиться что нужно, а потом делать это.
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
я перепробовал уже несколько конструкций пока оставил привычную со временем адаптируюсь
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
я это понимаю 🙂 спасибо
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Ну вот я вам привёл вариант с match - используйте его, и не будет у вас лишнего clone() если он не нужен.
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
пасиб тока сейчас я получаю
  true => &host.domain,
  | |                 ------------ this is found to be of type &std::string::String
95 | |         false => format!("{}http://{}", url, host.domain),
  | |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected &std::string::String, found struct std::string::String
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Vasili Pascal
пасиб тока сейчас я получаю
  true => &host.domain,
  | |                 ------------ this is found to be of type &std::string::String
95 | |         false => format!("{}http://{}", url, host.domain),
  | |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected &std::string::String, found struct std::string::String
Да, потому что у вас типы данных в ветках матча разные. Поэтому в моём примере используется clone()
источник

VP

Vasili Pascal in Rust — русскоговорящее сообществo
оки привел  to_string() и прошел дальше спасибо
источник

KK

Kirill (Cykooz) Kuzm... in Rust — русскоговорящее сообществo
Vasili Pascal
оки привел  to_string() и прошел дальше спасибо
Если хотите уменьшить число клонов и использовать ссылки, то можно вот так:
  let tmp: String;
 let host = "domain".to_string();
 let t = match host.starts_with("http:/") {
    true => &host,
    false => {
      tmp = format!("http://{}", host);
      &tmp
    }
 };
источник