ماڈیول اسباق (4/5)
قدروں کے بطور بندش اور افعال
گو میں، فنکشنز فرسٹ کلاس ویلیوز ہیں: انہیں تفویض کیا جا سکتا ہے۔ متغیرات، دوسرے فنکشنز کو پاس کیے گئے، اور واپس آئے۔ A بندش ہے a فنکشن لٹریل (گمنام) جو کیپچر کے متغیرات کو ماحول جس میں اس کی تعریف کی گئی ہے۔
فنکشن لٹریل
ایک فنکشن جس کا کوئی نام نہیں، ان لائن لکھا ہوا ہے۔ آپ اسے فوراً فون کریں یا اسے تفویض کریں:
greet := func(name string) {
fmt.Println("ciao", name)
}
greet("Anna")
// invocata immediatamente:
func() { fmt.Println("subito") }()greet کی قسم func(string) ہے۔
ماحول پر قبضہ کرنا: بندش
فنکشن لٹریل میں نظر آنے والے متغیرات کو پڑھ اور ترمیم کر سکتا ہے۔ اس کا لغوی دائرہ، بیرونی فنکشن کے واپس آنے کے بعد بھی:
func counter() func() int {
n := 0
return func() int {
n++
return n
}
}
c := counter()
fmt.Println(c(), c(), c()) // 1 2 3n جب تک کم از کم ایک بند اس کا حوالہ دیتا ہے تب تک "زندہ" رہتا ہے۔ ہر کال کو
counter() ایک نیا، خودمختار n بناتا ہے۔
کال بیک کے طور پر بند کرنا
ایک بہت عام پیٹرن:
nums := []int{3, 1, 2}
sort.Slice(nums, func(i, j int) bool {
return nums[i] < nums[j]
})بندش nums کو پکڑتا ہے اور ترتیب کی وضاحت کرتا ہے۔
پیرامیٹرز کے طور پر کام کرتا ہے۔
کسی فنکشن کو بطور پیرامیٹر قبول کرنے کے لیے، اس کی قسم لکھیں:
func apply(nums []int, f func(int) int) []int {
out := make([]int, len(nums))
for i, n := range nums {
out[i] = f(n)
}
return out
}
double := func(x int) int { return x * 2 }
apply([]int{1, 2, 3}, double) // [2 4 6]اگر دستخط پڑھنا مشکل ہو جائے تو قسم عرف کی وضاحت کریں:
type Transform func(int) int
func apply(nums []int, f Transform) []int { ... }اسے آزمائیں
کاؤنٹر () کی وضاحت کریں جو بندش کو لوٹاتا ہے: بندش میں اضافے کی ہر کال اور اندرونی کاؤنٹر واپس کرتی ہے۔
اشارہ دکھائیں۔
واپسی سے پہلے `n` کا اعلان کرنا ضروری ہے۔ بندش اسے پکڑ لیتی ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ایک فنکشن لٹریل کو تفویض کریں جو 'ciao' پرنٹ کرتا ہے، پھر اسے کال کریں۔
اشارہ دکھائیں۔
نحو: `f := func() { ... }` پھر `f()`۔
3 کوششوں کے بعد حل دستیاب ہے۔
یہ کیا پرنٹ کرتا ہے؟ (بند ہونے کے دائرہ کار پر نگاہ رکھیں)
mk := func() func() int {
x := 0
return func() int { x++; return x }
}
a := mk()
b := mk()
fmt.Println(a(), a(), b())Recap
- فنکشنز فرسٹ کلاس ہیں: قابل تفویض، قابل گزر، واپسی کے قابل۔
- فعل لغوی:
func(params) ret { ... }، گمنام۔ - بندش: لغوی دائرہ کار کے متغیرات کو پکڑتا ہے، انہیں زندہ رکھتا ہے۔
- پیرامیٹرز میں واضح فنکشن کی قسم:
func(int) int۔ - گو 1.22 کے بعد سے، ہر ایک کے لیے لوپ متغیر کی اپنی کاپی ہے۔