Решение на Network Packets от Антонио Миндов
Обратно към всички решения
Към профила на Антонио Миндов
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 15 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-1113f5w/solution)
Finished test [unoptimized + debuginfo] target(s) in 4.56s
Running target/debug/deps/solution-a73e64ec87929bd0
running 8 tests
test tests::test_basic_iteration ... ok
test tests::test_basic_packet_deserialization_to_data ... ok
test tests::test_basic_packet_iteration ... ok
test tests::test_basic_packets ... ok
test tests::test_packet_construction_with_no_size ... ok
test tests::test_packet_deserialization ... ok
test tests::test_packet_serialization ... ok
test tests::test_packets_construction ... ok
test result: ok. 8 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 ... ok
test solution_test::test_serialize_packet ... ok
test solution_test::test_zero_size ... ok
test result: ok. 15 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Doc-tests solution
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
История (1 версия и 4 коментара)
Антонио качи първо решение на 02.12.2019 13:25 (преди почти 6 години)
Хм, това е интересна структура. Едно нещо, което можеше да я опрости е просто да променяш
self.data
когато викнешconsume
да бъде нов slice, който е отместен с консумираната стойност. Може да видиш методитеsplit_at
примерно, които директно ще ти дадат парче от slice-а и остатъка, на който можеш да кажешself.data = remainder
. Тогава няма да има нужда да поддържаш ръчноself.consumed
,bytes_left
ще е простоlen()
, arest_bytes
ще е простоself.data
:).Можеше и да преизползваш
consume
вsingle
, примерноconsume(1).get(0).unwrap()
or something. Тук аз бих накаралsingle
да връщаOption<u32>
и в кода по-долу можеш да кажеш примерноlet payload_size = consumer.single().ok_or(PacketError::InvalidPacket)?
. Или можеше.single()
директно да връщаResult
сPacketError
ако приемеш, че е вътрешна структура на този модул използвана само за него.Да кажеш "този метод очаква да си проверил еди-какво си преди да го извикаш" може да е ок понякога, но в Rust не е трудно да работиш с опционалност и грешки и това ти дава структура с методи, които спокойно могат да се използват без това допълнително знание. Колкото повече неща трябва да помниш, за да извикаш един метод правилно, толкова по-лесно е да допуснеш грешка.
Ако очакваш в тест нещо да ти върне Ok, напълно смислено е да му викнеш
unwrap
. Това ще ти даде по-ясна грешка отassert!(false)
, защото ще ти каже каква е стойността, която unwrap-ва.Е, така и така го десериализираш -- можеше да сложиш един assert какъв е payload-а :)