官术网_书友最值得收藏!

Objects and behavior

Organizing code in Rust is a bit different from regular object-oriented languages such as C#. There, an object is supposed to change its own state, interfaces are simple contract definitions, and specialization is often modeled using class inheritance:

class Door {
private bool is_open = false;

public void Open() {
this.is_open = true;
}
}

With Rust, this pattern would require constant mutability of any Door instance (thereby requiring explicit locking for thread safety), and without inheritance GlassDoor would have to duplicate code, making it harder to maintain.

Instead, it's recommended to create traits to implement (shared) behavior. Traits have a lot in common with abstract classes in traditional languages (such as default implementations of methods/functions), yet any struct in Rust can (and should) implement several of those traits:

struct Door {
is_open: bool
}

impl Door {
fn new(is_open: bool) -> Door {
Door { is_open: is_open }
}
}

trait Openable {
fn open(&mut self);
}

impl Openable for Door {
fn open(&mut self) {
self.is_open = true;
}
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn open_door() {
let mut door = Door::new(false);
door.open();
assert!(door.is_open);
}
}

This pattern is very common in the standard library, and often third-party libraries will even add behavior to existing types by implementing traits in their code (also known as extension traits).

Other than a typical class, where data fields and methods are in a single construct, Rust emphasizes the separation between those by declaring a struct for data and an impl part for the methods/functions. Traits name and encapsulate behaviors so they can easily be imported, shared, and reused.

主站蜘蛛池模板: 全椒县| 巴彦淖尔市| 庆元县| 大悟县| 百色市| 丰台区| 邹城市| 会理县| 同德县| 恭城| 青浦区| 巫溪县| 芒康县| 三江| 中西区| 多伦县| 阳城县| 化州市| 安化县| 广水市| 富阳市| 安泽县| 巴马| 大同市| 高邑县| 若羌县| 丹寨县| 大悟县| 平乡县| 高台县| 防城港市| 永泰县| 松原市| 九龙坡区| 西林县| 宣化县| 东乡县| 壤塘县| 连南| 高邮市| 团风县|