Function 传递多个参数

Function 传递多个参数,function,variables,module,erlang,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; } } void(int*x,int*y,int z,int a) { 如果(z您可以返回一个元组,如:{X,Y} 以下是一个函数,它将作为输入的两个值加倍: -modul

我试图将现有的C函数转换为Erlang,但在理解它的工作原理时遇到了一些困难。假设我在C中有以下函数:

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

如果(z您可以返回一个元组,如:{X,Y}

以下是一个函数,它将作为输入的两个值加倍:

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

doubleus(X, Y) ->
    {X*2, Y*2}.
在外壳中:

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

使用指针操作-意味着您可以更改内存中某个位置的状态(对于顺序流来说,这并不坏)

但在并发环境中,这可能会间接地在每个进程中导致不可预知的更改,这些更改指向该位置(特别是在竞争条件下)

这就是为什么Java中有这么多面向并发的机制

但这不是Erlang的方式。一般来说,Erlang中没有指针,也没有共享内存

您可以存储状态,例如,在tuple
{X,Y,Z,A}
中,并将其从一个函数传递到另一个函数。有时您的函数将返回新的状态元组

在上述上下文中,您的函数可能如下所示:

-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.
-模块(my_模块)。
-出口([f/1])。
f({ux,{uy,Z,A})当Z{Z+A,Z-A,Z,A};
%%othervise-不要更改状态
f(状态)->状态。