第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么追加函數(shù)調(diào)用時函數(shù)執(zhí)行順序似乎顛倒了?

為什么追加函數(shù)調(diào)用時函數(shù)執(zhí)行順序似乎顛倒了?

Go
米脂 2023-06-05 17:38:07
我已將其分解為以下最小示例,并且想知道該效果是否是由于函數(shù)鏈接造成的。// 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)? ? }}如代碼中所述,這會產(chǎn)生“DECORATED some_string golang”,表明函數(shù)是從左到右執(zhí)行的,而普通函數(shù)是從最內(nèi)層到最外層計算的,即從右到左。[這讓我想起了變換矩陣的后乘——順序也被“顛倒”了,即 M_1 * M_2 * M_3] 這是由于函數(shù)鏈接還是什么原因?有人可以幫助我詳細了解這是如何執(zhí)行的嗎?
查看完整描述

1 回答

?
小唯快跑啊

TA貢獻1863條經(jīng)驗 獲得超2個贊

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


嵌套函數(shù)調(diào)用從內(nèi)到外執(zhí)行。每個函數(shù)調(diào)用返回一個函數(shù)。最終變量m被賦值,其結(jié)果AppendDecorator本身就是一個由所有裝飾器組成的函數(shù),看起來像這樣:


m := func(s string) string {

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

}

當(dāng)我們執(zhí)行m(s)(內(nèi)部fmt.Println(m(s))時,我們正在執(zhí)行由返回的函數(shù)AppendDecorator。此函數(shù)調(diào)用m(s + x)where mis 返回的函數(shù)ToLower。當(dāng)這個函數(shù)執(zhí)行時,它調(diào)用m(lower)where is where mis the function by 返回PrependDecorator。當(dāng)這個函數(shù)執(zhí)行時,它會調(diào)用m(x + s)我們m傳入的 Identity 函數(shù)。


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


查看完整回答
反對 回復(fù) 2023-06-05
  • 1 回答
  • 0 關(guān)注
  • 170 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號