То, что происходит на самом деле, немного отличается:
- Кто-то звонит
clone
на Box
... - ... что вызывает
clone_box
на тот же Box
... - ... который вызывает
clone
на тот же Box
снова, закрывая l oop.
Это происходит потому, что ваша реализация Clone
вызывает только self.clone_box()
, но clone_box
является методом черты ClonableFnMut
. Эта черта реализована, в частности, на Box<dyn ClonableFnMut<A> + Send + 'static>
из-за полной реализации, требования которой F: FnMut(A) + Clone + Send + 'static
удовлетворяет сама коробка.
Чтобы избежать этого, вам нужно принудительно Clone
реализация для вызова метода clone_box
для содержимого Box
, а не для самого Box
. Есть два очевидных способа в немного разных стилях:
Заменить self.clone_box()
на self.deref().clone_box()
и добавить требуемый импорт use std::ops::Deref;
куда-нибудь.
В качестве альтернативы замените self.clone_box()
на (**self).clone_box()
, что не требует дополнительного импорта, но выглядит слегка загадочно c. Обратите внимание, что аргумент clone, &self
, в основном является синтаксисом c sugar для self: &Self
, поэтому первый *
разыменовывает его с &Box<F>
до Box<F>
, а второй разыменяет его еще раз на F
. Вызов clone_box
затем автоматически ссылается на &F
, так как для этого тоже требуется &self
.