Size: a a a

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

2020 August 17

Ct

Casual tears in Rust — русскоговорящее сообществo
Как вариант можешь написать что-то вроде
data_str.split('\n').map(String::from).collect() и возвращать Vec<String> из функции
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
fn read_lines_from_file<'a>(mut fz: File) -> Vec<&'a str> {
   let mut data_str = String::new();
   fz.read_to_string(&mut data_str);
   
   data_str.split('\n').collect::<Vec<&'a str>>().clone()
}
пытаюсь сделать так, но возникает проблема с временем жизни data_str,  
`data_str` does not live long enough
borrowed value does not live long enough
Можешь принимать data_str: &mut String в аргументах
источник

ph

pl 🦑 hk in Rust — русскоговорящее сообществo
fn read_lines_from_file<'a>(mut fz: File) -> Vec<&'a str> {
   let mut data_str = String::new();
   fz.read_to_string(&mut data_str);
   
   data_str.split('\n').collect::<Vec<&'a str>>().clone()
}
пытаюсь сделать так, но возникает проблема с временем жизни data_str,  
`data_str` does not live long enough
borrowed value does not live long enough
источник

b

in Rust — русскоговорящее сообществo
ладно, решил по-другому

fn read_lines_from_file<'a>(mut fz: File) -> Vec<String> {
   let mut data_str = String::new();
   let mut lines = Vec::new();
   fz.read_to_string(&mut data_str).unwrap();
   
   let _ = data_str.split('\n').map(|b| lines.push(b.to_string()));

   lines
}
источник

Ct

Casual tears in Rust — русскоговорящее сообществo
ладно, решил по-другому

fn read_lines_from_file<'a>(mut fz: File) -> Vec<String> {
   let mut data_str = String::new();
   let mut lines = Vec::new();
   fz.read_to_string(&mut data_str).unwrap();
   
   let _ = data_str.split('\n').map(|b| lines.push(b.to_string()));

   lines
}
Оно пустой вектор всегда возвращает (:
источник

b

in Rust — русскоговорящее сообществo
и в правду)
источник

Ct

Casual tears in Rust — русскоговорящее сообществo
ладно, решил по-другому

fn read_lines_from_file<'a>(mut fz: File) -> Vec<String> {
   let mut data_str = String::new();
   let mut lines = Vec::new();
   fz.read_to_string(&mut data_str).unwrap();
   
   let _ = data_str.split('\n').map(|b| lines.push(b.to_string()));

   lines
}
источник

D

Denis in Rust — русскоговорящее сообществo
Интересно, как называется явление, когда человеку кидают решение, но не разжёвывают его, а человек бодро это решение игнорирует, продолжая сражаться с мельницами?
источник

d

diabolo in Rust — русскоговорящее сообществo
Denis
Интересно, как называется явление, когда человеку кидают решение, но не разжёвывают его, а человек бодро это решение игнорирует, продолжая сражаться с мельницами?
Синдром копи-паст
источник

b

in Rust — русскоговорящее сообществo
типа хочет все-таки решить так как начал сам ?
источник

b

in Rust — русскоговорящее сообществo
fn read_lines_from_file<'a>(mut fz: File) -> Vec<String> {
   let mut data_str = String::new();
   let mut lines = Vec::new();
   fz.read_to_string(&mut data_str).unwrap();
   
   for line in data_str.split('\n') {
       lines.push(line.to_string())
   }

   lines
}
вот так работает
источник

d

diabolo in Rust — русскоговорящее сообществo
fn read_lines_from_file<'a>(mut fz: File) -> Vec<String> {
   let mut data_str = String::new();
   let mut lines = Vec::new();
   fz.read_to_string(&mut data_str).unwrap();
   
   for line in data_str.split('\n') {
       lines.push(line.to_string())
   }

   lines
}
вот так работает
если все равно уперся, то не короче было бы заменить map на for_each?
источник

SS

Slava Sokolovsky in Rust — русскоговорящее сообществo
fn read_lines_from_file<'a>(mut fz: File) -> Vec<String> {
   let mut data_str = String::new();
   let mut lines = Vec::new();
   fz.read_to_string(&mut data_str).unwrap();
   
   for line in data_str.split('\n') {
       lines.push(line.to_string())
   }

   lines
}
вот так работает
Через буферед-ридер быстрее будет читаться, скорее всего
Еще могу предложить std::fs::read -> String::from_bytes сделать
источник

Э

Эрик in Rust — русскоговорящее сообществo
fn read_lines_from_file(mut fz: File, buffer_string: &mut String) -> io::Result<Vec<&str>> {
 fz.read_to_string(&mut buffer_string)?;
 Ok(buffer_string.lines().collect())
}
источник

Э

Эрик in Rust — русскоговорящее сообществo
Хотя вектор собирать тут лишнее скорее всего под твою задачу, потому что ты по нему потом всё равно итерируешься, а не по индексам прыгаешь.
источник

r

red75prime in Rust — русскоговорящее сообществo
fn read_lines_from_file<'a>(mut fz: File) -> Vec<String> {
   let mut data_str = String::new();
   let mut lines = Vec::new();
   fz.read_to_string(&mut data_str).unwrap();
   
   for line in data_str.split('\n') {
       lines.push(line.to_string())
   }

   lines
}
вот так работает
Лучше бы что-то вроде
    f.lines()
   .map(|result| {
       let mut s = result.expect("Cannot read");
       if s.ends_with('\n') {
           s.pop();
       }
       s
   })
   .collect()
источник

Э

Эрик in Rust — русскоговорящее сообществo
Или я не прав?
источник

b

in Rust — русскоговорящее сообществo
Эрик
fn read_lines_from_file(mut fz: File, buffer_string: &mut String) -> io::Result<Vec<&str>> {
 fz.read_to_string(&mut buffer_string)?;
 Ok(buffer_string.lines().collect())
}
да, итерируюсь
источник

Э

Эрик in Rust — русскоговорящее сообществo
да, итерируюсь
Один раз?
источник

Э

Эрик in Rust — русскоговорящее сообществo
let mut s = String::new();
let mut lines = { fz.read_to_string(&mut s); s.lines() };
lines.for_each(|l| println!("{}", l));
источник