¿Cómo llamar a un método cuando un rasgo y una estructura usan el mismo nombre?

Este progtwig muere debido a la recursión infinita:

use std::any::Any; trait Foo { fn get(&self, index: usize) -> Option; } impl Foo for Vec { fn get(&self, index: usize) -> Option { Vec::get(self, index).map(|v| v as &Any) } } fn main() { let v: Vec = vec![1, 2, 4]; println!("Results: {:?}", v.get(0)) } 

El comstackdor mismo advierte sobre esto:

 warning: function cannot return without recurring --> src/main.rs:8:5 | 8 | fn get(&self, index: usize) -> Option { | _____^ starting here... 9 | | Vec::get(self, index).map(|v| v as &Any) 10 | | } | |_____^ ...ending here | = note: #[warn(unconditional_recursion)] on by default note: recursive call site --> src/main.rs:9:9 | 9 | Vec::get(self, index).map(|v| v as &Any) | ^^^^^^^^^^^^^^^^^^^^^ = help: a `loop` may express intention better if this is on purpose 

¿Por qué la syntax de llamada universal no funciona en este caso? El comstackdor no entiende que quiero llamar a Vec::get not Foo::get .

¿Cómo puedo solucionar esto si no quiero cambiar los nombres de las funciones?

Para especificar qué método llamar, ya sea inherente o proporcionado desde un rasgo, desea utilizar la syntax completa:

 Type::function(maybe_self, needed_arguments, more_arguments) Trait::function(maybe_self, needed_arguments, more_arguments) 

Su caso no funciona porque Vec no tiene un método llamado get ! get se proporciona desde la implementación de Deref a [T] .

La solución más sencilla es llamar a as_slice directamente:

 self.as_slice().get(index).map(|v| v as &Any) 

También podría usar la syntax completa que requiere los corchetes angulares en este caso ( < ...> ) para evitar la ambigüedad al declarar una matriz literal:

 < [i32]>::get(self, index).map(|v| v as &Any) 

syntax de llamada universal

Tenga en cuenta que aunque Rust usó originalmente el término syntax de llamada a función universal (UFCS), el uso de este término entraba en conflicto con el término de progtwigción existente, por lo que no se sugiere su uso. El término de reemplazo es syntax completamente calificada .