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("");
}