1

Mark Summerfield の著書 Programming in Go Section 5.6.3 で Closure example を読んでいます。彼は、Closure を「それが参照されている場合、それが作成されたのと同じスコープに存在するすべての定数と変数を「キャプチャ」する関数」と定義しています。

彼は、クロージャーの 1 つの用途は無名関数 (または Go の関数リテラル) であると述べています。

彼はこの例を挙げています:

addPng := func(name string) string { return name + ".png" }
addJpg := func(name string) string { return name + ".jpg" }
fmt.Println(addPng("filename"), addJpg("filename"))

addPng名前付き無名関数が文字列連結演算子のラッパーであることを理解しています+

私の理解が正しければ、彼は無名関数に名前を割り当て、その名前で関数を呼び出しています。この例の要点がわかりません。同じ関数を定義しaddPngて内部で呼び出すとmain()、同じ結果が得られます。

package main

import ("fmt")

func addPng (name string) string {
    return name + ".png"
    }

func main() {
    fmt.Println(addPng("filename"))
}

関数を別の関数内で定義して使用できないことを理解しています。しかし、Summerfield の例の無名関数が「Closure」と呼ばれるのはなぜですか? そして、なぜラッパー関数を使用するのですか? 私は何が欠けていますか?

4

2 に答える 2

3

状態表現にクロージャを使用する例を次に示します。

package main

import "fmt"

func NextFibonacci() func() int {
    a, b := 0, 1
    return func() (f int) {
        f, a, b = a, b, a+b
        return
    }
}

func main() {
    nf := NextFibonacci()
    f := make([]int, 7)
    for i := range f {
        f[i] = nf()
    }
    fmt.Println(len(f), f)
}

出力:

7 [0 1 1 2 3 5 8]
于 2013-07-07T14:56:31.353 に答える
2

引用された資料が明らかに間違っているか、基本的に要点が完全に抜けているこの特定の本を誰かが参照しているのを見るのは初めてではありません.

ここでこの本について話すのはやめて、まったく使わないように提案します。

クロージャーの適切で正しい定義については、Wikipediaを参照してください。形容詞の「字句」に注意してください。

于 2013-07-07T14:21:10.927 に答える