Rust:同名的结构体和函数
Rust: a struct and a function with the same name
可以创建具有相同名称的结构和函数。它可能对创建没有 ::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()
一起使用?
- 是否有弃用此功能的计划?
是的,这是糟糕的风格。它不仅会混淆您是导入了结构 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()
或创建字段 public,因此用户可以像这样构建它:
let point = Point { x: 1, y: 2 };
不,它不会很快被删除,因为它只是一个 style/design 问题,不会以任何有意义的方式影响 Rust。无论如何,人们不会喜欢您何时这样做,因为这与我们为使第三方库的集成更容易而遵循的一般准则背道而驰。
如果您只想拥有一个命名元组,请改用命名元组结构:
#[derive(Debug)]
struct Point(i32, i32);
fn main() {
let p = Point(1, 2);
println!("{:?}", point); // Point(1, 2)
}
可以创建具有相同名称的结构和函数。它可能对创建没有 ::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()
一起使用? - 是否有弃用此功能的计划?
是的,这是糟糕的风格。它不仅会混淆您是导入了结构 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()
或创建字段 public,因此用户可以像这样构建它:
let point = Point { x: 1, y: 2 };
不,它不会很快被删除,因为它只是一个 style/design 问题,不会以任何有意义的方式影响 Rust。无论如何,人们不会喜欢您何时这样做,因为这与我们为使第三方库的集成更容易而遵循的一般准则背道而驰。
如果您只想拥有一个命名元组,请改用命名元组结构:
#[derive(Debug)]
struct Point(i32, i32);
fn main() {
let p = Point(1, 2);
println!("{:?}", point); // Point(1, 2)
}