Of course it's not a hard-and-fast distinction: you can have a closure that dispatches on one of its parameters to do one of several different things, and you can have an instance with only one method. But it's usually valid.
Of course it's not a hard-and-fast distinction: you can have a closure that dispatches on one of its parameters to do one of several different things, and you can have an instance with only one method. But it's usually valid.
Imagine you have a closure with a function that takes in a string and a list and returns a list. Depending on implementation of the function, you could have the string be the operation you wish to perform. The method name, and the list be the parameters. The returned list is the output.
Getters could pass an empty list and return a list with one entry
Setters could pass a list with a value and return an empty list
And so on :)
Like this:
func NewClosure() func(string, ...float64) []float64 {
x := float64(0)
return func(method string, args ...float64) []float64 {
if method == "setX" && len(args) > 0 {
x = args[0]
return nil
} else if (method == "getX") {
return []float64 { x }
} else {
panic("invalid method")
}
}
}
a := NewClosure()
b := NewClosure()
a("setX", 50)
b("setX", 12)
fmt.Printf("a.X = %v, b.X = %v", a("getX")[0], b("getX")[0])
Runnable example here: http://play.golang.org/p/68NTyEx6_PI like it.
[edit: added working example .. and realized I'm adding to what my parent poster was saying]