模式匹配的实现和使用

模式匹配是个老概念了,它并不是函数式编程的必须内容,但函数式语言通常都实现了模式匹配,而大部分的命令式语言都空缺了这一块儿,所以给大家留下的印象就是模式匹配只在函数式编程中出现。

下面是一个常规的Fib编码:

[code]
public int fib(int n)
{
if (n < 2) return 1;
return fib(n - 2) + fib(n - 1);
}

// 伪代码
public int fib(int n)
{
PUSH_VARB n
PUSH_INT 2
CALC <
JMPF 0006: POP
PUSH_INT 1
RETURN [1]
0006:PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 2
CALC -
CALL [2]
PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 1
CALC -
CALL [2]
CALC +
RETURN [1]
RETURN
}
[/code]

再看一下模式匹配的写法:

[code]
public int fib(int n ? n < 2) // 要求: n < 2
{
return 1;
}

public int fib(int n)
{
return fib(n - 2) + fib(n - 1);
}

// 伪代码
public int fib(int n)
{
PUSH_VARB n
PUSH_INT 2
CALC <
JMPF 0007: POP
PUSH_INT 1
RETURN [1]
RETURN
0007:PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 2
CALC -
CALL [2]
PUSH_FUNC main::fib
PUSH_VARB n
PUSH_INT 1
CALC -
CALL [2]
CALC +
RETURN [1]
RETURN
}
[/code]

对比两种编码的伪代码可以看出编译器对模式匹配函数自动添加了检测执行代码并进行了函数合并。一切就是这么简单。

模式匹配通常用于替代函数功能级的复杂分支语句,比如嵌套的[b]if[/b]语句或[b]switch[/b]语句。它的优点是在语法上实现了代码分离,有新的编码要求时只需增加新匹配模式或者删改已有的匹配模式即可,程序员无须维护一个复杂的分支函数。

下面举一个使用模式匹配的简单例子:

[code]
<html>
<head>
<title>查看</title>
</head>
<body>
<% ==> begin CGI
public void display(string table id_field content_field click_field ID)
{
// 显示内容

= sys::db().selectStr(@"SELECT %(content_field) FROM %(table)
WHERE %(id_field)='%(ID)'").html();

// 增加点击量

sys::db().execSQL(@"UPDATE %(table) SET %(click_field)=%(click_field)+1
WHERE %(id_field)='%(ID)'");
}

// 建立模式匹配

public void view(string cate ID ? cate == "news") // 新闻
{
display("news", "news_ID", "news_content", "news_clicks", ID);
}

public void view(string cate ID ? cate == "file") // 文章
{
display("files", "file_ID", "file_content", "file_view_count", ID);
}

public void view(string cate ID ? cate == "msg") // 消息
{
display("msgs", "msg_ID", "msg_content", "msg_clicks", ID);
}

// 执行模式匹配

view(${request.cate}, ${request.ID});
==> END CGI %>
</body>
</html>
[/code]

是否使用模式匹配是个习惯问题,也是个经验问题,有时只是老板个人的问题。

从技术上讲,条件越复杂,模式匹配就越有用,这点是可以肯定的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值