Решение на 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
, и това ще си е доста ефективен вариант за имплементиране на нещо подобно.