Erlang-针对Erlang中变量不可变的情况,在程序设计中有哪些技巧

Web程序数据库 Web程序数据库 主题:1214 回复:2505

Erlang-针对Erlang中变量不可变的情况,在程序设计中有哪些技巧

虐人心 发布于 2017-01-29 字数 379 浏览 1137 回复 2

如果一个运算中持续修改变量值,是不断的声明新变量来取代旧变量,还是最好这些数据丢进数据库里做操作?或者说在erlang中,针对这个问题一般的解决思路是怎样的。
比如我在写一个关于战斗的东西,因为里面人物的血量是不断减少的,所以我需要对生命值做频繁修改,还有魔法值的消耗,比如防御力的削弱,在这个运算过程中,里面的每个人物的数值都在不断变化,在erlang这种语言里,怎么来实现呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(2

瑾兮 2017-09-13 2 楼

你的问题,其实是一开始理解FP时遇到的常见问题,我试着回答一下。
例如在C中要求和:

int sum(int *a, int len)
{
int sum = 0;
for(int i = 0; i < len; i++)
sum += a[i];
return sum;
}

在erlang中变量是不可以修改的,没有sum += a[i];这样的写法,求和过程实现起来是下面这种样子:

sum([], Acc) -> Acc;
sum([H|T], Acc) -> sum(T, Acc + H).

和C有几点不同:
1,函数按照模式匹配定义为多个子句;
2,循环是通过递归方式实现的;
3,和你的问题最相关的一点,变量不可修改,那么变量的值发生变化怎么办?定义新的变量。本例中Acc+H会赋值给新的匿名变量。

具体到你的应用场景中,假设有角色A,对应状态机F,只考虑HP,那么HP将作为F的参数,不断的迭代:

F(0) -> dead;
F(HP) ->
receive
{damage, H} -> F(HP - H);
{heal, H} -> F(HP + H)
end.

start() -> A = spawn(fun() -> F(100) end).

至于你说的数据库操作,当然是可以的,例如通过ETS的表对HP进行存取更新,本质上和在C中直接修改全局变量是差不多的。

不知道回答了你的问题没有,水平有限,欢迎指正。

浮生未歇 2017-02-27 1 楼