Решение на Code Identifier от Ива Милушева

Обратно към всички решения

Към профила на Ива Милушева

Резултати

  • 16 точки от тестове
  • 0 бонус точки
  • 16 точки общо
  • 12 успешни тест(а)
  • 3 неуспешни тест(а)

Код

/// Необходимо е CodeIdentifier да имплементира Debug, за да можем да го
/// използваме в тестови assertion-и.
///
#[derive(Debug)]
pub struct CodeIdentifier {
// Каквито полета ви трябват
identifier: String
}
impl CodeIdentifier {
/// Функцията ще върне Option<CodeIdentifier>, което ще бъде:
/// - None: ако входа не е валиден идентификатор. Вижте горе за това
/// какво значи "валиден идентификатор".
/// - Some(code_identifier): Ако входа е валиден.
///
pub fn new(identifier: &str) -> Option<Self> {
let all_chars=identifier.trim().chars();
let first_char=identifier.trim().chars().next().unwrap();

.chars().next().unwrap() ще гръмне за празен низ :). Не сме тествали за това, така че е приемливо да се справиш както решиш с този case, но едва ли runtime panic е добро решение. За бъдещи домашни (и не само), мисли за такива специални случаи

if first_char.is_alphabetic() {
for i in all_chars {
if i.is_alphabetic() || i.is_numeric() || i=='_' {
continue;
}
else{
return None;
}
}
return Some(CodeIdentifier{ identifier: identifier.to_string()});
}
return None;
}
/// Конвертира идентификатора до camelcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "someVar"
///
pub fn camelcase(&self) -> String {
let a = Self::titlecase(&self);
let mut first = a.chars().next().unwrap().to_string().to_lowercase();
let size = a.len();
let last = &a[1..size];
first.push_str(last);
first
}
/// Конвертира идентификатора до titlecased вариант (camelcased с първа заглавна буква).
/// - Примерен вход: "some_var"
/// - Примерен изход: "SomeVar"
///
pub fn titlecase(&self) -> String {
let a = &self.identifier.trim().to_lowercase();
let b: Vec<&str> = a.split_terminator('_').collect();
let c: Vec<String> = b.iter().map(|&x| Self::to_title(x.to_string())).collect();
c.join("")
}
/// Конвертира идентификатора до kebabcased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some-var"
///
pub fn kebabcase(&self) -> String {
let a = &self.identifier;
let a = a.trim().to_lowercase();
let b = &a;
str::replace(b, '_', "-").to_string()
}
/// Конвертира идентификатора до underscored вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "some_var"
///
/// - Примерен вход: "Some_Var"
/// - Примерен изход: "some_var"
///
pub fn underscore(&self) -> String {
let a = &self.identifier;
a.trim().to_lowercase()
}
/// Конвертира идентификатора до screaming-snakecased вариант.
/// - Примерен вход: "some_var"
/// - Примерен изход: "SOME_VAR"
///
pub fn screaming_snakecase(&self) -> String {
let a = &self.identifier;
a.trim().to_uppercase()
}
pub fn to_title(t: String) -> String {
let t = t.trim().to_lowercase();
let mut a = t.chars().next().unwrap().to_string().to_uppercase();
let size=t.len();
let b = &t[1..size];
a.push_str(b);
return a;
}
}

Лог от изпълнението

Compiling solution v0.1.0 (/tmp/d20190123-22631-1v41dsq/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 5.11s
     Running target/debug/deps/solution-2e785d603b538f71

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-29808948fb50ed3a

running 15 tests
test solution_test::test_both_static_and_dynamic_strings ... ok
test solution_test::test_camelcase_basic ... ok
test solution_test::test_cyrillic1 ... FAILED
test solution_test::test_digits1 ... ok
test solution_test::test_digits2 ... ok
test solution_test::test_digits3 ... FAILED
test solution_test::test_kebabcase_basic ... ok
test solution_test::test_multibyte_uppercase ... FAILED
test solution_test::test_normalize_case1 ... ok
test solution_test::test_normalize_case2 ... ok
test solution_test::test_screaming_snakecase_basic ... ok
test solution_test::test_titlecase_basic ... ok
test solution_test::test_underscore_basic ... ok
test solution_test::test_validity ... ok
test solution_test::test_whitespace ... ok

failures:

---- solution_test::test_cyrillic1 stdout ----
thread 'solution_test::test_cyrillic1' panicked at 'byte index 1 is not a char boundary; it is inside 'щ' (bytes 0..2) of `що`', libcore/str/mod.rs:2111:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.

---- solution_test::test_digits3 stdout ----
thread 'solution_test::test_digits3' panicked at 'byte index 1 is not a char boundary; it is inside '٣' (bytes 0..2) of `٣`', libcore/str/mod.rs:2111:5

---- solution_test::test_multibyte_uppercase stdout ----
thread 'solution_test::test_multibyte_uppercase' panicked at 'byte index 1 is not a char boundary; it is inside 'ß' (bytes 0..2) of `ßpecial`', libcore/str/mod.rs:2111:5


failures:
    solution_test::test_cyrillic1
    solution_test::test_digits3
    solution_test::test_multibyte_uppercase

test result: FAILED. 12 passed; 3 failed; 0 ignored; 0 measured; 0 filtered out

error: test failed, to rerun pass '--test solution_test'

История (1 версия и 2 коментара)

Ива качи първо решение на 24.10.2018 23:50 (преди почти 5 години)

Всичките ти грешки от тестовете идват от кирилица и друг unicode. Индексирането на низ е по байтове, а символите вътре може да са по два или повече байта. Когато напишеш нещо като index+1, това не е задължително да е следващия низ, а може да се падне по средата на буква, което е грешка.

Би могла да жонглираш дължини на символи ако използваш метода len_utf8: https://doc.rust-lang.org/std/primitive.char.html#method.len_utf8. Но ти препоръчвам просто да избягваш да правиш подобно индексиране. Доста по-лесно е да итерираш по char-ове. Разгледай останалите решения (примерно първото, което е моето) за идея как би се получило това.