< 返回版块

fefit 发表于 2020-12-10 16:54

Tags:泛型,类型

请教大佬们一个问题,代码如下:

trait MyTrait{}
struct S<T: MyTrait>{
    optional: Option<T>,
    main: String
}

impl<T> From<&str> for S<T> where T: MyTrait{
    fn from(main: &str) -> Self{
        S{
            optional: None,
            main: main.to_string()
        }
    }
}

fn main(){
    // 下面的S参数需要写泛型参数,请问这个泛型参数该怎么写?
    // 或者说有没有办法声明某个泛型参数在某些impl里是非必须的,还是有其它更好的方式来处理这类问题呢?
    let s: S<?> = "".into(); 

}

评论区

写评论
whfuyn 2020-12-10 19:47

虽然你在这里给optional放了个None,看起来T是个啥对它都没有影响,但实际上不是这样的。

S<u8>S<u64>optional的大小是不一样的,从而相应的S<T>的大小也不一样,所以编译器才提示你必须写明类型。

--
👇
fefit: 感谢回复,大概能理解这个意思了。看来泛型的机制使得最后必须对应到具体类型,如果值有某种方式,可以标识不同的泛型实际类型、对实际的数据没有实质影响,进而可以在某些情况下可以忽略泛型参数就好了。看来不是这么简单好处理的,只能另想方式了~再次感谢!

--
👇
chirsz-ever: 必须要写,或者可通过其他方式推导,因为不同的 None 也是不一样的。

uno 2020-12-10 18:39

那你就写一个空实现呀

--
👇
fefit: 感谢回复,大概能理解这个意思了。看来泛型的机制使得最后必须对应到具体类型,如果值有某种方式,可以标识不同的泛型实际类型、对实际的数据没有实质影响,进而可以在某些情况下可以忽略泛型参数就好了。看来不是这么简单好处理的,只能另想方式了~再次感谢!

--
👇
chirsz-ever: 必须要写,或者可通过其他方式推导,因为不同的 None 也是不一样的。

作者 fefit 2020-12-10 18:32

感谢回复,大概能理解这个意思了。看来泛型的机制使得最后必须对应到具体类型,如果值有某种方式,可以标识不同的泛型实际类型、对实际的数据没有实质影响,进而可以在某些情况下可以忽略泛型参数就好了。看来不是这么简单好处理的,只能另想方式了~再次感谢!

--
👇
chirsz-ever: 必须要写,或者可通过其他方式推导,因为不同的 None 也是不一样的。

chirsz-ever 2020-12-10 17:49

必须要写,或者可通过其他方式推导,因为不同的 None 也是不一样的。

1 共 5 条评论, 1 页