Решение на Code Identifier от Кирил Костов

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

Към профила на Кирил Костов

Резултати

  • 19 точки от тестове
  • 0 бонус точки
  • 19 точки общо
  • 14 успешни тест(а)
  • 1 неуспешни тест(а)

Код

#[derive(Debug)]
pub struct CodeIdentifier {
identifier: String,
}
impl CodeIdentifier {
fn remove_whitespaces(identifier: &str) -> String {
let start = identifier
.chars()
.take_while(|x| x.is_whitespace())
.count();
let end = identifier
.chars()
.rev()
.take_while(|x| x.is_whitespace())
.count();
identifier[start..identifier.len() - end].to_string()
}

Разумна имплементация на чистенето на whitespace... mostly. Ето този код ще ти гръмне:

remove_whitespaces("\u{3000}foo")

Този unicode е специален интервал, който отнема повече от един байт. Ти броиш char-ове, но след това индексираш низа по байтове. Това ще работи за стандартните интервал, табулация, нов ред, но няма да работи за unicode whitespace (https://en.wikipedia.org/wiki/Whitespace_character#Unicode).

Това минава нашите тестове, така че fair enough. Но можеше да се справиш най-лесно просто с вградената функция trim: "foo".trim().

fn is_valid_identifier(identifier: &str) -> bool {
if !char::is_alphabetic(identifier.chars().next().unwrap()) {

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

return false;
}
for c in identifier.chars() {
if !char::is_alphabetic(c) && !char::is_numeric(c) && c != '_' {
return false;
}
}
true
}
fn change_underscores_to_capitalization(&self, start: bool) -> String {
let mut new_word = start;
let mut result = String::with_capacity(self.identifier.len());
for c in self.identifier.chars() {
if c == '_' {
new_word = true;
continue;
}
result.push(if new_word {
new_word = false;
c.to_uppercase().to_string().chars().next().unwrap()
} else {
c
});
}
result
}
pub fn new(identifier: &str) -> Option<Self> {
// Remove whitespaces.
let mut temp_identifier = Self::remove_whitespaces(identifier);
// Check if the given identifier is valid.
// If it is not return None.
if !Self::is_valid_identifier(&temp_identifier) {
return None;
}
// Normalize the input (only lowecase letters and underscores).
temp_identifier = temp_identifier.to_lowercase();
Some(Self {
identifier: String::from(temp_identifier),
})
}
pub fn camelcase(&self) -> String {
Self::change_underscores_to_capitalization(self, false)
}
pub fn titlecase(&self) -> String {
Self::change_underscores_to_capitalization(self, true)
}
pub fn kebabcase(&self) -> String {
let mut result = String::with_capacity(self.identifier.len());
for c in self.identifier.chars() {
result.push(if c != '_' { c } else { '-' });
}
result
}
pub fn underscore(&self) -> String {
self.identifier.clone()
}
pub fn screaming_snakecase(&self) -> String {
self.identifier.to_uppercase()
}
}

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

Compiling solution v0.1.0 (/tmp/d20190123-22631-yu47ww/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 4.51s
     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 ... ok
test solution_test::test_digits1 ... ok
test solution_test::test_digits2 ... ok
test solution_test::test_digits3 ... ok
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_multibyte_uppercase stdout ----
thread 'solution_test::test_multibyte_uppercase' panicked at 'assertion failed: `(left == right)`
  left: `"someSpecialCase"`,
 right: `"someSSpecialCase"`', tests/solution_test.rs:104:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.


failures:
    solution_test::test_multibyte_uppercase

test result: FAILED. 14 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out

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

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

Кирил качи първо решение на 24.10.2018 17:54 (преди почти 7 години)