与结构同名的函数
Function with same name as struct
一般来说,我更喜欢用描述性的名字来编写初始化函数。但是,对于某些结构,有一个明显的默认初始化函数。这种函数的标准 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
实现不会存在这些歧义?
如果你想使用 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 }
,那么你需要使用更像 [=17] 的东西=] 在模式中,因此您的 Pair(first, last)
函数将与模式不一致。因此,人们普遍认为,这些类型的驼峰式函数应该只保留用于元组结构和元组变体,可以知道它真正反映了数据结构中包含的内容,没有进一步的处理或魔法。
一般来说,我更喜欢用描述性的名字来编写初始化函数。但是,对于某些结构,有一个明显的默认初始化函数。这种函数的标准 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
实现不会存在这些歧义?
如果你想使用 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 }
,那么你需要使用更像 [=17] 的东西=] 在模式中,因此您的 Pair(first, last)
函数将与模式不一致。因此,人们普遍认为,这些类型的驼峰式函数应该只保留用于元组结构和元组变体,可以知道它真正反映了数据结构中包含的内容,没有进一步的处理或魔法。