【问题标题】:Rust: a struct and a function with the same nameRust:同名的结构和函数
【发布时间】:2020-02-08 13:17:06
【问题描述】:

可以创建同名的结构和函数。它对于创建没有 ::new() 样板的结构可能很有用。例如:

#[derive(Debug)]
struct Point { 
    x: i32, 
    y: i32,
}

fn Point(x: i32, y: i32) -> Point {
    Point { x, y }
}

fn main() {
    let point = Point(1, 2);
    println!("{:?}", point);
}
  • 它被认为是一种糟糕的风格吗?
  • 我应该使用它来代替还是与::new() 一起使用?
  • 是否有计划弃用此功能?

【问题讨论】:

    标签: function struct rust naming-conventions naming


    【解决方案1】:

    是的,这是一种糟糕的风格。导入结构体Point 还是同名函数不仅会让人感到困惑,而且还违反了一般命名约定:

    warning: function `Point` should have a snake case name
     --> src/main.rs:7:4
      |
    7 | fn Point(x: i32, y: i32) -> Point {
      |    ^^^^^ help: convert the identifier to snake case: `point`
      |
      = note: `#[warn(non_snake_case)]` on by default
    

    不,您应该使用::new() 或公开字段,以便用户可以这样构建它:

    let point = Point { x: 1, y: 2 };
    

    不,它不会很快被删除,因为它只是一个样式/设计问题,不会以任何有意义的方式影响 Rust。无论如何,人们不会喜欢你什么时候这样做,因为这与我们都遵循的使第三方库集成更容易的一般准则相反。


    如果您的意图只是拥有一个命名元组,那么请改用命名元组结构:

    #[derive(Debug)]
    struct Point(i32, i32);
    
    fn main() {
        let p = Point(1, 2);
        println!("{:?}", point); // Point(1, 2)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 2022-11-21
      相关资源
      最近更新 更多