ফাংশনগুলি পরামিতি হিসাবে পাস হতে পারে?


157

জাভাতে আমি এমন কিছু করতে পারি

derp(new Runnable { public void run () { /* run this sometime later */ } })

এবং পরে পদ্ধতিতে কোড "চালান"। এটি পরিচালনা করার জন্য একটি ব্যথা (বেনামে অভ্যন্তরীণ শ্রেণি), তবে এটি করা যায়।

গো এর কি এমন কিছু রয়েছে যা কোনও ফাংশন / কলব্যাককে প্যারামিটার হিসাবে পাস করার সুবিধা দেয়?


7
পাঠকদের জন্য নীট / স্পষ্টতা: জাভাতে, "ফাংশনগুলি" পাসযোগ্য হয় না (আসলে, জাভাতে সমস্ত "ফাংশন" আরও সঠিকভাবে মেথডস নামে পরিচিত)। চলমান (এবং সেই থেকে প্রাপ্ত অজ্ঞাতনামা অভ্যন্তরীণ ক্লাসগুলি) কেবল এটি: এমন এক ধরণের যা থেকে অবজেক্টগুলি ইনস্ট্যান্ট করা হয় যা প্রয়োজনীয় ইন্টারফেসের সাবস্ক্রাইব করে ..

2
(ছয় বছর পরে ...) জাভাতে এখন পদ্ধতিগুলি পাস করার উপায় রয়েছে (উদাহরণস্বরূপ containingObject::instanceMethodName): docs.oracle.com/javase/tutorial/java/javaOO/…
ভ্যাজর

উত্তর:


224

হ্যাঁ, এর মধ্যে কয়েকটি উদাহরণ বিবেচনা করুন:

package main

import "fmt"

// convert types take an int and return a string value.
type convert func(int) string

// value implements convert, returning x as string.
func value(x int) string {
    return fmt.Sprintf("%v", x)
}

// quote123 passes 123 to convert func and returns quoted string.
func quote123(fn convert) string {
    return fmt.Sprintf("%q", fn(123))
}

func main() {
    var result string

    result = value(123)
    fmt.Println(result)
    // Output: 123

    result = quote123(value)
    fmt.Println(result)
    // Output: "123"

    result = quote123(func(x int) string { return fmt.Sprintf("%b", x) })
    fmt.Println(result)
    // Output: "1111011"

    foo := func(x int) string { return "foo" }
    result = quote123(foo)
    fmt.Println(result)
    // Output: "foo"

    _ = convert(foo) // confirm foo satisfies convert at runtime

    // fails due to argument type
    // _ = convert(func(x float64) string { return "" })
}

খেলুন: http://play.golang.org/p/XNMtrDUDS0

ভ্রমণ: https://tour.golang.org/moretyype/25 (ফাংশন সমাপ্তি)


একটি ফাংশন যা নিজে নিজেই একটি প্যারামিটার হিসাবে পরামিতিটি দেওয়া সম্ভব? উপরোক্ত উদাহরণগুলিতে মুদ্রিত হওয়া জিনিসগুলি কঠোরভাবে কোড করা হয়েছিল: প্রিন্টিং 123. কোনও পরিবর্তন কী এমনভাবে করা যেতে পারে যাতে আমরা 123 এর পরিবর্তে অন্য কিছু মুদ্রণ করতে পারি? গ্লোবাল ভেরিয়েবল ঘোষণা না করে।
সতী

1
যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আমার মনে হয় আপনি এমন একটি ফানক খুঁজছেন যা একটি ফানক ফেরত দেয়, এখানে দেখুন যেখানে আমি একটি হার্ডকোডযুক্ত "কোট 123" ফাংশনটি "কোট" ফাংশনটির সাথে প্রতিস্থাপন করছি যা আপনি কিছু ইনপুট পাস করার পরে একই ফলাফল অর্জন করে: play.golang.org/p/52ahWAI2xsG
ডিস্কিনার

34

