以赤裸裸的回归去关闭

时间:2017-09-30 00:46:29

标签: go closures

我正在玩Go并且正在尝试实现一个fibonacci函数,该函数返回一个返回斐波那契数字的闭包。问题可以在go工具之旅中找到。这是一个使用常规(非裸)返回的闭包实现:

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    a := 0
    b := 1
    return func() int {
        t := a + b
        a = b
        b = t
        return b
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

该函数正确返回以下内容:

1
2
3
5
8
13
21
34
55
89

我尝试在闭包函数中使用裸返回来尝试不同地编写fibonacci函数,但是它会产生错误:

  

./ compile20.go:9:7:b声明且未使用

以下是生成错误的代码

package main

import "fmt"

// fibonacci is a function that returns
// a function that returns an int.
func fibonacci() func() int {
    a := 0
    b := 1
    return func() (b int) {
        t := a + b
        a = b
        b = t
        return
    }
}

func main() {
    f := fibonacci()
    for i := 0; i < 10; i++ {
        fmt.Println(f())
    }
}

有人知道如何使用变量b吗? b显然用在闭包函数的第一行(t := a + b)。

1 个答案:

答案 0 :(得分:2)

返回段中定义的变量会影响外部作用域中具有相同名称的变量。在返回的函数中,<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="350dp" android:layout_height="wrap_content" android:background="@drawable/selector_button_grey" android:clickable="true" android:padding="5dp"> <ImageView android:id="@+id/image_selector" android:layout_width="match_parent" android:layout_height="wrap_content" android:adjustViewBounds="true" android:scaleType="fitCenter" android:background="@color/black" android:src="@drawable/Nachos" /> <TextView android:id="@+id/image_selector_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_below="@+id/image_selector" android:gravity="center_horizontal|center_vertical" android:paddingBottom="5dp" android:paddingLeft="5dp" android:textSize="18sp" /> </RelativeLayout> 指的是返回值中定义的函数。

您可以删除b的第一个声明(和初始化),程序会通过检查,但逻辑不正确。

b