< 返回版块

hzqd 发表于 2021-10-18 22:17

请教诸位一个问题:

trait 的 泛型,是不是只能用 Trait::<type>::fn 这种形式声明?(无法直接在链式调用中声明)

即:无法直接以 exp.fn 的形式声明其对应 trait 的泛型。

例子:

trait A<R>: Sized {
    fn as_ok(self) -> Result<Self, R> {
        Ok(self)
    }
}

impl<T, R> A<R> for T {}

fn main() {
    // trait 的 泛型,是不是只能用 Trait::<type>::fn 这种形式声明?
    A::<&str>::as_ok(0);
    
    // 即:无法直接在链式调用中声明
    0.as_ok();
}

注意:我要的是声明类型,而不是推导类型。所有在绑定变量处或函数返回签名处指定类型的做法都属于类型推导,不在讨论范围内。

评论区

写评论
phper-chen 2021-10-19 10:42

rust的范型 完全限定语法 会在编译器按限定类型自行生成一份特定类型对应的函数 所以不指定没法确定调用主体的类型是什么 又是谁

苦瓜小仔 2021-10-19 00:59

因为你这里定义了 trait 泛型参数,无论如何都要在使用时指明这个泛型参数 R 为哪个具体类型,所以没法简化。

不过如果你能把 implementation 的范围写得具体一些(指明泛型参数 R 的具体类型),那么就可以直接调用:

trait A<R>: Sized {
    fn as_ok(self) -> Result<Self, R> {
        Ok(self)
    }
}

// impl<T, R> A<R> for T {}

impl A<&str> for u32 {}

fn main() {
    println!("{:?}", A::<&str>::as_ok(0));
    
    println!("{:?}", <u32 as A<&str>>::as_ok(0));

    println!("{:?}", 0.as_ok());
}
trait A<R>: Sized {
    fn as_ok(self) -> Result<Self, R> {
        Ok(self)
    }
}

impl<T> A<T> for T {}

fn main() {
    println!("{:?}", 0.as_ok());
}
苦瓜小仔 2021-10-19 00:44

你可以直接使用完全限定语法 (Fully Qualified Syntax):

<u32 as A<&str>>::as_ok(0);
作者 hzqd 2021-10-18 23:15

感谢QQ群友idyllan的回复,现已知一种非 stable 方式可以在链式调用中声明:

#![feature(type_ascription)]

trait A<R>: Sized {
    fn as_ok(self) -> Result<Self, R> {
        Ok(self)
    }
}

impl<T, R> A<R> for T {}

fn main() {
    // trait 的 泛型,是不是只能用 Trait::<type>::fn 这种形式声明?
    A::<&str>::as_ok(0).unwrap();
    
    // 用 #![feature(type_ascription)] 可以在链式调用处声明。
    (0.as_ok(): Result<_, &str>).unwrap();
}
1 共 4 条评论, 1 页