Решение на Code Identifier от Мария Божкова

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

Към профила на Мария Божкова

Резултати

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

Код

#[derive(Debug)]
pub struct CodeIdentifier {
identifier: String,
}
impl CodeIdentifier {
fn validate(identifier: &str) -> bool {
let chars: Vec<char> = identifier.chars().collect();
if chars.is_empty() || !chars[0].is_alphabetic() {
return false;
}
for char in chars {
if !(char.is_numeric() || char.is_alphabetic() || char == '_') {
return false;
}
}
true
}
fn normalize(identifier: &str) -> String {
identifier.trim().to_lowercase()
}
pub fn new(identifier: &str) -> Option<Self> {
let stripped: String = CodeIdentifier::normalize(&identifier);
if !CodeIdentifier::validate(&stripped) {
return None;
}
Some(CodeIdentifier {
identifier: stripped,
})
}
pub fn camelcase(&self) -> String {
let mut result: String = String::from("");

Вместо да инициализираш низ от "", можеш да си направиш празен такъв със String::new(). Няма голямо практическо значение, но е малко по-просто. Няма и нужда да слагаш експлицитен тип String тук.

let mut start_new_word = false;
for char in self.identifier.chars() {
if start_new_word {
let upper = char.to_uppercase().to_string();
result.push_str(&upper);
start_new_word = false;
}
else if char == '_' {
start_new_word = true;
}
else {
result.push(char);
}
}
String::from(result)
}
pub fn titlecase(&self) -> String {
let mut camel_case: String = self.camelcase();
let result = camel_case.split_off(1);
let mut first = camel_case.to_uppercase();
first.push_str(&result);
first
}
pub fn kebabcase(&self) -> String {
let mut result: String = String::from("");
for char in self.identifier.chars() {
if char == '_' {
result.push_str("-");
}
else {
result.push(char);
}
}
result
}
pub fn underscore(&self) -> String {
self.identifier.to_string()
}
pub fn screaming_snakecase(&self) -> String {
self.identifier.to_uppercase().to_string()
}
}

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

Compiling solution v0.1.0 (/tmp/d20190123-22631-bvp4sd/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 4.67s
     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 ... ok
test solution_test::test_kebabcase_basic ... ok
test solution_test::test_multibyte_uppercase ... ok
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 'assertion failed: self.is_char_boundary(at)', liballoc/string.rs:1428:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.


failures:
    solution_test::test_cyrillic1

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

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

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

Мария качи първо решение на 24.10.2018 23:59 (преди над 4 години)

Мария качи решение на 25.10.2018 00:32 (преди над 4 години)

#[derive(Debug)]
pub struct CodeIdentifier {
identifier: String,
}
impl CodeIdentifier {
fn validate(identifier: &str) -> bool {
let chars: Vec<char> = identifier.chars().collect();
- if !chars[0].is_alphabetic() {
+ if chars.is_empty() || !chars[0].is_alphabetic() {
return false;
}
for char in chars {
if !(char.is_numeric() || char.is_alphabetic() || char == '_') {
return false;
}
}
true
}
fn normalize(identifier: &str) -> String {
identifier.trim().to_lowercase()
}
pub fn new(identifier: &str) -> Option<Self> {
let stripped: String = CodeIdentifier::normalize(&identifier);
if !CodeIdentifier::validate(&stripped) {
return None;
}
Some(CodeIdentifier {
identifier: stripped,
})
}
pub fn camelcase(&self) -> String {
let mut result: String = String::from("");

Вместо да инициализираш низ от "", можеш да си направиш празен такъв със String::new(). Няма голямо практическо значение, но е малко по-просто. Няма и нужда да слагаш експлицитен тип String тук.

- let mut start_word = false;
+ let mut start_new_word = false;
for char in self.identifier.chars() {
- if start_word {
+ if start_new_word {
let upper = char.to_uppercase().to_string();
result.push_str(&upper);
- start_word = false;
+ start_new_word = false;
}
else if char == '_' {
- start_word = true;
+ start_new_word = true;
}
else {
result.push(char);
}
}
String::from(result)
}
pub fn titlecase(&self) -> String {
let mut camel_case: String = self.camelcase();
let result = camel_case.split_off(1);
let mut first = camel_case.to_uppercase();
first.push_str(&result);
first
}
pub fn kebabcase(&self) -> String {
let mut result: String = String::from("");
for char in self.identifier.chars() {
if char == '_' {
result.push_str("-");
}
else {
result.push(char);
}
}
result
}
pub fn underscore(&self) -> String {
self.identifier.to_string()
}
pub fn screaming_snakecase(&self) -> String {
self.identifier.to_uppercase().to_string()
}
}

Разумно решение. Разделянето на низа на вектор от char-ове улеснява някои неща, макар че да работиш с Chars би улеснило други. Можеше да продължиш с вектор, което щеше да избегне грешката в теста, може би. Метода split_off работи, но премахва първия байт, не първия char.