Эрланг и записи - PullRequest
       16

Эрланг и записи

3 голосов
/ 10 января 2011

Что не так в этом коде? Я ожидал "titi" в person.name, но у меня все еще есть "toto"! Более конкретно, как изменить запись в функции?

init1()->
    S=#person{name="toto"},   %record creation and field setting
    fct(S),
    io:format("~s~n",[S#person.name]).

fct(R)->
    R#person{name="titi"}.    %record updating

Ответы [ 4 ]

10 голосов
/ 10 января 2011

Вам необходимо получить результат функции fct ():

init1()->
    S=#person{name="toto"},   %record creation and field setting
    S2 = fct(S),   % Get updated record
    io:format("~s~n",[S2#person.name]).

fct(R)->
    R#person{name="titi"}.    %record updating
7 голосов
/ 10 января 2011

Берто, я думаю, ты немного опередил себя.Вам действительно нужно понять основы неизменности, прежде чем писать больше кода.(т. е. «переменные» не меняются: вы можете присвоить им значение только один раз.) Я предлагаю вам прочитать бесплатное онлайн-руководство «Изучите немного Эрланга для хорошего блага», по адресу http://learnyousomeerlang.com/. Раздел, посвященныйосновы переменных составляет http://learnyousomeerlang.com/starting-out-for-real#invariable-variables.

2 голосов
/ 11 января 2011

Невозможно особо подчеркнуть, что все данные в Erlang неизменны.Поэтому, чтобы сделать что-то похожее на исходный вопрос, вам нужно изменить его, как это сделал @hdima.Запись не обновляется, а переписывается.Точно так же в Erlang нет глобальных данных, все данные принадлежат процессу.Это справедливо даже для таблиц ETS, поскольку они в основном ведут себя как процесс, хотя и встроенный без явной связи.

Так что если вы используете словарь процессов или таблицу ETS, то data Сам никогда не может быть обновлен, только словарь / таблица.Это означает, что для изменения некоторых данных в словаре / таблице вам необходимо:

  1. «Считать» данные
  2. Обновить данные, создав новые данные
  3. "Запишите «новое обратно в словарь / таблицу»

Без записи новых данных обратно в словарь / таблицу они будут потеряны, так как ваши новые данные были.

0 голосов
/ 11 января 2011

В функции fct () вы не изменяете запись, но возвращаете новое значение для записи, которое необходимо использовать в дальнейшем. Если вы вызываете функцию fct (S) без обработки возвращаемого значения, вы потеряете это новое значение ("titi").

...