Qanday qilib satrlari satrlarini bir qatorda/Vektorda Pasga o'tkazish

CSV faylidan bir nechta qatorni o'z ichiga olgan mag'lubiyat bor:

Tahrirlash. Rust haqiqiy satrda yo'q edi.

header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3

I am trying to push these into a Vec>:

// the csv is raw_string
let lines = raw_string.lines();
let mut mainVec = Vec::new();

for row in lines {
    let mut childVec = Vec::new();
    let trimmed = row.trim();
    let values = trimmed.split(',').collect();
    childVec.push(values);
    mainVec.push(childVec.clone());
}

Lekin xato qilaman

error[E0282]: unable to infer enough type information about `_`
 --> src/main.rs:9:13
  |
9 |         let values = trimmed.split(',').collect();
  |             ^^^^^^ cannot infer type for `_`
  |
  = note: type annotations or generic parameter binding required
1
haqiqiy degan javob, csv sandig'ini ishlatishdir, chunki CSVni ajralish juda qiyin har kim o'ylaydi.
qo'shib qo'ydi muallif Shepmaster, manba
haqiqiy degan javob, csv sandig'ini ishlatishdir, chunki CSVni ajralish juda qiyin har kim o'ylaydi.
qo'shib qo'ydi muallif Shepmaster, manba
haqiqiy degan javob, csv sandig'ini ishlatishdir, chunki CSVni ajralish juda qiyin har kim o'ylaydi.
qo'shib qo'ydi muallif Shepmaster, manba
haqiqiy degan javob, csv sandig'ini ishlatishdir, chunki CSVni ajralish juda qiyin har kim o'ylaydi.
qo'shib qo'ydi muallif Shepmaster, manba
@ user4815162342: Eh, qandaydir bir tarzda bu narsani o'tkazib yuborgan bo'lardim. Ya'ni, childVec dan qutulish javobning bir qismi bo'lishi kerak.
qo'shib qo'ydi muallif ildjarn, manba
@ user4815162342: Eh, qandaydir bir tarzda bu narsani o'tkazib yuborgan bo'lardim. Ya'ni, childVec dan qutulish javobning bir qismi bo'lishi kerak.
qo'shib qo'ydi muallif ildjarn, manba
@ user4815162342: Eh, qandaydir bir tarzda bu narsani o'tkazib yuborgan bo'lardim. Ya'ni, childVec dan qutulish javobning bir qismi bo'lishi kerak.
qo'shib qo'ydi muallif ildjarn, manba
Siz, albatta, Vec <& str >>> xohlaysizmi? o_O
qo'shib qo'ydi muallif ildjarn, manba
@ildjarn OP o'shandan beri " Vec " ni urishga harakat qilsa, Vec > (ikkita < kodi> Vec s, uch emas).
qo'shib qo'ydi muallif user4815162342, manba
@ildjarn Yo'q, buning uchun uzr so'rayman. OP, albatta, Vec > ni xohlaydi, lekin ularning kodi Vec >> tashkil qiladi va keraksiz bir element o'rtadagi vektor.
qo'shib qo'ydi muallif user4815162342, manba
@ildjarn Yo'q, buning uchun uzr so'rayman. OP, albatta, Vec > ni xohlaydi, lekin ularning kodi Vec >> tashkil qiladi va keraksiz bir element o'rtadagi vektor.
qo'shib qo'ydi muallif user4815162342, manba
@ildjarn Yo'q, buning uchun uzr so'rayman. OP, albatta, Vec > ni xohlaydi, lekin ularning kodi Vec >> tashkil qiladi va keraksiz bir element o'rtadagi vektor.
qo'shib qo'ydi muallif user4815162342, manba
@ildjarn Yo'q, buning uchun uzr so'rayman. OP, albatta, Vec > ni xohlaydi, lekin ularning kodi Vec >> tashkil qiladi va keraksiz bir element o'rtadagi vektor.
qo'shib qo'ydi muallif user4815162342, manba

