Решение на Дигитален корен от Сашо Михайлов
Обратно към всички решения
Към профила на Сашо Михайлов
Резултати
- 17 точки от тестове
- 0 бонус точки
- 17 точки общо
- 5 успешни тест(а)
- 1 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20200111-2173579-qh2cvp/solution)
Finished test [unoptimized + debuginfo] target(s) in 1.88s
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 6 tests
test solution_test::test_binary ... ok
test solution_test::test_decimal_basic ... ok
test solution_test::test_hex_basic ... ok
test solution_test::test_invalid ... FAILED
test solution_test::test_octal_basic ... ok
test solution_test::test_zeroes ... ok
failures:
---- solution_test::test_invalid stdout ----
Function decimal() called with input = f .
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ParseIntError { kind: InvalidDigit }', src/libcore/result.rs:1165:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
failures:
solution_test::test_invalid
test result: FAILED. 5 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--test solution_test'
История (1 версия и 6 коментара)
Сашо качи първо решение на 02.11.2019 23:02 (преди почти 6 години)
Този
unwrap
тук ти е докарал един failing тест. Причинатаu32::from_str_radix
да връщаOption
е защото може да не проработи. При какви обстоятелства няма да работи? Когато входа не е валидно число в тази бройна система. А както казахме, това е точно случай, в който да върнешNone
.Можеше да използваш
match
statement примерно така:Или можеше да използваш оператора
?
, за който говорихме в лекцията за error handling, който работи и заOption
, с който горния код изглежда така:Поправка --
u32::from_str_radix
връща резултат, така че горните снипети биха били:Би могъл да спестиш едно ниво на индентация, ако направиш това
return None
и вместоelse
просто си продължиш функцията. Това обикновено се нарича "guard clause" -- предпазваш остатъка от кода от невалиден вход като излизаш от функцията рано.Макроса
format!
вече ти връщаString
, така че метода.to_string()
тук не прави нищо. Интересното е, че тази променлива не си ѝ сложил тип така или иначе, така че изглежда и ти не си бил сигурен -- щеше да е добре да провериш. В Rust, както и в подобни статично типизирани езици, помага много да знаеш какъв точно тип е всяка една променлива, или поне какви trait bounds има, така че си заслужава да си задаваш тези въпроси.Имаш променливи, които дефинираш извън цикъла и мутираш, което не изглежда да е напълно нужно.
result_as_hex
примерно се използва само в цикъла, никога извън него, така че вместо да си поддържаш mutable променлива, можеш да имаш една read-only променлива декларирана в цикъла. Дори иresult
може да е immutable и да съществува само в рамките на цикъла, ако заместиш тозиbreak
сreturn Some(result)
.Добре е кода да изразява точно каквото прави и нищо повече. Ако една променлива е дефинирана като "mutable" извън цикъла, това комуникира, че тази променлива споделя някаква информация между завъртанията на цикъла и затова е такава. За
result_as_string
иresult_as_hex
това не изглежда да е така, но ти трябва известно четене да го осъзнаеш, което е ненужно. Дефинирането им вътре в цикъла комуникира по-ясно, че са временни.Освен това не е нужно да имаш
mut_input
. ТипаString
също имаlen
метод и също може да се печата. Няма причина да променяш и тази променлива, доколкото виждам. Basically, мисли за това кои части от кода наистина има нужда да са такива, и кои могат да се орежат като излишни -- кратко и ясно решение на проблем се чете по-лесно :).