diff --git a/common/src/lib.rs b/common/src/lib.rs index f6d704744..7519f9d94 100644 --- a/common/src/lib.rs +++ b/common/src/lib.rs @@ -4,3 +4,4 @@ pub mod cell; pub mod float_ops; pub mod hash; pub mod rc; +pub mod str; diff --git a/common/src/str.rs b/common/src/str.rs new file mode 100644 index 000000000..7dbc870a3 --- /dev/null +++ b/common/src/str.rs @@ -0,0 +1,30 @@ +pub fn get_chars(s: &str, range: std::ops::Range) -> &str { + let mut chars = s.chars(); + for _ in 0..range.start { + let _ = chars.next(); + } + let start = chars.as_str(); + for _ in range { + let _ = chars.next(); + } + let end = chars.as_str(); + &start[..start.len() - end.len()] +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_chars() { + let s = "0123456789"; + assert_eq!(get_chars(s, 3..7), "3456"); + assert_eq!(get_chars(s, 3..7), &s[3..7]); + + let s = "0유니코드 문자열9"; + assert_eq!(get_chars(s, 3..7), "코드 문"); + + let s = "0😀😃😄😁😆😅😂🤣9"; + assert_eq!(get_chars(s, 3..7), "😄😁😆😅"); + } +} diff --git a/vm/src/obj/objstr.rs b/vm/src/obj/objstr.rs index dd905416c..357da1bf6 100644 --- a/vm/src/obj/objstr.rs +++ b/vm/src/obj/objstr.rs @@ -1406,16 +1406,7 @@ impl<'s> PyCommonString<'s, char> for str { } fn get_chars<'a>(&'a self, range: std::ops::Range) -> &'a Self { - let mut chars = self.chars(); - for _ in 0..range.start { - let _ = chars.next(); - } - let start = chars.as_str(); - for _ in range { - let _ = chars.next(); - } - let end = chars.as_str(); - &start[..start.len() - end.len()] + rustpython_common::str::get_chars(self, range) } fn is_empty(&self) -> bool {