我試圖將現有的C函數轉換爲Erlang,但在理解它的工作方式時遇到了一些麻煩。假設我在C中具有以下功能:傳遞多個參數
void(int *x,int *y,int z,int a)
{
if(z<a)
{
*x = z + a;
*y = z - a;
}
}
我該如何在Erlang中以函數模塊的形式編寫類似的東西?我明白,通常你寫你的函數,它會返回一個操作。但是如果我必須對多個變量進行計算呢?
我試圖將現有的C函數轉換爲Erlang,但在理解它的工作方式時遇到了一些麻煩。假設我在C中具有以下功能:傳遞多個參數
void(int *x,int *y,int z,int a)
{
if(z<a)
{
*x = z + a;
*y = z - a;
}
}
我該如何在Erlang中以函數模塊的形式編寫類似的東西?我明白,通常你寫你的函數,它會返回一個操作。但是如果我必須對多個變量進行計算呢?
您可能會返回一個元組,如:{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}
使用指針進行操作 - 意味着您可以更改內存中某個位置的狀態(對於順序流,它不是那麼糟糕)。
但是在併發環境中,這可能會間接導致每個進程中發生不可預知的變化,這些變化指向該位置(特別是在競態條件下)。
這就是爲什麼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.