簡體   English   中英

從閉包返回閉包作為函數的返回值

[英]Returning closure from a closure as return value for function

我正在嘗試習慣impl Fn ,但我不明白這段代碼的錯誤:

fn y(state: bool) -> impl Fn() -> impl Fn(bool) -> bool {
    move || {
        println!("state, {}", state);
        |x: bool| {
            println!("state, {}", state);
            !x
        }
    }
}

fn main() {
    y(true)()(true);
}

錯誤是:

error[E0562]: `impl Trait` not allowed outside of function and inherent method return types
 --> src/main.rs:1:35
  |
1 | fn y(state: bool) -> impl Fn() -> impl Fn(bool) -> bool {
  |                                   ^^^^^^^^^^^^^^^^^^^^^
  1. 為什么允許第一個impl Fn ,但不允許第二個?
  2. 如何在不使用堆(通過Box等)的情況下完成此操作?

如果您仔細閱讀該消息,它會准確解釋問題所在:

 `impl Trait` not allowed outside of function and inherent method return types 

目前,您只能使用impl Trait

  • 作為函數的返回類型: fnimpl塊之外使用。
  • 作為固有方法的返回類型: fnimpl Type塊中使用。

就是這樣。

因此,你不能形成特征Fn() -> impl X

我希望這是一個暫時的限制,因為正在進行的工作是擴展可以使用impl X的地方,並且需要相關的類型和特征方法。

為什么允許第一個impl Fn ,但不允許第二個?

第一個impl Fn是函數的返回類型( y ),因此允許它。 第二個是特征方法的返回類型,所以它不是。

如何在不使用堆的情況下完成此操作?

你可以從第一個Fn返回一個具體的實例。

例如,如果您不需要狀態,則可以返回fn(bool) -> bool

否則,您需要手動創建一個封裝所述狀態的結構,以便能夠命名該類型,而不是依賴於閉包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM