Можно ли частично реализовать свойства Rust? - PullRequest
1 голос
/ 26 апреля 2019

Я читаю книгу Программирование Rust , и узнал о чертах и ​​универсальных типах Rust.И я считаю, что границы типа могут быть наложены на методы черты.Затем я построил следующую черту и реализовал ее для структуры.

use std::fmt::Display;
trait Test<T> {
    fn show(&self)
    where
        T: Display;
    fn test(&self);
}

struct S<T> {
    field: T,
}

impl<T> Test<T> for S<T> {
    fn show(&self)
    where
        T: Display,
    {
        println!("My field: {}", self.field);
    }

    fn test(&self) {
        println!("Just for test");
    }
}

Следующий код не скомпилируется так, как ожидалось:

struct R;

fn main() {
    let s = S { field: R {} };
    s.show();
}

Но следующий код скомпилируется и запустится.

struct R;

fn main() {
    let s = S { field: R {} };
    s.test();
}

не следует ржаветьпросто отклонить код, когда s определен как S { field: R{} }?Означает ли это, что s является экземпляром S, который реализует trait T частично?

1 Ответ

0 голосов
/ 26 апреля 2019

Можно ли частично реализовать свойства Rust?

Нет. Либо олл-ин, либо ничего.

Но почему один код компилируется, а другой нет.

Причиной является дополнительная граница show

fn show(&self) where T: Display;

Это означает, что когда вы хотите вызвать этот метод, ваш T должен реализовать Display. Если это не реализовано, вы не можете вызвать его.

Рустики "дженерики" работают иначе, чем С ++, например.

В C ++ у вас есть SFINAE (Ошибка замены не является ошибкой). Это вроде утка, набирающая .
Rust работает на границах, это означает, что вы должны указать, какие черты ваш «универсальный» должен препятствовать использованию функций. В этом случае вы можете позвонить Display::fmt, потому что вы указали, что ваш T должен реализовать эту черту.

Эта граница не указана для вашего test метода, и поэтому вы можете вызывать его с любым типом, который вам нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...