Rust: структура и функция с одинаковым именем - PullRequest
0 голосов
/ 08 февраля 2020

Можно создать структуру и функцию с одинаковым именем. Это может быть полезно для создания структуры без шаблона ::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()?
  • Есть ли планы отказаться от этой функции?

1 Ответ

4 голосов
/ 08 февраля 2020

Да, это плохой стиль. Мало того, что это сбивает с толку, импортируете ли вы struct 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() или создайте поля publi c, чтобы пользователь мог построить его следующим образом:

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)
}
...