Решение на Text Info от Мартин Георгиев
Към профила на Мартин Георгиев
Резултати
- 15 точки от тестове
- 0 бонус точки
- 15 точки общо
- 15 успешни тест(а)
- 0 неуспешни тест(а)
Код
Лог от изпълнението
Compiling solution v0.1.0 (file:///tmp/d20171026-5817-3wrvq4/solution)
Finished dev [unoptimized + debuginfo] target(s) in 3.7 secs
Running target/debug/deps/solution-f5dd4e94aa395cae
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
Running target/debug/deps/solution_test-c3b431457e2a7a27
running 15 tests
test solution_test::test_alpha_count ... ok
test solution_test::test_alpha_count_2 ... ok
test solution_test::test_char_count ... ok
test solution_test::test_cyrillic_letter_count ... ok
test solution_test::test_emotions ... ok
test solution_test::test_emotions_repeated_punctuation ... ok
test solution_test::test_empty_string ... ok
test solution_test::test_latin_letter_count ... ok
test solution_test::test_sentence_count ... ok
test solution_test::test_sentence_count_2 ... ok
test solution_test::test_triple_dots_count ... ok
test solution_test::test_unicode_char_count ... ok
test solution_test::test_word_count ... ok
test solution_test::test_word_count_2 ... ok
test solution_test::test_word_count_3 ... 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
История (2 версии и 3 коментара)
Мартин качи решение на 24.10.2017 20:18 (преди около 8 години)
Би могъл да пробваш да инициализираш структурата с по-малко код, използвайки #[derive(Default)]: https://doc.rust-lang.org/std/default/trait.Default.html
Индирекцията между new, init, и generate_info ми е малко странна, и не съм сигурен доколко има практическа полза. Ако извикаш извън този код TextInfo::init(), ще получиш някакъв TextInfo обект, който ще е на практика безполезен -- всичките му стойности ще са 0, и няма да има методи да се мутира. Property-тата не са маркирани като pub, което значи, че не можеш и да мутираш този TextInfo.
По-малко индирекция (което би довело до по-лесен за четене код) би било new функцията да си алокира TextInfo, и да му генерира стойностите за дадения низ. Разбира се, процеса на генериране може да е в отделна функция generate, но тя би могла да бъде метод на структурата, а не статична функция.
Тоест, new би изглеждало така:
pub fn new(s: &str) -> Self {
let mut ti = TextInfo { ... };
ti.generate(s);
ti
}
Или, ако смяташ, че искаш да преизползваш една TextInfo структура за няколко низа, можеш да направиш нещо такова:
let mut ti = TextInfo::init();
ti.generate_info("foo");
println!("{}", ti.char_count()); // => 3
ti.generate_info("foo bar");
println!("{}", ti.char_count()); // => 7
Разбира се, ако имаше контрол над интерфейса, то вместо init() е по-добре да ползваш името new(), за да паснеш на конвенциите на Rust.
Аз не бих написал интерфейса по този начин, намирам го за сравнително тежък (отделна инициализация, която трябва да е на mutable, и извикване). Но нали, вариант е. По-нататък ще видим как може да TextInfo да си държи &str вместо String, и това ще си е доста ефективен вариант за имплементиране на нещо подобно.

Би могъл да пробваш да инициализираш структурата с по-малко код, използвайки
#[derive(Default)]: https://doc.rust-lang.org/std/default/trait.Default.htmlИндирекцията между
new,init, иgenerate_infoми е малко странна, и не съм сигурен доколко има практическа полза. Ако извикаш извън този кодTextInfo::init(), ще получиш някакъвTextInfoобект, който ще е на практика безполезен -- всичките му стойности ще са 0, и няма да има методи да се мутира. Property-тата не са маркирани катоpub, което значи, че не можеш и да мутираш тозиTextInfo.По-малко индирекция (което би довело до по-лесен за четене код) би било
newфункцията да си алокираTextInfo, и да му генерира стойностите за дадения низ. Разбира се, процеса на генериране може да е в отделна функцияgenerate, но тя би могла да бъде метод на структурата, а не статична функция.Тоест,
newби изглеждало така:Или, ако смяташ, че искаш да преизползваш една
TextInfoструктура за няколко низа, можеш да направиш нещо такова:Разбира се, ако имаше контрол над интерфейса, то вместо
init()е по-добре да ползваш иметоnew(), за да паснеш на конвенциите на Rust.Аз не бих написал интерфейса по този начин, намирам го за сравнително тежък (отделна инициализация, която трябва да е на mutable, и извикване). Но нали, вариант е. По-нататък ще видим как може да
TextInfoда си държи&strвместоString, и това ще си е доста ефективен вариант за имплементиране на нещо подобно.