一般来说,我更喜欢用描述性的名字来编写初始化函数。但是,对于某些结构,有一个明显的默认初始化函数。这种函数的标准 Rust 名称是 new
,放置在结构的 impl
block 中。然而,今天我意识到我可以为函数赋予与结构相同的名称,并且认为这将是实现显而易见的初始化函数的好方法。例如:
#[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
实现不会出现这些歧义?
最佳答案
如果你想使用 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 }
然后你需要在模式中使用更像 Pair { first, last }
的东西,所以你的 Pair( first, last)
函数将与模式不一致。因此,人们普遍认为,这些类型的驼峰式函数应该只保留用于元组结构和元组变体,可以知道它真正反射(reflect)了数据结构中包含的内容,没有进一步的处理或魔法。
关于initialization - 与结构同名的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32237280/