Pull to refresh

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, подправил, сделал специальную оговорку.

Unit-like структура представляет собой и тип, и значение.

Дошло, спасибо.

Не ту часть кода процитировал, надо бы так:


struct MySystem{}
...
impl Logger for MySystem {
    fn info(&self, msg: &str) {
        println!("INFO: {}", msg);
    }
}
...
MySystem.info("Hello");

Может создаться впечатление, что здесь происходит процесс, известный как "Внедрение зависимости" (Dependency Injection)

Это не просто впечатление, это так и есть. А параметрический там полиморфизм или полиморфизм подтипов при этом используется - не имеет к идее DI никакого отношения.

Да, пожалуй. Полемически заострил, слишком сильно. Сглажу.

Sign up to leave a comment.

Articles