如何从 bytes crate 中修剪 BytesMut?

huangapple go评论98阅读模式
英文:

How to trim a BytesMut from bytes crate?

问题

我想要能够将BytesMut 进行剪裁,即使我有一个BytesMut,我想要能够使它trim_bytes

  1. let some_bytes = BytesMut::from(" hello world ");
  2. let trim_bytes = some_bytes.some_trim_method();
  3. // trim_bytes = BytesMut::From("hello world");

some_trim_method() 是我一直在寻找的方法,但是在这个库中并没有这样的方法。

英文:

Suppose I have a BytesMut, I want to be able to make it trim_bytes.

  1. let some_bytes = BytesMut::from(" hello world ");
  2. let trim_bytes = some_bytes.some_trim_method();
  3. // trim_bytes = BytesMut::From("hello world");

some_trim_method() is what I've been looking for but there isn't such method in crate.

答案1

得分: 1

你还可以为 bytes 创建自己的 trim 函数的版本。

  1. const TAB: &u8 = &b'\t';
  2. const SPACE: &u8 = &b' ';
  3. fn is_whitespace(c: &u8) -> bool {
  4. c == TAB || c == SPACE
  5. }
  6. fn is_not_whitespace(c: &u8) -> bool {
  7. !is_whitespace(c)
  8. }
  9. fn trim_bytes(s: &[u8]) -> &[u8] {
  10. let l = s.len();
  11. let (mut i, mut j, mut k) = (0, l - 1, 0);
  12. loop {
  13. if (is_not_whitespace(&s[i]) && is_not_whitespace(&s[j])) || i > j || k >= l {
  14. break;
  15. }
  16. if is_whitespace(&s[i]) {
  17. i += 1;
  18. }
  19. if is_whitespace(&s[j]) {
  20. j -= 1;
  21. }
  22. k += 1
  23. }
  24. return &s[i..=j];
  25. }
  26. fn main() {
  27. let result = trim_bytes(&some_bytes);
  28. println!("{:?}", result);
  29. assert_eq!(b"hello world", result);
  30. }

或者在 byte 类型上实现 trim 方法。

  1. trait TrimBytes {
  2. fn trim(&self) -> &Self;
  3. }
  4. impl TrimBytes for [u8] {
  5. fn trim(&self) -> &[u8] {
  6. if let Some(first) = self.iter().position(is_not_whitespace) {
  7. if let Some(last) = self.iter().rposition(is_not_whitespace) {
  8. &self[first..last + 1]
  9. } else {
  10. unreachable!();
  11. }
  12. } else {
  13. &[]
  14. }
  15. }
  16. }
  17. fn main() {
  18. let result = some_bytes.trim();
  19. println!("{:?}", result);
  20. assert_eq!(b"hello world", result);
  21. }
英文:

You can also create your own version of trim function for bytes

  1. const TAB: &u8 = &b'\t';
  2. const SPACE: &u8 = &b' ';
  3. fn is_whitespace(c: &u8) -> bool {
  4. c == TAB || c == SPACE
  5. }
  6. fn is_not_whitespace(c: &u8) -> bool {
  7. !is_whitespace(c)
  8. }
  9. fn trim_bytes(s: &[u8]) -> &[u8] {
  10. let l = s.len();
  11. let (mut i, mut j, mut k) = (0, l - 1, 0);
  12. loop {
  13. if (is_not_whitespace(&s[i]) && is_not_whitespace(&s[j])) || i > j || k >= l {
  14. break;
  15. }
  16. if is_whitespace(&s[i]) {
  17. i += 1;
  18. }
  19. if is_whitespace(&s[j]) {
  20. j -= 1;
  21. }
  22. k += 1
  23. }
  24. return &s[i..=j];
  25. }
  26. fn main() {
  27. let result = trim_bytes(&some_bytes);
  28. println!("{:?}", result);
  29. assert_eq!(b"hello world", result);
  30. }

or implement trim method on byte type

  1. trait TrimBytes {
  2. fn trim(&self) -> &Self;
  3. }
  4. impl TrimBytes for [u8] {
  5. fn trim(&self) -> &[u8] {
  6. if let Some(first) = self.iter().position(is_not_whitespace) {
  7. if let Some(last) = self.iter().rposition(is_not_whitespace) {
  8. &self[first..last + 1]
  9. } else {
  10. unreachable!();
  11. }
  12. } else {
  13. &[]
  14. }
  15. }
  16. }
  17. fn main() {
  18. let result = some_bytes.trim();
  19. println!("{:?}", result);
  20. assert_eq!(b"hello world", result);
  21. }

huangapple
  • 本文由 发表于 2023年2月24日 00:37:36
  • 转载请务必保留本文链接:https://go.coder-hub.com/75547735.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定