最近在看《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的默认写法?有没有大佬解释一下。
1
共 5 条评论, 1 页
评论区
写评论确实有效,是我一开始理解错了,感谢解答!
👇
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) } }
原来如此,多谢解答!
👇
全称量词: 在这个 0213-defaulted-type-params rfc 里引入了这个语法
在这个 0213-defaulted-type-params rfc 里引入了这个语法
有效的
这个语法定义在 reference 6.14. Generic parameters,具体应该是
TypeParam : IDENTIFIER( : TypeParamBounds? )? ( = Type )?
这个定义。但是有什么用真的不知道了,trait 和 struct 都用的这个叫做 GenericParams 的语法来定义泛型参数。可能这只是为了实现 trait 上的默认类型参数语法的副作用?