通常,我更喜欢用描述性名称编写初始化函数。但是,对于某些结构,有一个明显的默认初始化函数。此类函数的标准Rust名称为new
,放在结构的impl
块中。但是,今天我意识到我可以给一个与结构相同的函数,并认为这是实现明显的初始化函数的好方法。例如:
#[derive(Debug, Clone, Copy)]
struct Pair<T, U> {
first: T,
second: U,
}
#[allow(non_snake_case)]
fn Pair<T, U>(first: T, second: U) -> Pair<T, U> {
Pair::<T, U> {
first: first,
second: second,
}
}
fn main(){
let x = Pair(1, 2);
println!("{:?}", x);
}
在我看来,这比这更具吸引力:
let x = Pair::new(1, 2);
但是,我从来没有见过其他人这样做,我的问题就是这种方法是否存在任何问题。例如,是否存在可能导致new
实现不存在的歧义?
答案 0 :(得分:3)
如果您想使用Pair(T, U)
,那么您应该考虑使用元组结构:
#[derive(Debug, Clone, Copy)]
struct Pair<T, U>(T, U);
fn main(){
let x = Pair(1, 2);
println!("{:?}", x);
println!("{:?}, {:?}", (x.0, x.1));
}
或者,你知道,只是一个元组((T, U)
)。但我认为Pair
不是你的实际用例。
有一段时间,具有相同名称的函数是默认构造函数的约定;随着时间的推移,这个大会失宠了。它现在被认为是不好的形式,可能主要是为了保持一致性。如果你有一个元组结构(或变体)Pair(T, U)
,那么你可以在一个模式中使用Pair(first, last)
,但是如果你有Pair { first: T, last: U }
那么你需要使用更像{{1}的东西在一个模式中,所以你的Pair { first, last }
函数将与模式不一致。因此,通常认为这些类型的驼峰函数应该仅保留用于元组结构和元组变体,其中可以知道它真实地反映了数据结构中包含的内容而没有进一步的处理或魔术。