initialization - 与结构同名的函数

标签 initialization rust

一般来说,我更喜欢用描述性的名字来编写初始化函数。但是,对于某些结构,有一个明显的默认初始化函数。这种函数的标准 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/

相关文章:

c++ - 了解 C++ 中的 vector 初始化

c - 当我们调用 (char*)malloc(sizeof(char)) 为字符串分配内存时,它是否被初始化?如何初始化?

c++ - 对具有继承的结构使用初始化列表

rust - “associated type … must be specified”,但未使用

rust - 尝试使用增量运算符时编译错误

rust - 在 Iron 中解析 url 并获取动态部分

rust - 为什么Rust中的默认行为是执行赋值移动,而不是仅仅为该值创建另一个 “reference”?

c# - 将 Windows 窗体表单的元素重置为初始化状态 (C#/.NET)

c++ - 长构造函数初始化列表

rust - 为什么 `*mut T` 实现 `Unwindsafe` 而 `&mut T` 没有?