8 javoblar

Derleyici uchun values ​​ nima bo'lishini istasangiz, sizga bir oz maslahat berishingiz kerak.

narsa ning vektori bo'lishini xohlaysizmi?

let values: Vec<_> = trimmed.split(',').collect();

Working example in the playground

Qiziqtiradigan bo'lsangiz, kod haqida bir necha boshqa eslatma.

  • Argumentlar nomlari snake_case bo'lishi kerak. Vektorlarni main_vec va child_vec deb atash kerak.
  • child_vec main_vec -ga o'tsangiz, klonlash shart emas. main_vec child_vec kodini moslashtirsa va egalik kodi bu erda child_vec kodini qayta yuboradi va shuning uchun derleyici bu erda hech narsa buzilmaganligini kafolatlashi mumkin. </</ul>
3
qo'shib qo'ydi
Ushbu echim ham ishlaydi. g'aroyib
qo'shib qo'ydi muallif mjwrazor, manba

Derleyici uchun values ​​ nima bo'lishini istasangiz, sizga bir oz maslahat berishingiz kerak.

narsa ning vektori bo'lishini xohlaysizmi?

let values: Vec<_> = trimmed.split(',').collect();

Working example in the playground

Qiziqtiradigan bo'lsangiz, kod haqida bir necha boshqa eslatma.

  • Argumentlar nomlari snake_case bo'lishi kerak. Vektorlarni main_vec va child_vec deb atash kerak.
  • child_vec main_vec -ga o'tsangiz, klonlash shart emas. main_vec child_vec kodini moslashtirsa va egalik kodi bu erda child_vec kodini qayta yuboradi va shuning uchun derleyici bu erda hech narsa buzilmaganligini kafolatlashi mumkin. </</ul>
3
qo'shib qo'ydi
Ushbu echim ham ishlaydi. g'aroyib
qo'shib qo'ydi muallif mjwrazor, manba

Derleyici uchun values ​​ nima bo'lishini istasangiz, sizga bir oz maslahat berishingiz kerak.

narsa ning vektori bo'lishini xohlaysizmi?

let values: Vec<_> = trimmed.split(',').collect();

Working example in the playground

Qiziqtiradigan bo'lsangiz, kod haqida bir necha boshqa eslatma.

  • Argumentlar nomlari snake_case bo'lishi kerak. Vektorlarni main_vec va child_vec deb atash kerak.
  • child_vec main_vec -ga o'tsangiz, klonlash shart emas. main_vec child_vec kodini moslashtirsa va egalik kodi bu erda child_vec kodini qayta yuboradi va shuning uchun derleyici bu erda hech narsa buzilmaganligini kafolatlashi mumkin. </</ul>
3
qo'shib qo'ydi
Ushbu echim ham ishlaydi. g'aroyib
qo'shib qo'ydi muallif mjwrazor, manba

Derleyici uchun values ​​ nima bo'lishini istasangiz, sizga bir oz maslahat berishingiz kerak.

narsa ning vektori bo'lishini xohlaysizmi?

let values: Vec<_> = trimmed.split(',').collect();

Working example in the playground

Qiziqtiradigan bo'lsangiz, kod haqida bir necha boshqa eslatma.

  • Argumentlar nomlari snake_case bo'lishi kerak. Vektorlarni main_vec va child_vec deb atash kerak.
  • child_vec main_vec -ga o'tsangiz, klonlash shart emas. main_vec child_vec kodini moslashtirsa va egalik kodi bu erda child_vec kodini qayta yuboradi va shuning uchun derleyici bu erda hech narsa buzilmaganligini kafolatlashi mumkin. </</ul>
3
qo'shib qo'ydi
Ushbu echim ham ishlaydi. g'aroyib
qo'shib qo'ydi muallif mjwrazor, manba

Another solution, based on iterators:

