Рассмотрим следующий простой-структуру реализации From
для этой структуры, и функцию, которая принимает экземпляры структуры, содержащие штучной функции: «Привет, мир»Почему мой родовой от реализации не принимает значения <Fn()>?
struct Foo<T>(T);
impl<T> From<T> for Foo<T> {
fn from(x: T) -> Self {
Foo(x)
}
}
fn call(x: Foo<Box<Fn()>>) {
let Foo(f) = x;
f()
}
Печатается:
call(Foo(Box::new(|| println!("Hello, world!"))))
Это не может скомпилировать:
call(Box::new(|| println!("Hello, world!")).into())
следующее сообщение об ошибке дано:
error[E0277]: the trait bound `Foo<Box<std::ops::Fn()>>: std::convert::From<Box<[[email protected]/main.rs:15:19: 15:47]>>` is not satisfied
--> src/main.rs:15:49
|
15 | call(Box::new(|| println!("Hello, world!")).into())
| ^^^^ the trait `std::convert::From<Box<[[email protected]/main.rs:15:19: 15:47]>>` is not implemented for `Foo<Box<std::ops::Fn()>>`
|
= help: the following implementations were found:
= help: <Foo<T> as std::convert::From<T>>
= note: required because of the requirements on the impl of `std::convert::Into<Foo<Box<std::ops::Fn()>>>` for `Box<[[email protected]/main.rs:15:19: 15:47]>`
Я не вижу, каким образом моя From
реализация является любой строже Foo
конструктора. Почему into
не удается найти здесь Foo
?
OK, это имеет смысл, спасибо. Но тогда почему в моем первом примере не используется 'as Box', используя функцию 'Foo'? –
Версия 'in' также работает, если вы делаете' call' generic над любым 'T: Fn()': https://play.rust-lang.org/?gist=85ba2009dac88693b05caa2f5373e975&version=stable&backtrace=0 –
@ChrisEmerson a хорошо пункт, но это * - * другой. В этом случае у вас больше нет «Box». –
Shepmaster