Neden bir yineleme işlevini değişken olarak tanımlayamıyorum? Nüks ettikleri zamanlar dışında keyfi işlevleri tanımlayabiliyorum.Golang işlevi ve işlev değişkeni semantiği
Bu yasaldır:
func f(i int) int {
if i == 0 {
return 1
}
return i * f(i-1)
}
func main() {
fmt.Println(f(2))
}
Bu yasa dışıdır:
var f func(int) int = func(i int) int {
if i == 0 {
return 1
}
return i * f(i-1)
}
func main() {
fmt.Println(f(2))
}
Bu yasal ve ben bunu başlatmasından sonra f anlamaya çünkü sadece tahmin ediyorum:
func main() {
var f *func(int) int;
t := func(i int) int {
if i == 0 {
return 1
}
return i * (*f)(i-1)
}
f = &t
fmt.Println((*f)(2))
}
İşlevsel olarak işlev görüyor gibi görünüyor ve bir işlev türünün değişken bildirimleri farklı bir şekilde ele alınır. Okumaktan öte, belgenin okunmasını beklemiyordum. Bunu detaylandıran belgelerin bir kısmını özledim mi?
Yasadışı davanın sadece başka dillerde çalıştığı için çalışmasını beklerim. JavaScript'te olduğu gibi:
(function() {
var f = function (i) {
if (i == 0) {
return 1;
}
return i * f(i - 1);
};
console.log(f(2));
})();
Git JavaScript değildir. Javascript kodunuza bakar ve "bu iyi görünüyor, henüz ne olduğunu bilmiyorum, ama muhtemelen bu bloğun çağrıldığı andan itibaren" diyor ve sonra işlevi "f" değişkenine atar ve herşey iyi. Go, onu aramadan önce kodla karşılaşmadan önce ne olduğunu bilmek istiyor. –
Neler oluyor ama gerçekten nedenini söylemiyor. Go, 'f' işlev olarak bildirilirse ancak' f' işlev türü değişkeni olarak bildirilip bildirilmediğini bilmek isterse, 'f' nedir bilmek istemez. Bu garip olan şey. –