fn main() {
    let raw_string = r"rust
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3";

    let main_vec = raw_string.lines()
                             .map(|s| s.trim().split(',').map(String::from).collect::>())
                             .collect::>>();

    print!("{:?}", main_vec);
}

@Simon Whitehead allaqachon aytganidek, collect() bilan ishlashingiz kerak bo'lgan yagona narsa, bu umumiy usul bo'lib turini belgilashdir. Biroq, ba'zi hollarda derleyici tomonidan o'zi ham chiqarilishi mumkin.

Yuqoridagi kod turdagi spetsifikatsiyalar haqida juda yoqimli: aslida Vec ning qiymatini aniqlanmasdan qoldirishi mumkin va quyidagi kabi derleyici tomonidan chiqarilishi mumkin:

let main_vec = raw_string.lines()
                         .map(|s| s.trim().split(',').map(String::from).collect::>())
                         .collect::>();

Qo'shimcha ma'lumot olish uchun to'plamini aniqlash() usuli .

2
qo'shib qo'ydi
Yordam va xabar uchun rahmat.
qo'shib qo'ydi muallif Victor Polevoy, manba
Vec <& str >> o'rniga Vec ni istasa split kodi .map (string :: dan) yoki birozgina.
qo'shib qo'ydi muallif ildjarn, manba
@mjwrazor: split .map (String :: dan) .map (| s | s.trim() .split (','). map (String :: dan) .collect :: <_ >> ()) . (Boshqa variantlar mavjud: .map (| s | s.trim (). Split (','). Map (ToString :: to_string) .collect :: <_ & zwnj; >> , lekin From dan foydalanishni o'ylayman.)
qo'shib qo'ydi muallif ildjarn, manba
@ildjarn Mening muammom kabi ko'rinadigan rost bo'lsa, String :: from() yoki .to_string() usullari.
qo'shib qo'ydi muallif mjwrazor, manba

Another solution, based on iterators:

fn main() {
    let raw_string = r"rust
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3";

    let main_vec = raw_string.lines()
                             .map(|s| s.trim().split(',').map(String::from).collect::>())
                             .collect::>>();

    print!("{:?}", main_vec);
}

@Simon Whitehead allaqachon aytganidek, collect() bilan ishlashingiz kerak bo'lgan yagona narsa, bu umumiy usul bo'lib turini belgilashdir. Biroq, ba'zi hollarda derleyici tomonidan o'zi ham chiqarilishi mumkin.

Yuqoridagi kod turdagi spetsifikatsiyalar haqida juda yoqimli: aslida Vec ning qiymatini aniqlanmasdan qoldirishi mumkin va quyidagi kabi derleyici tomonidan chiqarilishi mumkin:

let main_vec = raw_string.lines()
                         .map(|s| s.trim().split(',').map(String::from).collect::>())
                         .collect::>();

Qo'shimcha ma'lumot olish uchun to'plamini aniqlash() usuli .

2
qo'shib qo'ydi
Yordam va xabar uchun rahmat.
qo'shib qo'ydi muallif Victor Polevoy, manba
Vec <& str >> o'rniga Vec ni istasa split kodi .map (string :: dan) yoki birozgina.
qo'shib qo'ydi muallif ildjarn, manba
@mjwrazor: split .map (String :: dan) .map (| s | s.trim() .split (','). map (String :: dan) .collect :: <_ >> ()) . (Boshqa variantlar mavjud: .map (| s | s.trim (). Split (','). Map (ToString :: to_string) .collect :: <_ & zwnj; >> , lekin From dan foydalanishni o'ylayman.)
qo'shib qo'ydi muallif ildjarn, manba
@ildjarn Mening muammom kabi ko'rinadigan rost bo'lsa, String :: from() yoki .to_string() usullari.
qo'shib qo'ydi muallif mjwrazor, manba

Another solution, based on iterators:

fn main() {
    let raw_string = r"rust
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3";

    let main_vec = raw_string.lines()
                             .map(|s| s.trim().split(',').map(String::from).collect::>())
                             .collect::>>();

    print!("{:?}", main_vec);
}

@Simon Whitehead allaqachon aytganidek, collect() bilan ishlashingiz kerak bo'lgan yagona narsa, bu umumiy usul bo'lib turini belgilashdir. Biroq, ba'zi hollarda derleyici tomonidan o'zi ham chiqarilishi mumkin.

Yuqoridagi kod turdagi spetsifikatsiyalar haqida juda yoqimli: aslida Vec ning qiymatini aniqlanmasdan qoldirishi mumkin va quyidagi kabi derleyici tomonidan chiqarilishi mumkin:

let main_vec = raw_string.lines()
                         .map(|s| s.trim().split(',').map(String::from).collect::>())
                         .collect::>();

Qo'shimcha ma'lumot olish uchun to'plamini aniqlash() usuli .

2
qo'shib qo'ydi
Yordam va xabar uchun rahmat.
qo'shib qo'ydi muallif Victor Polevoy, manba
Vec <& str >> o'rniga Vec ni istasa split kodi .map (string :: dan) yoki birozgina.
qo'shib qo'ydi muallif ildjarn, manba
@mjwrazor: split .map (String :: dan) .map (| s | s.trim() .split (','). map (String :: dan) .collect :: <_ >> ()) . (Boshqa variantlar mavjud: .map (| s | s.trim (). Split (','). Map (ToString :: to_string) .collect :: <_ & zwnj; >> , lekin From dan foydalanishni o'ylayman.)
qo'shib qo'ydi muallif ildjarn, manba
@ildjarn Mening muammom kabi ko'rinadigan rost bo'lsa, String :: from() yoki .to_string() usullari.
qo'shib qo'ydi muallif mjwrazor, manba

Another solution, based on iterators:

fn main() {
    let raw_string = r"rust
header1,header2,header3
r1v1,r1v2,r1v3
r2v1,r2v2,r2v3";

    let main_vec = raw_string.lines()
                             .map(|s| s.trim().split(',').map(String::from).collect::>())
                             .collect::>>();

    print!("{:?}", main_vec);
}

@Simon Whitehead allaqachon aytganidek, collect() bilan ishlashingiz kerak bo'lgan yagona narsa, bu umumiy usul bo'lib turini belgilashdir. Biroq, ba'zi hollarda derleyici tomonidan o'zi ham chiqarilishi mumkin.

Yuqoridagi kod turdagi spetsifikatsiyalar haqida juda yoqimli: aslida Vec ning qiymatini aniqlanmasdan qoldirishi mumkin va quyidagi kabi derleyici tomonidan chiqarilishi mumkin:

let main_vec = raw_string.lines()
                         .map(|s| s.trim().split(',').map(String::from).collect::>())
                         .collect::>();

Qo'shimcha ma'lumot olish uchun to'plamini aniqlash() usuli .

2
qo'shib qo'ydi
Yordam va xabar uchun rahmat.
qo'shib qo'ydi muallif Victor Polevoy, manba
Vec <& str >> o'rniga Vec ni istasa split kodi .map (string :: dan) yoki birozgina.
qo'shib qo'ydi muallif ildjarn, manba
@mjwrazor: split .map (String :: dan) .map (| s | s.trim() .split (','). map (String :: dan) .collect :: <_ >> ()) . (Boshqa variantlar mavjud: .map (| s | s.trim (). Split (','). Map (ToString :: to_string) .collect :: <_ & zwnj; >> , lekin From dan foydalanishni o'ylayman.)
qo'shib qo'ydi muallif ildjarn, manba
@ildjarn Mening muammom kabi ko'rinadigan rost bo'lsa, String :: from() yoki .to_string() usullari.
qo'shib qo'ydi muallif mjwrazor, manba