Добавить объявление

Trait в Rust - подобие интерфейсов

Всем привет! Продолжаю изучать Rust и обнаружил что здесь, как и во многих современных языках, есть концепция интерфейсов. Только в Rust они называются трейтами (Trait). Они почти как протоколы в Swift, но со своими особенностями.

Пример:

trait Describable {
fn describe(&self);
}

struct User { name: String, age: u8 }

impl Describable for User {
fn describe(&self) {
println!("User {}, age: {}", self.name, self.age);
}
}

let user = User { name: "Artem".to_string(), age: 33 };
user.describe(); // User Artem, age: 33

А теперь такой же пример, но на Swift:

protocol Describable {
func describe()
}

struct User {
let name: String
let age: Int
}

extension User: Describable {
func describe() {
print("User \(name), age: \(age)")
}
}

let user = User(name: "Artem", age: 33)
user.describe() // User Artem, age: 33

И в Rust и в Swift имеется поддержка реализации по умолчанию для методов интерфейса:

trait Describable {
fn describe(&self) {
println!("Description");
}
}

impl Describable for User {} // Используем реализацию по умолчанию

let user = User { name: "Artem".to_string(), age: 33 };
user.describe(); // Description

protocol Describable {
func describe()
}

extension Describable {
func describe() {
print("Hello!")
}
}

extension User: Describable {} // Используем реализацию по умолчанию

let user: Describable = User(name: "Artem", age: 33)
user.describe(); // Description

Из примеров видно, что реализации очень похожи, единственное что меня смущает: в Rust нужно постоянно прописывать передачу ссылки на текущий объект в методах трейтов (&self).

В Swift этот параметр передается неявно, что делает код немного лаконичнее.
15.10.2025 13 163