在Javascript谅辣,Ruby和Golang語(yǔ)言中碗殷,函數(shù)都是一等公民卸伞,可以將函數(shù)賦值給變量歪泳,將函數(shù)傳遞給函數(shù),甚至可以將函數(shù)作為返回值返回继阻。
下面我們來(lái)看看在這些語(yǔ)言中耻涛,函數(shù)是如何作為參數(shù)被傳遞的。
Javascript
function sayHello(name) {
console.log("Hello, I am " + name);
}
function execute(someFunction, value) {
someFunction(value);
}
execute(sayHello, "Lisa");
來(lái)看上面這段代碼瘟檩,我們將sayHello
作為第一個(gè)參數(shù)傳遞給了execute
抹缕。注意不是sayHello
的返回值,而是這個(gè)方法本身墨辛!
因此sayHello
成為了execute
內(nèi)部的變量someFunction
卓研,execute
可以通過(guò)someFunction()
來(lái)調(diào)用sayHello
方法。
當(dāng)然背蟆,sayHello
需要接收一個(gè)參數(shù)鉴分,execute
調(diào)用someFunction
時(shí)也需要傳遞一個(gè)參數(shù)哮幢。
或者也可以不提前定義sayHello
方法带膀,而是直接將方法體作為匿名函數(shù)傳給execute
志珍。
function execute(someFunction, value) {
someFunction(value);
}
execute(function(name) {
console.log("Hello, I am " + name);
}, "Lisa");
Ruby
Ruby中的可調(diào)用對(duì)象可以是block, proc, lambda和method。
對(duì)應(yīng)上面的Javascript實(shí)現(xiàn)垛叨,Ruby版本的實(shí)現(xiàn)可以是這樣的伦糯。
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的匿名函數(shù)版
def execute(value)
yield(value)
end
execute('Lisa') { |x| p "Hello, I am #{x}" }
Golang
與Javascript,Ruby稍微不同的是嗽元,Golang是強(qiáng)類型的語(yǔ)言敛纲,execute
在進(jìn)行函數(shù)聲明時(shí)要指定形參類型為func。
func execute(hi func(value string),name string){
hi(name)
}
func sayHello(name string){
fmt.Println("Hello, I am " + name)
}