আপনি Go ফাংশনে প্যারামিটার হিসাবে ফাংশনটি পাস করতে পারেন। অন্য গো ফাংশনে প্যারামিটার হিসাবে ফাংশন পাস করার উদাহরণ এখানে রয়েছে:

package main

import "fmt"

type fn func(int) 

func myfn1(i int) {
    fmt.Printf("\ni is %v", i)
}
func myfn2(i int) {
    fmt.Printf("\ni is %v", i)
}
func test(f fn, val int) {
    f(val)
}
func main() {
    test(myfn1, 123)
    test(myfn2, 321)
}

আপনি এখানে চেষ্টা করতে পারেন: https://play.golang.org/p/9mAOUWGp0k


1
ধন্যবাদ! এই ধারণাটি কীভাবে সেরাভাবে ব্যবহার করা যায় এটির এটি একটি স্পষ্ট উদাহরণ! আপনি কার্যকর করতে চান এমন ফাংশনটির পয়েন্টার সহ তথ্য সম্পর্কিত স্টোরগুলির একটি অনুসন্ধান সারণী ব্যবহার করে এটি পুনরায় তৈরি করেছি। এই জন্য নিখুঁত!
জেমস ও'টুল

14

এখানে Go এ নমুনা "মানচিত্র" প্রয়োগ করা আছে। আশাকরি এটা সাহায্য করবে!!

func square(num int) int {
    return num * num
}

func mapper(f func(int) int, alist []int) []int {
    var a = make([]int, len(alist), len(alist))
    for index, val := range alist {

        a[index] = f(val)
    }
    return a
}

func main() {
    alist := []int{4, 5, 6, 7}
    result := mapper(square, alist)
    fmt.Println(result)

}

8

এখানে একটি সহজ উদাহরণ:

    package main

    import "fmt"

    func plusTwo() (func(v int) (int)) {
        return func(v int) (int) {
            return v+2
        }
    }

    func plusX(x int) (func(v int) (int)) {
       return func(v int) (int) {
           return v+x
       }
    }

    func main() {
        p := plusTwo()
        fmt.Printf("3+2: %d\n", p(3))

        px := plusX(3)
        fmt.Printf("3+3: %d\n", px(3))
    }

4
এটি একটি ফাংশনটি কোনও ফাংশন পাস না করে ফিরিয়ে
দিচ্ছে

2

আমি আশা করি নীচের উদাহরণটি আরও স্পষ্টতা সরবরাহ করবে।

package main

type EmployeeManager struct{
    category            string
    city                string
    calculateSalary     func() int64
}


func NewEmployeeManager() (*EmployeeManager,error){

    return &EmployeeManager{
        category : "MANAGEMENT",
        city : "NY",
        calculateSalary: func() int64 {
            var calculatedSalary int64
            // some formula
            return calculatedSalary
        },
    },nil
}

func (self *EmployeeManager) emWithSalaryCalculation(){
    self.calculateSalary = func() int64 {
        var calculatedSalary int64
        // some new formula
        return calculatedSalary
    }
}

func updateEmployeeInfo(em EmployeeManager){
    // Some code
}

func processEmployee(){
    updateEmployeeInfo(struct {
        category        string
        city            string
        calculateSalary func() int64
    }{category: "", city: "", calculateSalary: func() int64 {
        var calculatedSalary int64
        // some new formula
        return calculatedSalary
    }})
}

-2

হ্যাঁ গো প্রথম শ্রেণীর ফাংশন গ্রহণ করে।

দরকারী লিঙ্কগুলির জন্য "Go এ প্রথম শ্রেণীর কাজগুলি" নিবন্ধটি দেখুন ।


4
এই প্রতিক্রিয়া কিছু দয়া করে প্রসারিত করুন; রেফারেন্সের লিঙ্ক (যেমন প্রকৃত রেফারেন্স) ইত্যাদি অন্তর্ভুক্ত করুন

3
আসলে সেই পৃষ্ঠাটিতে 0 তথ্য রয়েছে, উত্স কোডের দ্বারা বোকামির উদাহরণের সাথে কেবল লিঙ্ক link
ওজেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.