Решение на Network Packets от Петър Петров
Обратно към всички решения
Към профила на Петър Петров
Резултати
- 13 точки от тестове
- 0 бонус точки
- 13 точки общо
- 10 успешни тест(а)
- 5 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-1v53rij/solution)
warning: unused import: `std::str`
--> src/lib.rs:2:5
|
2 | use std::str;
| ^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
warning: unused variable: `remainder`
--> src/lib.rs:130:26
|
130 | let (packet, remainder) = Packet::from_source(&self[count..count+packet_size_to_usize+1].as_bytes(), packet_size);
| ^^^^^^^^^ help: consider prefixing with an underscore: `_remainder`
|
= note: `#[warn(unused_variables)]` on by default
warning: unused variable: `remainder`
--> src/lib.rs:137:26
|
137 | let (packet, remainder) = Packet::from_source(&self[count..count+len].as_bytes(), len as u8);
| ^^^^^^^^^ help: consider prefixing with an underscore: `_remainder`
warning: unused variable: `len`
--> src/lib.rs:146:17
|
146 | let mut len =self.len();
| ^^^ help: consider prefixing with an underscore: `_len`
warning: unused variable: `count`
--> src/lib.rs:147:17
|
147 | let mut count=0;
| ^^^^^ help: consider prefixing with an underscore: `_count`
warning: unused variable: `packet_size_to_usize`
--> src/lib.rs:148:13
|
148 | let packet_size_to_usize = packet_size as usize;
| ^^^^^^^^^^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_size_to_usize`
warning: unused variable: `arr`
--> src/lib.rs:170:29
|
170 | let (packet,arr)=Packet::deserialize(&packet_data[begin..end]).unwrap();
| ^^^ help: consider prefixing with an underscore: `_arr`
warning: unused variable: `message`
--> src/lib.rs:178:17
|
178 | let message = match message {
| ^^^^^^^ help: consider prefixing with an underscore: `_message`
warning: unused variable: `e`
--> src/lib.rs:180:21
|
180 | Err(e) => return Err(PacketError::CorruptedMessage),
| ^ help: consider prefixing with an underscore: `_e`
warning: variable does not need to be mutable
--> src/lib.rs:87:13
|
87 | let mut sum:u32=checksum(&bytes[2..sizeOfPacket+2]);
| ----^^^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
warning: variable does not need to be mutable
--> src/lib.rs:146:13
|
146 | let mut len =self.len();
| ----^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:147:13
|
147 | let mut count=0;
| ----^^^^^
| |
| help: remove this `mut`
warning: variable `sizeToUsize` should have a snake case name
--> src/lib.rs:38:13
|
38 | let sizeToUsize: usize=size as usize;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `size_to_usize`
|
= note: `#[warn(non_snake_case)]` on by default
warning: variable `lengthOfArray` should have a snake case name
--> src/lib.rs:39:13
|
39 | let lengthOfArray: usize=source.len() as usize;
| ^^^^^^^^^^^^^ help: convert the identifier to snake case: `length_of_array`
warning: variable `sizeOfPacket` should have a snake case name
--> src/lib.rs:86:13
|
86 | let sizeOfPacket=bytes[1] as usize;
| ^^^^^^^^^^^^ help: convert the identifier to snake case: `size_of_packet`
warning: unused import: `std::str`
--> src/lib.rs:2:5
|
2 | use std::str;
| ^^^^^^^^
|
= note: `#[warn(unused_imports)]` on by default
warning: unused variable: `remainder`
--> src/lib.rs:130:26
|
130 | let (packet, remainder) = Packet::from_source(&self[count..count+packet_size_to_usize+1].as_bytes(), packet_size);
| ^^^^^^^^^ help: consider prefixing with an underscore: `_remainder`
|
= note: `#[warn(unused_variables)]` on by default
warning: unused variable: `remainder`
--> src/lib.rs:137:26
|
137 | let (packet, remainder) = Packet::from_source(&self[count..count+len].as_bytes(), len as u8);
| ^^^^^^^^^ help: consider prefixing with an underscore: `_remainder`
warning: unused variable: `len`
--> src/lib.rs:146:17
|
146 | let mut len =self.len();
| ^^^ help: consider prefixing with an underscore: `_len`
warning: unused variable: `count`
--> src/lib.rs:147:17
|
147 | let mut count=0;
| ^^^^^ help: consider prefixing with an underscore: `_count`
warning: unused variable: `packet_size_to_usize`
--> src/lib.rs:148:13
|
148 | let packet_size_to_usize = packet_size as usize;
| ^^^^^^^^^^^^^^^^^^^^ help: consider prefixing with an underscore: `_packet_size_to_usize`
warning: unused variable: `arr`
--> src/lib.rs:170:29
|
170 | let (packet,arr)=Packet::deserialize(&packet_data[begin..end]).unwrap();
| ^^^ help: consider prefixing with an underscore: `_arr`
warning: unused variable: `message`
--> src/lib.rs:178:17
|
178 | let message = match message {
| ^^^^^^^ help: consider prefixing with an underscore: `_message`
warning: unused variable: `e`
--> src/lib.rs:180:21
|
180 | Err(e) => return Err(PacketError::CorruptedMessage),
| ^ help: consider prefixing with an underscore: `_e`
warning: variable does not need to be mutable
--> src/lib.rs:87:13
|
87 | let mut sum:u32=checksum(&bytes[2..sizeOfPacket+2]);
| ----^^^
| |
| help: remove this `mut`
|
= note: `#[warn(unused_mut)]` on by default
warning: variable does not need to be mutable
--> src/lib.rs:146:13
|
146 | let mut len =self.len();
| ----^^^
| |
| help: remove this `mut`
warning: variable does not need to be mutable
--> src/lib.rs:147:13
|
147 | let mut count=0;
| ----^^^^^
| |
| help: remove this `mut`
warning: variable `sizeToUsize` should have a snake case name
--> src/lib.rs:38:13
|
38 | let sizeToUsize: usize=size as usize;
| ^^^^^^^^^^^ help: convert the identifier to snake case: `size_to_usize`
|
= note: `#[warn(non_snake_case)]` on by default
warning: variable `lengthOfArray` should have a snake case name
--> src/lib.rs:39:13
|
39 | let lengthOfArray: usize=source.len() as usize;
| ^^^^^^^^^^^^^ help: convert the identifier to snake case: `length_of_array`
warning: variable `sizeOfPacket` should have a snake case name
--> src/lib.rs:86:13
|
86 | let sizeOfPacket=bytes[1] as usize;
| ^^^^^^^^^^^^ help: convert the identifier to snake case: `size_of_packet`
Finished test [unoptimized + debuginfo] target(s) in 3.69s
Running target/debug/deps/solution-a73e64ec87929bd0
running 0 tests
test result: ok. 0 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 ... thread '<unnamed>' panicked at 'assertion failed: `(left == right)`
left: `"bazbar foo "`,
right: `"foo bar baz"`', tests/solution_test.rs:204:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
FAILED
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 ... thread '<unnamed>' panicked at 'assertion failed: `(left == right)`
left: `"foo bar baz"`,
right: `"zfoo bar ba"`', tests/solution_test.rs:215:9
FAILED
test solution_test::test_full_roundtrip_for_zero_size_string ... thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidPacket', src/libcore/result.rs:1165:5
FAILED
test solution_test::test_invalid_packet_combination ... thread '<unnamed>' panicked at 'byte index 3 is not a char boundary; it is inside 'ю' (bytes 2..4) of `сюрприз`', src/libcore/str/mod.rs:2068:5
FAILED
test solution_test::test_iterating_packets ... thread '<unnamed>' panicked at 'assertion failed: `(left == right)`
left: `[98, 97, 122]`,
right: `[102, 111, 111, 32]`', tests/solution_test.rs:178:9
FAILED
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
failures:
---- solution_test::test_consuming_packets stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `"bazbar foo "`,
right: `"foo bar baz"`', tests/solution_test.rs:197:5
---- solution_test::test_full_roundtrip stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `"foo bar baz"`,
right: `"zfoo bar ba"`', tests/solution_test.rs:210:5
---- solution_test::test_full_roundtrip_for_zero_size_string stdout ----
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: InvalidPacket', tests/solution_test.rs:221:5
---- solution_test::test_invalid_packet_combination stdout ----
thread 'main' panicked at 'byte index 3 is not a char boundary; it is inside 'ю' (bytes 2..4) of `сюрприз`', tests/solution_test.rs:232:5
---- solution_test::test_iterating_packets stdout ----
thread 'main' panicked at 'assertion failed: `(left == right)`
left: `[98, 97, 122]`,
right: `[102, 111, 111, 32]`', tests/solution_test.rs:172:5
failures:
solution_test::test_consuming_packets
solution_test::test_full_roundtrip
solution_test::test_full_roundtrip_for_zero_size_string
solution_test::test_invalid_packet_combination
solution_test::test_iterating_packets
test result: FAILED. 10 passed; 5 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--test solution_test'
История (1 версия и 8 коментара)
Петър качи първо решение на 02.12.2019 21:39 (преди почти 6 години)
Това не са много удачни имена на променливи. Еднобуквени променливи в рамките на един кратък closure може да са удобни, примерно
some_iterator.sum(|n| *n as u32)
, но когато тези полета са част от състоянието на структура и се преизползват на много места, по-добре е да бъдат малко по-описателни. Ако някой чете кода и срещне някъде из методитеself.s
, ще има нужда да се консултира до конструктора, докатоself.source
може би ще е по-лесно за разбиране и запомняне.Можеше да използваш просто
size
тук, предвид че така или иначе не използваш оригиналната променливаsize
. Нямаше нужда от друго име.Доколкото виждам по-горе, ти вече съхраняваш в
self.s
slice с нужния размер, примерноs: &source[..sizeToUsize]
. Не мисля, че има смисъл тук да подаваш размера отново -- можеш просто да върнеш&self.s
.Нямаш нужда да слагаш експлицитни типове тук за b1-4.
let b1 = (...) as u8
вече си има ясен за компилатора тип.Иначе, метода
to_be_bytes
наu32
щеше да ти улесни този и по-долния код.Метода
pop
вече връщаNone
ако няма какво да pop-не, така че горната проверка за дължина е напълно ненужна.От друга страна, това е и грешна логика, понеже пълниш вектора с
push
-ване и го празниш сpop
-ване, което обръща реда на пакетите.Целия този
loop
можеше да се замести със:Или, с някои подобрения: