将方法作为参数传递(Javascript/Ruby)

来源:互联网 发布:冒险岛数据库查询器 编辑:程序博客网 时间:2024/06/10 20:38

本文展示了在Javascript和Ruby中方法是如何作为参数被传递的。

Javascript

function sayHello(name) {  console.log("Hello, I am " + name);}function execute(someFunction, value) {  someFunction(value);}execute(sayHello, "Lisa");

来看上面这段代码,我们将sayHello作为第一个参数传递给了execute。注意不是sayHello的返回值,而是这个方法本身!
因此sayHello成为了execute内部的变量someFunctionexecute可以通过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)endexecute(say_hello, 'Lisa')

lambda版

say_hello = -> (name) { p "Hello, I am #{name}" }def execute(say_hello, value)  say_hello.call(value)endexecute(say_hello, 'Lisa')

method版

def say_hello(name)  p "Hello, I am #{name}"enddef execute(say_hello, value)  say_hello.call(value)endexecute(method(:say_hello), 'Lisa')

block的匿名函数版

def execute(value)  yield(value)endexecute('Lisa') { |x| p "Hello, I am #{x}" }
原创粉丝点击