Never too old to learn.

Pascal匿名函数

Posted on By Andy Zhu

Pascal匿名函数

0x01 引子

假设你写了一个快排,需要支持从大到小和从小到大排序,大多数人可能会这么写:

	procedure qsort1(l,r:longint);
	.....
	procedure qsort2(l,r:longint);
	.....

这岂不是很烦?

匿名函数,就可以解决这个问题。


0x01 匿名函数的作用

匿名函数,本质上是一个指针,指向一个函数或过程。需要时,可以将它作为参数传入另一个函数,在另一个函数中调用。


0x02 如何使用匿名函数

注意!一定要加{$MODE DELPHI(或OBJFPC)}!否则你可能会为一个编译错误调试半小时!

· 首先,你需要定义一个类型,such as:

type
	cmpfunc=function(a,b:longint):boolean;

· 然后,你需要几个这种定义的函数,如:

function cmp1(a,b:longint):boolean;
begin
	exit(a>b);
end;
function cmp2(a,b:longint):boolean;
begin
	exit(a<b);
end;

· 最后,你就可以在快排里使用了。完整代码:

{$MODE DELPHI}
type
	cmpfunc=function(a,b:longint):boolean;
var
	a:array[1..100]of longint;
procedure qsort(l,r:longint;cmp:cmpfunc);
var
	i,j,m,t:longint;
begin
	i:=l;
	j:=r;
	m:=a[(i+j)div 2];
	repeat
		while cmp(a[i],m) do
			i:=i+1;
		while cmp(m,a[j]) do
			j:=j-1;
		if(i<=j)then begin
			t:=a[i];
			a[i]:=a[j];
			a[j]:=t;
			i:=i+1;
			j:=j-1;
		end;
	until i>j;
	if(i<r)then
		qsort(i,r,cmp);
	if(l<j)then
		qsort(l,j,cmp);
end;
function cmp1(a,b:longint):boolean;
begin
	exit(a>b);
end;
function cmp2(a,b:longint):boolean;
begin
	exit(a<b);
end;
var
	i,n:longint;
	t:char;
begin
	readln(n);
	for i:=1 to n do
		read(a[i]);
	readln;
	readln(t);
	if t='u' then
		qsort(1,n,cmp1);
	if t='d' then
		qsort(1,n,cmp2);
	for i:=1 to n do
		write(a[i],' ');
end.