Всем привет! Продолжаю изучать
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 этот параметр передается неявно, что делает код немного лаконичнее.