传递多个参数

时间:2012-08-28 06:38:54

标签: function variables module erlang

我正在尝试将现有的C函数转换为Erlang但是在理解它是如何工作时遇到了一些麻烦。假设我在C中有以下功能:

    void(int *x,int *y,int z,int a)
    {
     if(z<a)
      {
     *x = z + a;
     *y = z - a;
      }
     }

我如何在Erlang中将这样的东西写成功能模块?我明白,通常你编写你的函数,它会返回一个操作。但是,如果我必须对多个变量进行计算呢?

2 个答案:

答案 0 :(得分:8)

你可以返回一个像:{X,Y}

这样的元组

这是一个将两个值加倍的函数:

-module(my_module).
-export([doubleus/2]).

doubleus(X, Y) ->
    {X*2, Y*2}.

在shell中:

1> c(my_module).
{ok, my_module}
2> {A, B} = my_module:doubleus(3,4).
{6, 8}

答案 1 :(得分:2)

使用指针操作 - 意味着您可以更改内存中某个位置的状态(对于顺序流,它不是那么糟糕)。

但是在并发环境中,这可能间接导致每个进程发生不可预测的变化,指向该位置(特别是在竞争条件下)。

这就是Java中存在这么多并发机制的原因。

但这不是Erlang的方式。通常 - 在Erlang中没有指针,也没有共享内存。

您可以将状态存储在元组{ X, Y, Z, A }中,并将其从函数传递给函数。有时您的函数会返回 new 状态元组。

在上述情况下,您的功能可能如下所示:

-module( my_module ).
-export( [ f/1 ] ).

f( { _X, _Y, Z, A } ) when Z < A -> { Z + A, Z - A, Z, A };
%% othervise - don't change the state
f( State ) -> State.