function, lambda, proc, blcok的区别

博客分类: 阅读次数: comments

function, lambda, proc, blcok的区别

对象 方法名 参数 返回值 执行上下文
function 有方法名 参数(可选,调用时严格匹配) 有返回值,return跳出当前方法 任何地方都可以执行
lambda 有块名 参数(可选,调用时严格匹配) 有返回值,return跳出当前块 只有在函数体中或调用#call来执行
proc 有块名 参数(可选,调用时非严格匹配) 无返回值,一个执行的过程,return跳出当前作用域 只有在函数体中或调用#call来执行
block 匿名块 参数(可选,调用时非严格匹配) 无返回值,一个执行的过程,return跳出当前作用域 只能在函数体中执行

function -> lambda -> proc -> block 是一个越来越抽象的过渡的过程:

function

对我们来说最比较熟悉的应该是function了,说白了就是数学中的映射,我们传给funciton一个参数,通过内部定义的一些逻辑处理得到一个返回值,从某种意义上来说,我觉得funciton和变量没什么区别,不论是function还是变量,我们从他们中得到的是个对象,只是function返回的对象可以由我们传入的参数动态的操作,其次function与其他的三种的不同是因为有了自己的作用域,定义的内部只能使用当前调用对象有资格去使用的binding,function附属于它自己的归属者。

lambda

广义上来说lambda,proc,block都是block,广义的block和function的主要区别就是作用域,当然广义的block有自己的作用域,它限制了外部去访问里面的binding,但它没有限制内部去调用外部的binding,当然他们的调用也必须像function一样附属在对象上,只是function在定义的时候就已经知道了他附属的对象,而block需要在执行的时候去绑定他的调用对象且必须在方法中执行,lambda和function的区别也就是广义的block和funciton的区别了。

proc

比lambda更随意了,它简单的只是个执行过程,没有自己的返回值,就像是浮动着的一块代码,你放哪里执行就在哪里执行一下。

block

是更纯粹的block了,它连名字都没有了。

小结:function像是一个特别规矩的好孩子,墨守成规的工作着,lambda像是一个有些调皮但还算明事理的孩子,proc就有点不听话了,至于blcok就太过分了自己叫啥都不知道了