< 返回版块

yomiko451 发表于 2024-06-25 15:30

Tags:泛型

最近在看《rust for rustaceans》,里面有这样一段代码

struct Grounded;
struct Launched;
// and so on
struct Rocket<Stage = Grounded> {
    stage: std::marker::PhantomData<Stage>,
}
impl Default for Rocket<Grounded> {}
impl Rocket<Grounded> {
pub fn launch(self) -> Rocket<Launched> { }
}
impl Rocket<Launched> {
pub fn accelerate(&mut self) { }
pub fn decelerate(&mut self) { }
}
impl<Stage> Rocket<Stage> {
pub fn color(&self) -> Color { }
pub fn weight(&self) -> Kilograms { }
}

我想问一下Rocket<Stage = Grounded>这个写法是什么意思啊?我知道泛型trait可以设置默认值,难道结构体里也可以?但是我实际跑代码试了一下,这么写好像没有起到默认值的作用,难不成这么写只是为了语义化标记一下吗,或者是使用PhantomData的默认写法?有没有大佬解释一下。

评论区

写评论
作者 yomiko451 2024-06-25 21:40

确实有效,是我一开始理解错了,感谢解答!

👇
alorylic: ```rust fn main() { let x = Context{x: 12}; x.test(); let y = Context::{x: false}; y.test(); // error }

struct Context<T = i32> { x: T }

impl Context { fn test(&self) { println!("{}", self.x) } }

有效的
作者 yomiko451 2024-06-25 21:39

原来如此,多谢解答!

👇
全称量词: 在这个 0213-defaulted-type-params rfc 里引入了这个语法

全称量词 2024-06-25 20:08

在这个 0213-defaulted-type-params rfc 里引入了这个语法

alorylic 2024-06-25 20:08
fn main() {
    let x = Context{x: 12};
    x.test();
    let y = Context::<bool>{x: false};
    y.test(); // error
}


struct Context<T = i32> {
    x: T
}

impl Context {
    fn test(&self) {
        println!("{}", self.x)
    }
}

有效的

全称量词 2024-06-25 17:11

这个语法定义在 reference 6.14. Generic parameters,具体应该是 TypeParam : IDENTIFIER( : TypeParamBounds? )? ( = Type )? 这个定义。

但是有什么用真的不知道了,trait 和 struct 都用的这个叫做 GenericParams 的语法来定义泛型参数。可能这只是为了实现 trait 上的默认类型参数语法的副作用?

1 共 5 条评论, 1 页