Функция выдачи синтаксиса возвращает функцию не ясной - PullRequest
0 голосов
/ 08 апреля 2020

Меня это смущает. Если работает следующее:

fn func_exit() -> bool {
    println!("hi");
    true
}

fn locate_func() -> fn() -> bool {
    func_exit
}

Почему следующие синтаксисы выдают ошибку?

fn locate_func1<F: Fn() -> bool>() -> F {
     func_exit
}
fn locate_func2<F>() -> F where F:Fn() -> bool {
    func_exit
}

Я новичок в Rust, и следующее сообщение об ошибке мне не понятно:

error[E0308]: mismatched types
  --> src/main.rs:44:9
   |
43 |     fn locate_func1<F: Fn() -> bool>() -> F {
   |                     - this type parameter - expected `F` because of return type
44 |         func_exit
   |         ^^^^^^^^^ expected type parameter `F`, found fn item
   |
   = note: expected type parameter `F`
                     found fn item `fn() -> bool {func_exit}`
   = help: type parameters must be constrained to match other types
   = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters

error[E0308]: mismatched types
  --> src/main.rs:47:9
   |
46 |     fn locate_func2<F>() -> F where F:Fn() -> bool {
   |                     -       - expected `F` because of return type
   |                     |
   |                     this type parameter
47 |         func_exit
   |         ^^^^^^^^^ expected type parameter `F`, found fn item
   |
   = note: expected type parameter `F`
                     found fn item `fn() -> bool {func_exit}`
   = help: type parameters must be constrained to match other types
   = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters

Ценю некоторую помощь. Спасибо

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020
fn locate_func() -> fn() -> bool {
    func_exit
}

locate_func возвращает указатель на функцию, возвращающую bool (т. Е. fn() -> bool).

fn locate_func1<F: Fn() -> bool>() -> F {
     func_exit
}

locate_func1 означает, что абонент может указать любой F удовлетворяющий границам Fn() -> bool, и он вернет F. Но это явно не тот случай, когда func_exit обязательно относится к типу, указанному вызывающей стороной.

locate_func2 имеет ту же проблему, только с where -Notation.

Что вы, вероятно, хотите, чтобы могло быть следующее:

fn locate_func3() -> impl Fn() -> bool {
     func_exit
}

Там написано: locate_func3 возвращает что-то, что реализует ограничение Fn() -> boolfunc_exit делает так, что его можно вернуть туда).

Также обратите внимание на разницу между fn (указатели функций) и Fn («что-то вызываемое»):

1 голос
/ 08 апреля 2020

Ошибка странная, но ... вы не можете просто вернуть ограниченное значение, как это, потому что вызывающий тип решается вызывающей стороной, и для вызывающей стороны не имеет смысла выбирать тип возвращаемого значения , если , что возвращаемый тип является следствием типа ввода (например, функция тождества является тривиальным примером этого). В данном случае это не так.

Если вы хотите вернуть что-то общее c, вам понадобится какой-нибудь объект черты (например, поместите функцию в коробку и верните Box) или impl (который все еще имеет конкретное возвращаемое значение, но скрывает его на уровне API).

Последний более эффективен, но позволяет возвращать только один конкретный тип, первый менее эффективен, но позволяет возвращать например, разные замыкания.

...