Факторизовать методы, используя & amp; Box < T > и & amp; Т в качестве аргумента

Я держу кусок mysql-коннектора с моим проектом, а не в Javahome. В результате вы можете быть уверены, что его можно найти, убедившись в его локальном пути к классам. Большой потенциал заключается в том, что вы можете увеличить проект на другой машине и не беспокоиться о (или забыть), чтобы настроить его снова. Мне лично нравится включать его в управление версиями.

2
задан Peter Hall 2 March 2019 в 13:14
поделиться

1 ответ

Listener является признаком, поэтому Box<Listener> действительно действительно объект признака, Box<dyn Listener> - к сожалению, ключевое слово dyn в настоящее время является необязательным. Оба Box<dyn Listener> и &Mouse реализуют Deref, со связанным типом Target, который реализует Listener. В случае &Mouse значение deref Target равно Mouse, но в случае Box<dyn Listener> это неизвестный объект, dyn Listener из неизвестного размера .

Чтобы собрать всю эту информацию, вы можете написать f так:

fn f<T, L>(_listener: &T)
where
    T: Deref<Target = L>,
    L: Listener + ?Sized
{
}

И вызывать ее из каждой функции следующим образом:

fn fbox(listener: &Box<dyn Listener>) {
    f(listener);
}

fn fref<L>(listener: &L)
where
    L: Listener
{
    f(&listener);
}

[ 1127] Другой, возможно, более простой способ взглянуть на это - отказаться от ограничения Deref и просто использовать обычные ссылки. Используйте Box::as_ref, чтобы превратить Box в ссылку, чтобы вызвать ее. Неограниченное ограничение ?Sized все еще необходимо для случая объекта черты, и все еще работает, так как значение всегда находится за указателем:

fn fbox(listener: &Box<dyn Listener>) {
    f(listener.as_ref());
}

fn fref<L>(listener: &L) where L: Listener {
    f(listener);
}

fn f<L>(_listener: &L)
where
    L: Listener + ?Sized
{
}
0
ответ дан Peter Hall 2 March 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: