rust

rust - El rasgo `FnMut<(char,)>` no se implementa para `String` cuando se intenta dividir una cadena



(2)

Necesito dividir una String (no &str ) por otra String :

use std::str::Split; fn main() { let x = "".to_string().split("".to_string()); }

¿Por qué recibo este error y cómo evitarlo si ya tengo que operar con cadenas?

error[E0277]: the trait bound `std::string::String: std::ops::FnMut<(char,)>` is not satisfied --> src/main.rs:4:32 | 4 | let x = "".to_string().split("".to_string()); | ^^^^^ the trait `std::ops::FnMut<(char,)>` is not implemented for `std::string::String` | = note: required because of the requirements on the impl of `std::str::pattern::Pattern<''_>` for `std::string::String`

Según el canal IRC # rust-beginners, este podría ser un ejemplo de que Deref falla en 1.20.0-todas las noches. ¿Cómo dividir una cuerda en Rust? no aborda el problema de dividir por String , no &str .


Hablé sobre esto con el canal IRC # rust-principiantes y escuché lo siguiente:

15:12:15 achird | d33tah: split accepts a Pattern, where Pattern can be &str or char, but you''re passing a String (no idea why deref is not working) 15:13:01 d33tah | achird: thanks! how can I convert string to str? 15:13:03 achird | i think a simple split(&delimiter2) should fix the problem 15:16:26 calops | why isn''t deref working though? 15:21:33 @mbrubeck | calops, d33tah: Deref coercions only work if one exact "expected" type is known. For a generic type like <P: Pattern>, coercion doesn''t kick in. 15:24:11 @mbrubeck | d33tah: The error should definitely be improved... It should complain that `String` doesn''t impl `Pattern`, instead of jumping straight to `FnMut(char)`

Básicamente, la solución es agregar & antes de la cadena delimitador, así:

fn main() { let s1 = "".to_string(); let s2 = "".to_string(); let x = s1.split(&s2); }


Todo está en la documentation . Puede proporcionar uno de:

  • A &str ,
  • Un char ,
  • Un cierre,

Esos tres tipos implementan el rasgo Pattern . Estás dando una String para split lugar de una &str .

Ejemplo:

fn main() { let x = "".to_string(); let split = x.split(""); }