在Javascript,Ruby和Golang语言中,函数都是一等公民,可以将函数赋值给变量,将函数传递给函数,甚至可以将函数作为返回值返回。
下面我们来看看在这些语言中,函数是如何作为参数被传递的。
Javascript
function sayHello(name) {
console.log("Hello, I am " + name);
}
function execute(someFunction, value) {
someFunction(value);
}
execute(sayHello, "Lisa");
来看上面这段代码,我们将sayHello
作为第一个参数传递给了execute
。注意不是sayHello
的返回值,而是这个方法本身!
因此sayHello
成为了execute
内部的变量someFunction
,execute
可以通过someFunction()
来调用sayHello
方法。
当然,sayHello
需要接收一个参数,execute
调用someFunction
时也需要传递一个参数。
或者也可以不提前定义sayHello
方法,而是直接将方法体作为匿名函数传给execute
。
function execute(someFunction, value) {
someFunction(value);
}
execute(function(name) {
console.log("Hello, I am " + name);
}, "Lisa");
Ruby
Ruby中的可调用对象可以是block, proc, lambda和method。
对应上面的Javascript实现,Ruby版本的实现可以是这样的。
proc版
say_hello = proc { |name| p "Hello, I am #{name}” }
def execute(say_hello, value)
say_hello.call(value)
end
execute(say_hello, 'Lisa')
lambda版
say_hello = -> (name) { p "Hello, I am #{name}" }
def execute(say_hello, value)
say_hello.call(value)
end
execute(say_hello, 'Lisa')
method版
def say_hello(name)
p "Hello, I am #{name}"
end
def execute(say_hello, value)
say_hello.call(value)
end
execute(method(:say_hello), 'Lisa')
block的匿名函数版
def execute(value)
yield(value)
end
execute('Lisa') { |x| p "Hello, I am #{x}" }
Golang
与Javascript,Ruby稍微不同的是,Golang是强类型的语言,execute
在进行函数声明时要指定形参类型为func。
func execute(hi func(value string),name string){
hi(name)
}
func sayHello(name string){
fmt.Println("Hello, I am " + name)
}