如何在不使用typedef的情况下在切片上显式调用方法?

use*_*932 1 rust

我想调用为type实现的方法&[i32]。我可以通过标记为1的行中所示的类型别名来做到这一点,但是是否可以不必每次都引入类型别名呢?

trait Foo<T> {
    fn say_hi(x: T);
}

impl<'a> Foo<i32> for &'a [i32] {
    fn say_hi(x: i32) {}
}

type Array<'a> = &'a [i32];

fn main() {
    let arr = [1, 2, 3];
    Array::say_hi(1);//line 1
    &[i32]::say_hi(1);//line 2
}
Run Code Online (Sandbox Code Playgroud)

标记为2的行会产生错误消息:

trait Foo<T> {
    fn say_hi(x: T);
}

impl<'a> Foo<i32> for &'a [i32] {
    fn say_hi(x: i32) {}
}

type Array<'a> = &'a [i32];

fn main() {
    let arr = [1, 2, 3];
    Array::say_hi(1);//line 1
    &[i32]::say_hi(1);//line 2
}
Run Code Online (Sandbox Code Playgroud)

是否可以将标记为2的行修改为没有编译错误?

She*_*ter 5

使用完全合格的语法

<&[i32]>::say_hi(1);
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这不是一种方法。方法采用self某种形式。这只是一个关联的功能。如果它一个方法,则可以像其他任何方法一样调用它:

trait Foo<T> {
    fn say_hi(&self, x: T);
}

impl Foo<i32> for [i32] {
    fn say_hi(&self, x: i32) {}
}

fn main() {
    let arr = [1, 2, 3];
    <[i32]>::say_hi(&arr, 1);
    arr.say_hi(1);
}
Run Code Online (Sandbox Code Playgroud)