背景:
阅读文章

LPC基础数据类型--function

[日期:2008-12-25] 来源:  作者: [字体: ]

1,什么是function类型
2,function有几种形式
3,你所知道的funciton的其他特性

function 类型,中文名称通常叫做函数指标又或函数指针
它表示指向一个函数。

function类型的通常的定义形式是


function f = (: "func" :); //可以对比一下mapping m = ([ key:value ])和array a = ({value1, value2, ...})
(:后面和:)前面都有一个空格,不能没有空格。

由于指向函数,所以根据函数性质的不同,其具体形式有五种:

:指向的是一个区域函数(local function)(比较直观的说法是同一个文件内的其他函数)
则形式为:
function f = (: function_name :);
function_name是这个区域函数的名字
:指向的是一个超越函数(efun)
则形式为:
function f = (: efun_name :);
和第一个形式没有多大区别,只是对象为efun罢了。
:指向其他物件里面的函数(call_other)
则形式为:注意:这种用法从MudOSv20.18开始已经被废止
function f = (: object, function_name :);
:指向一个表达式(expression)
则形式为:
function f = (: expression :);
:指向一个匿名函数(anonymous)
则形式为:
function f = function(args) {语句块;};

执行一个function变量(因为它是指向一个函数的,所有当然有执行的需要)使用evaluate这个超越函数:
evaluate(f);
在老版的LPC里面还有一种写法是*(f);如今仍然兼容这个写法,但是不提倡用这个写法。


既然是指向函数,又可以执行,那么当然需要传递参数。
而function类型变量传递参数的方法非常多,
·最基本的是使用evaluate这个efun的时候传递参数evaluate(f, arg1, arg2, ...)
·还有些efun需要以function变量作为参数的时候,会自动调用function变量,并传递参数
  比如filter_array(array, function, extra args)会对每个array里面的元素都呼叫function,
  并把这个元素作为参数传递给function,而args也会作为参数传递给args
·还有可以在定义function变量的时候指明实参,例如
  function f = (: local_function, arg1, arg2, ... :);
    function f = (: efun_name, arg1, arg2, ... :);
    function f = (: object, ({function_name, arg1, arg2, ...}) :);
    表达式和匿名这两种形式不存在实参,因为他们定义的是函数本身,而不是指明一个以存在的函数

在上面提到的function的五种形式中,有四种都有自己的函数体,有形参;所以当实参传递来的时候可以正常使用,但是对于表达式(expression)这种形式我们还没有说明它的形参如何定义
因为表达式只有一句,所以我们没法在里面定义自己的变量,也没有地方给你定义形参,所以在这种表达式型function变量里面有特殊的使用变量和形参的方法,
使用参数是用$1, $2, $3... 代替,分别表示第一,第二,第三,...... 个参数
由于没法定义自己的变量,所以只有使用外部已经定义好的变量,但是要主意到一个很严重的问题
即使是一个 表达式型function变量,它也是一个完整的函数,那么它也有自己的局部变量生命周期,在一个函数体内使用的变量在这个函数结束一个就会被系统自动销毁,释放。
所以如果直接把在表达式型funtion变量外面定义的变量拿来使用的话,会造成该变量被销毁,导致后面的程序出错,所以这里正确的做法是使用$(var)的形式来引用该变量(这种用法的实质是将变量var复制一份给表达式型function变量使用,这样销毁的时候销毁的也是var的拷贝而不是本身)

以上就是funtion变量的理论部分,我会在下一篇用大量的实例来说明上面提到的每一个细节。

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
本文评论   [发表评论]   全部评论 (0)
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论