亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么追加函數調用時函數執行順序似乎顛倒了?

為什么追加函數調用時函數執行順序似乎顛倒了?

Go
米脂 2023-06-05 17:38:07
我已將其分解為以下最小示例,并且想知道該效果是否是由于函數鏈接造成的。// Interesting Partsome_string := "Some_String"var fn3 StringManipulator = identfn3 = AppendDecorator(" GOLANG", ToLower(PrependDecorator("DECORATED ", fn3)))fmt.Println(fn3(some_string))// Prints "DECORATED some_string golang"http:// Function Definitionsfunc ToLower(m StringManipulator) StringManipulator {? ? return func(s string) string {? ? ? ? lower := strings.ToLower(s)? ? ? ? return m(lower)? ? }}func AppendDecorator(x string, m StringManipulator) StringManipulator {? ? ? ? return func(s string) string {? ? ? ? ? ? return m(s + x)? ? ? ? }}func PrependDecorator(x string, m StringManipulator) StringManipulator {? ? return func(s string) string {? ? ? ? return m(x + s)? ? }}如代碼中所述,這會產生“DECORATED some_string golang”,表明函數是從左到右執行的,而普通函數是從最內層到最外層計算的,即從右到左。[這讓我想起了變換矩陣的后乘——順序也被“顛倒”了,即 M_1 * M_2 * M_3] 這是由于函數鏈接還是什么原因?有人可以幫助我詳細了解這是如何執行的嗎?
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經驗 獲得超2個贊

我重寫了你的例子來說明。


嵌套函數調用從內到外執行。每個函數調用返回一個函數。最終變量m被賦值,其結果AppendDecorator本身就是一個由所有裝飾器組成的函數,看起來像這樣:


m := func(s string) string {

    return ("DECORATED " + strings.ToLower(s + " GOLANG"))

}

當我們執行m(s)(內部fmt.Println(m(s))時,我們正在執行由返回的函數AppendDecorator。此函數調用m(s + x)where mis 返回的函數ToLower。當這個函數執行時,它調用m(lower)where is where mis the function by 返回PrependDecorator。當這個函數執行時,它會調用m(x + s)我們m傳入的 Identity 函數。


package main


import (

    "fmt"

    "strings"

)


// StringManipulator manipulate a string

type StringManipulator func(str string) string


// Identity a string manipulator that leaves the string unchanged

func Identity(s string) string {

    fmt.Println("Executing Identity manipulator")

    return s

}


// ToLower a lower case string manipulator

func ToLower(m StringManipulator) StringManipulator {

    fmt.Println("Returning ToLower manipulator")

    return func(s string) string {

        fmt.Println("Executing ToLower manipulator")

        lower := strings.ToLower(s)

        return m(lower)

    }

}


// AppendDecorator append a string manipulator

func AppendDecorator(x string, m StringManipulator) StringManipulator {

    fmt.Println("Returning Append manipulator")

    return func(s string) string {

        fmt.Println("Executing Append manipulator")

        return m(s + x)

    }

}


// PrependDecorator prepend a string manipulator

func PrependDecorator(x string, m StringManipulator) StringManipulator {

    fmt.Println("Returning Prepend manipulator")

    return func(s string) string {

        fmt.Println("Executing Prepend manipulator")

        return m(x + s)

    }

}


func main() {

    s := "Some_String"


    m := AppendDecorator(" GOLANG", ToLower(PrependDecorator("DECORATED ", Identity)))

    fmt.Println(m(s))

}

來自的輸出m := AppendDecorator(" GOLANG", ToLower(PrependDecorator("DECORATED ", Identity)))是:


Returning Prepend manipulator

Returning ToLower manipulator

Returning Append manipulator

輸出fmt.Println(m(s))是:


Executing Append manipulator

Executing ToLower manipulator

Executing Prepend manipulator

Executing Identity manipulator

DECORATED some_string golang


查看完整回答
反對 回復 2023-06-05
  • 1 回答
  • 0 關注
  • 178 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號