2015-05-20 27 views
1

我正在嘗試創建一個函數,該函數將一個數字存儲到一條記錄中,然後每次函數運行時都將該數值添加到該數字中。添加到Erlang中的現有值

Value: 5 
Run Function (Add One): 1 
Value should be: 6 
Run Function (Add One): 1 
value should be 7 

我試圖用一個記錄:

-record(adder,{value :: integer()}). 

---function 
    Number = random:uniform(6), 
     L=#added{value = Number + #added.value}. 

,因爲它每次重置值。這是行不通的。有什麼建議麼?

+0

在Erlang中所有的「變量」的輸出是不可變的,所以你只能改變記錄的副本。 –

回答

1

看看這個代碼:

-module(test). 
-export([add/1]). 

-record(adder, {value=6}). 

add(X) -> 
    #adder{value = X + #adder.value}. 

如果編譯這個在你的shell,任何調用「增加(3)」將導致「{加法器,5}」而不是「{加法器,9}「。看看:

Eshell V6.4 (abort with ^G) 
1> c(test). 
{ok,test} 
2> test:add(3). 
{adder,5} 
3> test:add(3). 
{adder,5} 

怎麼回事?這是因爲記錄實際上是元組。最後一行中的表達式「#adder.value」被計算爲加法器元組中字段「值」的位置,它是2.讓我們有一些證據。更改記錄的定義:

-module(test). 
-export([add/1]). 

-record(adder, {field1, field2, value=6}). 

add(X) -> 
    #adder{value = X + #adder.value}. 

現在,重新編譯代碼,並調用add(3)再次將導致

1> c(test). 
{ok,test} 
2> test:add(3). 
{adder,undefined,undefined,7} 

我問自己,你怎麼想出了這個問題。你不想讓你的函數成爲這樣的東西嗎?

add2(#adder{value = V} = R, X) -> 
    R#adder{value = V + X}. 
0
-record(adder, {value = 5}). 

add(Value) -> 
    add(#adder{}, Value). 

add(#adder{value =V} = Adder, Value) -> 
    Adder#adder{value = V + Value}. 

test() -> 
    R1 = add(1), 
    io:format("~p~n", [R1]), 
    R2 = add(R1, 10), 
    io:format("~p~n", [R2]). 

這裏是運行test:test().

6> c(test). 
{ok,test} 
7> test:test(). 
{adder,6} 
{adder,16} 
ok