与结构同名的函数

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) 函数将与模式不一致。因此,人们普遍认为,这些类型的驼峰式函数应该只保留用于元组结构和元组变体,可以知道它真正反映了数据结构中包含的内容,没有进一步的处理或魔法。