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

发布于 2017-01-29 02:25:15 字数 202 浏览 1318 评论 2

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(2

瑾兮 2017-09-13 02:01:22

你的问题,其实是一开始理解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 00:55:26

http://www.next-gen.cc/
看这里

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文