2012-08-28 54 views
2

我試圖將現有的C函數轉換爲Erlang,但在理解它的工作方式時遇到了一些麻煩。假設我在C中具有以下功能:傳遞多個參數

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

我該如何在Erlang中以函數模塊的形式編寫類似的東西?我明白,通常你寫你的函數,它會返回一個操作。但是如果我必須對多個變量進行計算呢?

回答

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} 
2

使用指針進行操作 - 意味着您可以更改內存中某個位置的狀態(對於順序流,它不是那麼糟糕)。

但是在併發環境中,這可能會間接導致每個進程中發生不可預知的變化,這些變化指向該位置(特別是在競態條件下)。

這就是爲什麼Java中有這麼多面向併發機制的原因。

但這不是Erlang的方式。一般來說 - Erlang中沒有指針,也沒有共享內存。

例如,您可以將狀態存儲在元組{ 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.