Comments 6
Server{} — пустая структура, это другое. Чудесными свойствами unit-like структур не обладает
Можно пояснить? Мне казалось, что разница исключительно в том нужны ли скобки при создании инстанса (ну и матчинге). Причём оно ещё и не симметрично сделано: struct S
можно инициализировать и как S
и как S{}
, но со struct S{}
вариант без скобок работать не будет.
Причём оно ещё и не симметрично сделано: struct S можно инициализировать и как S и как S{}, но со struct S{} вариант без скобок работать не будет.
Собственно, в этом и заключается разница. Unit-like структура представляет собой и тип, и значение. Вот такой код:
struct MySystem{}
impl Logger for std::alloc::System {
fn info(&self, msg: &str) {
println!("INFO: {}", msg);
}
}
...
MySystem.info("Hello");
Даст ошибку "expected value, found struct MySystem
". И, действительно, value ведь нет, откуда &self
возьмется? А если заменить MySystem{}
на MySystem;
то все заработает.
Впрочем, согласен, у меня "косяк" в том смысле, что в качестве значения по умолчанию можно любую структуру использовать, не только unit-like, подправил, сделал специальную оговорку.
Может создаться впечатление, что здесь происходит процесс, известный как "Внедрение зависимости" (Dependency Injection)
Это не просто впечатление, это так и есть. А параметрический там полиморфизм или полиморфизм подтипов при этом используется - не имеет к идее DI никакого отношения.
Заменяем глобальный аллокатор в Rust