поля, которые я хотел бы заколлектить в другой вектор. Как это сделать без двух for- лупов ? Пример:
struct SocketAddr {
addr: String,
port: u16,
}
struct SocketsData {
socket_addr: Vec<SocketAddr>,
}
fn main() {
let sock_data = Some(vec![SocketsData {
socket_addr: vec![SocketAddr {
addr: "1234".to_string(),
port: 555,
}],
}]);
let socks: Vec<String> = Vec::new();
if let Some(ref sock_data) = sock_data {
// format addr+port and push it to the socks
}
}
Хм, разобрался. Получилось вот так: if let Some(ref sock_data) = sock_data { let addrs = sock_data .iter() .flat_map(|sock_data| &sock_data.socket_addr) .collect::<Vec<_>>() .iter() .map(|sock_addr| format!("{}:{}", sock_addr.addr, sock_addr.port)) .collect::<Vec<_>>() .join(""); println!("{}", addrs); } Красивее можно как-то ?
но зачем .collect().iter() по середине?
О, красота. Спасибо !
А и можно заменить .collect::<Vec<_>>().join("") на .collect::<String>() насколько я помню. Вроде clippy об этом тебя должен предупредить.
А, там сепаратор должен стоять правильный - ";"
Обсуждают сегодня