مرکزی مواد پر جائیں
ماڈیول 3 · سبق 4 از 5کورس میں 14/50~12 min
ماڈیول اسباق (4/5)

قدروں کے بطور بندش اور افعال

گو میں، فنکشنز فرسٹ کلاس ویلیوز ہیں: انہیں تفویض کیا جا سکتا ہے۔ متغیرات، دوسرے فنکشنز کو پاس کیے گئے، اور واپس آئے۔ A بندش ہے a فنکشن لٹریل (گمنام) جو کیپچر کے متغیرات کو ماحول جس میں اس کی تعریف کی گئی ہے۔

فنکشن لٹریل

ایک فنکشن جس کا کوئی نام نہیں، ان لائن لکھا ہوا ہے۔ آپ اسے فوراً فون کریں یا اسے تفویض کریں:

Go
greet := func(name string) {
    fmt.Println("ciao", name)
}
greet("Anna")

// invocata immediatamente:
func() { fmt.Println("subito") }()

greet کی قسم func(string) ہے۔

ماحول پر قبضہ کرنا: بندش

فنکشن لٹریل میں نظر آنے والے متغیرات کو پڑھ اور ترمیم کر سکتا ہے۔ اس کا لغوی دائرہ، بیرونی فنکشن کے واپس آنے کے بعد بھی:

Go
func counter() func() int {
    n := 0
    return func() int {
        n++
        return n
    }
}

c := counter()
fmt.Println(c(), c(), c())  // 1 2 3

n جب تک کم از کم ایک بند اس کا حوالہ دیتا ہے تب تک "زندہ" رہتا ہے۔ ہر کال کو counter() ایک نیا، خودمختار n بناتا ہے۔

کال بیک کے طور پر بند کرنا

ایک بہت عام پیٹرن:

Go
nums := []int{3, 1, 2}
sort.Slice(nums, func(i, j int) bool {
    return nums[i] < nums[j]
})

بندش nums کو پکڑتا ہے اور ترتیب کی وضاحت کرتا ہے۔

پیرامیٹرز کے طور پر کام کرتا ہے۔

کسی فنکشن کو بطور پیرامیٹر قبول کرنے کے لیے، اس کی قسم لکھیں:

Go
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]

اگر دستخط پڑھنا مشکل ہو جائے تو قسم عرف کی وضاحت کریں:

Go
type Transform func(int) int
func apply(nums []int, f Transform) []int { ... }

اسے آزمائیں

ورزش#go.m3.l4.e1
کوششیں: 0لوڈ ہو رہا ہے…

کاؤنٹر () کی وضاحت کریں جو بندش کو لوٹاتا ہے: بندش میں اضافے کی ہر کال اور اندرونی کاؤنٹر واپس کرتی ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

واپسی سے پہلے `n` کا اعلان کرنا ضروری ہے۔ بندش اسے پکڑ لیتی ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش#go.m3.l4.e2
کوششیں: 0لوڈ ہو رہا ہے…

ایک فنکشن لٹریل کو تفویض کریں جو 'ciao' پرنٹ کرتا ہے، پھر اسے کال کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

نحو: `f := func() { ... }` پھر `f()`۔

3 کوششوں کے بعد حل دستیاب ہے۔

Quiz#go.m3.l4.e3
تیار

یہ کیا پرنٹ کرتا ہے؟ (بند ہونے کے دائرہ کار پر نگاہ رکھیں)

Go
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 کے بعد سے، ہر ایک کے لیے لوپ متغیر کی اپنی کاپی ہے۔