Георги качи първо решение на 05.11.2019 13:27 (преди почти 6 години)
Разумно решение, но може да намериш функции в стандартната библиотека, с които да си улесниш живота.
Compiling solution v0.1.0 (/tmp/d20200111-2173579-17clggr/solution) Finished test [unoptimized + debuginfo] target(s) in 1.79s 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 ... ok test solution_test::test_octal_basic ... ok test solution_test::test_zeroes ... ok test result: ok. 6 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
Разумно решение, но може да намериш функции в стандартната библиотека, с които да си улесниш живота.
Тази функция е малко странна. Какво става ако подадем символа
0
? Ще получим числото0
, също както бихме получили това число в случай на невалиден вход. Няма разлика между грешен вход и валидния вход0
.Причината да работи е защото правиш валидация преди това. Ако случайно забравиш да валидираш някъде, този код ще е silently wrong, which is the worst kind of wrong :). Доста по-добре за целите на дебъгването е да викнеш
unwrap()
тук, за да спреш цялата програма, отколкото да връщаш грешен резултат, но само понякога.(Още по-добре е да използваш това, което функцията ти връща -- вместо да валидираш първо, и после да process-ваш, можеш директно да сложиш една if/match-клауза докато process-ваш и да върнеш
None
в случай на грешка.)Не е много добро име за функцията --
a_to_f
ми изглежда като функция, която конвертира от нещо до нещо, зарадиto
-то. По-удачно щеше да бъде да я наречешvalid_hex
или нещо такова и да вкараш логикатаchar::is_numeric(x)
тук.Макар че можеше и да използваш
char::is_digit(16)
директно. Или още по-добре,char::to_digit(16)
, което ако ти върне в какъвто и да е моментNone
, да върнеш и тиNone
от функциятаhex
.Иначе, ако ти изглежда по-смислено да имаш функция, която проверява само тази логика, по-добро име би било може би
between_a_and_f
и съответноbetween_0_and_7
.