2013-02-16 5 views
7

Co jest nie tak z tym kodem?Go - zadeklarowany i nieużywany błąd, kiedy myślę, że zrobiłem to dla zmiennej

package main 

import "fmt" 

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

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

prog.go: 13: prev deklarowanych i nieużywany

+2

Zamiast „co jest nie tak z tym kodem” prawdopodobnie oznaczało zapytać (dokładniej) „Dlaczego ten kod produkować ten błąd kompilatora ", dobrze? Prosimy o jak najdokładniejsze zadawanie pytań w przyszłości. :) – Kissaki

Odpowiedz

13

zadeklarowanej zmiennej o nazwie prev i nigdy potem go stosować.

W szczególności, powiedziałeś prev := temp. Jest to tworzenie nowej zmiennej lokalnej w bieżącym zakresie o nazwie prev. Zakładam, że masz zamiar po prostu powiedzieć prev = temp, który modyfikuje zmienną odziedziczoną po otaczającym zakresie. Podobnie prawdopodobnie chciałeś powiedzieć curr = curr + prev w poprzednim wierszu, zamiast używać :=.

+9

Aby rozwinąć, '=' przypisuje prawa do lewej, a ': =' tworzy zmienną * new * o nazwie po lewej i przypisuje jej wartość pozycji po prawej stronie. – Kitsune

+0

Dzięki! Ma doskonały sens. –

2

Jeśli dokonasz zmian sugerowanych przez Kevin Ballard więc

package main 

import "fmt" 

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

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

wyjściowa:

1 
2 
3 
5 
8 
13 
21 
34 
55 
89 

Wyjście nie jest Fibonacci sequence.

Dla Fibonacci sequence,

package main 

import "fmt" 

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

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

wyjściowa:

0 
1 
1 
2 
3 
5 
8 
13 
21 
34 
+1

Aby dodać niewielki fragment, możesz również zastąpić 'curr = curr + prev' za pomocą' curr + = prev'. Oczywiście nie ma żadnej różnicy funkcjonalnej - wystarczy nieco mniej naciśnięć klawiszy. –

+2

Chociaż poprawiłeś kod i dostarczyłeś sugestię kodu programu dla pozornie pożądanej funkcjonalności programu, nie odpowiedziałeś na pytanie * co jest nie tak z kodem */"dlaczego powoduje błąd kompilatora". Dlatego nadal będę go głosował, chociaż może być przydatny w szerszym zakresie (który tak naprawdę nie pasuje do tego formatu Q/A). – Kissaki

+0

Zgadzam się, i faktycznie miałem zamiar odstąpić od pierwszych dwóch numerów sekwencji; Chciałem tylko przetestować zamknięcia. Mimo to może to być pomocne dla niektórych czytelników. –

Powiązane problemy