Ответ 1
С &str
&str -> String
имеет много одинаково допустимых методов:String::from(st)
,st.to_string()
,st.to_owned()
.- Но я предлагаю вам придерживаться одного из них в рамках одного проекта. Основное преимущество
String::from
заключается в том, что вы можете использовать его в качестве аргумента для методаmap
. Поэтому вместоx.map(|s| String::from(s))
вы часто можете использоватьx.map(String::from)
.
- Но я предлагаю вам придерживаться одного из них в рамках одного проекта. Основное преимущество
&str
→&[u8]
выполняетсяst.as_bytes()
&str
→Vec<u8>
является комбинацией&str -> &[u8] -> Vec<u8>
, то естьst.as_bytes().to_vec()
илиst.as_bytes().to_owned()
Из String
String -> &str
должен быть просто&s
там, где принуждение доступно, илиs.as_str()
там, где его нет.String -> &[u8]
совпадает с&str -> &[u8]
:s.as_bytes()
String -> Vec<u8>
имеет собственный метод:s.into_bytes()
Из &[u8]
&[u8] -> Vec<u8>
делается с помощьюu.to_owned()
илиu.to_vec()
. Они делают то же самое, но уto_vec
есть небольшое преимущество: он недвусмысленно относится к типу, который он возвращает.&[u8] -> &str
на самом деле не существует, это будет&[u8] -> Result<&str, Error>
, предоставленный черезstr::from_utf8(u)
str::from_utf8(u).unwrap()
работает, но вы должны предпочесть лучшую обработку ошибок (см. Обработка ошибок - Тип результата).
&[u8] -> String
является комбинацией&[u8] -> Result<&str, Error> -> Result<String, Error>
String::from_utf8(u).unwrap()
работает, но предпочитает лучшую обработку ошибок (см. Обработка ошибок - тип результата, а такжеResult::map
.
Из Vec<u8>
Vec<u8> -> &[u8]
должен быть просто&v
там, где доступно принуждение, илиas_slice
там, где его нет.Vec<u8> -> &str
совпадает сVec<u8> -> &[u8] -> Result<&str, Error>
, т.е.str::from_utf8(&v)
str::from_utf8(&v).unwrap()
работает, но предпочитает лучшую обработку ошибок (см. Обработка ошибок - Тип результата)
Vec<u8> -> String
на самом деле не существует, это было быVec<u8> -> Result<String, Error>
черезString::from_utf8(v)
String::from_utf8(v).unwrap()
работает, но предпочитает лучшую обработку ошибок (см. Обработка ошибок - Тип результата).
Принуждение доступно, когда цель не является общей, но явно указывается как &str
или &[u8]
, соответственно. В Rustonomicon есть глава о принуждениях с более подробной информацией о сайтах принуждения.
ТЛ; др
&str -> String | String::from(s) or s.to_string() or s.to_owned()
&str -> &[u8] | s.as_bytes()
&str -> Vec<u8> | s.as_bytes().to_vec() or s.as_bytes().to_owned()
String -> &str | &s if possible* else s.as_str()
String -> &[u8] | s.as_bytes()
String -> Vec<u8> | s.into_bytes()
&[u8] -> &str | s.to_vec() or s.to_owned()
&[u8] -> String | std::str::from_utf8(s).unwrap(), but don't**
&[u8] -> Vec<u8> | String::from_utf8(s).unwrap(), but don't**
Vec<u8> -> &str | &s if possible* else s.as_slice()
Vec<u8> -> String | std::str::from_utf8(&s).unwrap(), but don't**
Vec<u8> -> &[u8] | String::from_utf8(s).unwrap(), but don't**
* target should have explicit type (i.e., checker can't infer that)
** handle the error properly instead