Erlang-针对Erlang中变量不可变的情况,在程序设计中有哪些技巧
如果一个运算中持续修改变量值,是不断的声明新变量来取代旧变量,还是最好这些数据丢进数据库里做操作?或者说在erlang中,针对这个问题一般的解决思路是怎样的。
比如我在写一个关于战斗的东西,因为里面人物的血量是不断减少的,所以我需要对生命值做频繁修改,还有魔法值的消耗,比如防御力的削弱,在这个运算过程中,里面的每个人物的数值都在不断变化,在erlang这种语言里,怎么来实现呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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中直接修改全局变量是差不多的。
不知道回答了你的问题没有,水平有限,欢迎指正。
http://www.next-gen.cc/
看这里