为什么 Rust 在语法上将类型的数据定义与函数和方法实现分开?
Why does Rust syntactically separate the data definition of a type from function and method implementations?
C++ 和 Java 等面向对象的语言使用对象来定义特定数据的行为。因为它们的含义密切相关,所以它们在相同的上下文中声明:class.
Rust 选择在语法上将它们分开。
C++ 风格:
class Foo {
public:
int get_bar();
private:
int _bar;
}
铁锈风格:
struct Foo {
bar: i8,
}
impl Foo {
pub fn bar() -> i8 {
bar
}
}
Rust 不是一种面向对象的语言吗?
在 C++ 或 Java 等语言中,类型实现的方法集在定义类型时是固定的。这意味着一个句法结构足以表达两个相关概念。
在 Rust 中,您可以在原始实现代码不知道的情况下为类型实现特征。这 要求 存在用于实现与数据定义分开的特征的语法。一旦存在该要求,即使在单个文件中也可以通用地使用相同的语法,从而减少混淆。
板条箱 1:
struct Foo;
板条箱 2:
trait Price {
fn price(&self) -> u8;
}
impl Price for crate1::Foo {
fn price(&self) -> u8 {
42
}
}
此外,为同一类型实现多个特征可能会导致方法名称冲突。将每个特征的实现分离到一个单独的语法块中,清楚地消除了正在实现的方法的歧义。
另请参阅:
C++ 和 Java 等面向对象的语言使用对象来定义特定数据的行为。因为它们的含义密切相关,所以它们在相同的上下文中声明:class.
Rust 选择在语法上将它们分开。
C++ 风格:
class Foo {
public:
int get_bar();
private:
int _bar;
}
铁锈风格:
struct Foo {
bar: i8,
}
impl Foo {
pub fn bar() -> i8 {
bar
}
}
Rust 不是一种面向对象的语言吗?
在 C++ 或 Java 等语言中,类型实现的方法集在定义类型时是固定的。这意味着一个句法结构足以表达两个相关概念。
在 Rust 中,您可以在原始实现代码不知道的情况下为类型实现特征。这 要求 存在用于实现与数据定义分开的特征的语法。一旦存在该要求,即使在单个文件中也可以通用地使用相同的语法,从而减少混淆。
板条箱 1:
struct Foo;
板条箱 2:
trait Price {
fn price(&self) -> u8;
}
impl Price for crate1::Foo {
fn price(&self) -> u8 {
42
}
}
此外,为同一类型实现多个特征可能会导致方法名称冲突。将每个特征的实现分离到一个单独的语法块中,清楚地消除了正在实现的方法的歧义。
另请参阅: