Решение на Network Packets от Йоан Стоянов
Обратно към всички решения
Към профила на Йоан Стоянов
Резултати
- 19 точки от тестове
- 0 бонус точки
- 19 точки общо
- 14 успешни тест(а)
- 1 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-rb4ke6/solution)
warning: unnecessary trailing semicolon
--> src/lib.rs:102:54
|
102 | let payload = (&bytes[2..pay_size]).to_vec();;
| ^ help: remove this semicolon
|
= note: `#[warn(redundant_semicolon)]` on by default
warning: unnecessary trailing semicolon
--> src/lib.rs:102:54
|
102 | let payload = (&bytes[2..pay_size]).to_vec();;
| ^ help: remove this semicolon
|
= note: `#[warn(redundant_semicolon)]` on by default
Finished test [unoptimized + debuginfo] target(s) in 4.19s
Running target/debug/deps/solution-a73e64ec87929bd0
running 2 tests
test test_basic_iteration ... ok
test test_basic_packets ... ok
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-38971695424b36d5
running 15 tests
test solution_test::test_construct_packet_from_unicode ... ok
test solution_test::test_construct_packet_no_remainder ... ok
test solution_test::test_construct_packet_with_remainder ... ok
test solution_test::test_construct_packet_with_remainder_cyrillic ... ok
test solution_test::test_consuming_packets ... ok
test solution_test::test_deserialize_invalid_packet ... ok
test solution_test::test_deserialize_packet ... ok
test solution_test::test_deserialize_unicode_packet ... ok
test solution_test::test_full_roundtrip ... ok
test solution_test::test_full_roundtrip_for_zero_size_string ... ok
test solution_test::test_invalid_packet_combination ... ok
test solution_test::test_iterating_packets ... ok
test solution_test::test_iterating_packets_for_zero_size_string ... thread '<unnamed>' panicked at 'assertion failed: `(left == right)`
left: `1`,
right: `0`', tests/solution_test.rs:191:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
FAILED
test solution_test::test_serialize_packet ... ok
test solution_test::test_zero_size ... ok
failures:
---- solution_test::test_iterating_packets_for_zero_size_string stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `1`,
right: `0`', tests/solution_test.rs:186:5
failures:
solution_test::test_iterating_packets_for_zero_size_string
test result: FAILED. 14 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--test solution_test'
История (1 версия и 8 коментара)
Йоан качи първо решение на 03.12.2019 16:26 (преди почти 6 години)
Можеше да сложиш
#[derive(Clone)]
в списъка по-горе, нямаше нужда от експлицитна имплементация. Вземането на reference и викането наto_vec
е същото като да викнеш.clone()
anyway -- виж https://doc.rust-lang.org/std/vec/struct.Vec.html#method.to_vec, "Copies self into a new Vec."Вместо да алокираш временен вектор с
vec!
и после още един чрезcollect
, можеше да използваш slice на стека:Няма голямо практическо значение -- просто го казвам, за да знаеш, че е възможно да избегнеш алокирането на динамична памет, за разлика от доста модерни езици.
Метода
extend_from_slice
наVec
би опростил този код малко.Можеш да използваш оператор
?
за да съкратиш първия израз:Тук е единия ти бъг, другия е подобен. Ако низа е празен, ще се създаде пакет със съдържание празен низ, преди да се break-не. Може вместо тази проверка накрая, да сложиш проверка в началото:
И тук имаш същия проблем като по-горе -- пакета ще се опита да бъде десериализиран от празен низ и ще върне грешка. Вместо това, ако проверката е по-горе, веднага ще се провери, че
bytes.len()
е 0 и ще се върне празен низ, което е доста по-смислено. Празен низ се сериализира в празен byte vector, който се десериализира обратно до празен низ.И в двата случая можеш да заместиш
loop
+break
сwhile
цикъл, което обикновено е по-четимо. При единloop
трябва да търсиш внимателно заbreak
, докато вwhile
илиfor
цикъл, условията са ясни. Не че не можеш да имашbreak
и при тях, но ако можеш да го избегнеш и да енкапсулираш условията в главата на цикъла, обикновено е по-лесно да прецениш как работи въпросния цикъл.Типа
String
също имаfrom_utf8
функция, която връща директноString
, така че можеш да избегнеш експлицитния.to_string
:Съответно, предвид че в
Ok
случая не правиш никаква промяна, единствено ти трябва да промениш грешката, и можеш да използваш оператор?
:Или направо: