Добавление параметра при именовании переменной - PullRequest
1 голос
/ 30 ноября 2010

Я хотел бы создать словарь для каждого идентификационного номера.

Переданный аргумент может быть, например, {Id, Key, Value}

Я хочу создать новый словарь, добавив Id к префиксу, например, Dict

Затем я хочу написать Ключ к диктовке, используя dict:store(Key, [Value], oldDict)

Value на данный момент является очередью, поэтому я сначала прочту очередь и добавлю к ней, а затем запишу обратно в словарь.

Мой вопрос: как Id добавляется к префиксу?

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

Вы хотите создать имя переменной во время выполнения

Это невозможно, извините.

В Erlang вы не можете прикреплять имена к вещам во время выполнения . Ваша единственная возможность - хранить все словари в другом словаре и передавать их.

Для склейки статического идентификатора (D) и числа Эрланг предоставляет вам множество возможностей. Самый простой способ - создать кортеж {d, ID} и использовать его в качестве ключа. Вы также можете использовать любой из методов конкатенации строк, описанных ниже.

Теперь, когда вы прояснили свой вопрос, большинство моих первоначальных интерпретаций утратили контекст. В любом случае, я оставляю их здесь.

Вы хотите объединить строку и целое число

Это просто, просто используйте:

"D" ++ integer_to_list(SomeID)

Вы хотите установить значение в словаре, используя вышеуказанное в качестве ключа

Erlang - функциональный язык, поэтому деструктивная модификация словаря невозможна. Предположим, у вас есть словарь , хранящийся в переменной Dict, а SomeID имеет значение три. Вы можете получить копию Dict, в которой "D3" установлен на Value, используя:

NewDict = dict:store("D" ++ integer_to_list(SomeID), Value, Dict)

Вы ищете механизм, похожий на printf

Для этого можно использовать функцию Эрланга io_lib:format(FmtString, Args). В отличие от printf, директивы форматирования начинаются с символа тильды . Вы можете найти правильную директиву в руководстве , но для добавления целого числа в строку "D" вызов будет выглядеть так:

io_lib:format("D~b", [SomeID])

Gotcha : io_lib:format/2 возвращает подробный список символов. Если вы хотите плоский список, используйте lists:flatten/1 в результате. Вы можете попробовать это в оболочке Erlang:

(b@frog)1> SomeID = 3.
3                                   
(b@frog)2> io_lib:format("D~b", [SomeID]).
[68,"3"] 
(b@frog)3> lists:flatten(io_lib:format("D~b", [SomeID])).
"D3"

<ч /> † на самом деле, вы можете сделать это, используя словарь процессов. Не надо! Вы потеряете способность правильно тестируйте и отлаживайте свою программу (не считая попадания в ад).

0 голосов
/ 30 ноября 2010

Структура dict в Erlang не позволяет вам дать ему имя.И, наверное, бессмысленно иметь имя в dict.dict - это простой словарь ключ / значение, представление которого не определено.

Если у вас есть несколько словарей, на которые вы хотите сослаться, вероятно, будет хорошей идеей сохранить их в записи или вкортеж, чтобы «назвать» их.Вы не должны создавать имена переменных из параметров функции.

{my_dict, Dict}

#state{
  my_dict = Dict
}

Предположим, вам нужно иметь имена словаря как d_mycustomname, вы можете написать что-то вроде:

atomize(Name) ->
  list_to_atom("d_" ++ Name).

Как и другиереспонденты, я не уверен, что это именно то, что вы просили.Пожалуйста, переформулируйте свой вопрос, чтобы получить лучшие ответы.Мой ответ на данный момент - это просто догадки, основанные на алкоголе.

ПОСЛЕ ВАШЕГО ОБНОВЛЕНИЯ:

Относительно того, как вы добавляете значения в словарь, вам нужновозможно update, а не store операция.

enqueue(D, {_Id, Key, Value}) ->
    Update = fun (Old) -> Old ++ [Value] end,
    dict:update(Key, Update, [Value], D).

Это добавит ваше значение в "очередь".Если его еще нет, он создаст его.

Что касается имен с префиксами, вы можете хранить свои словари в проплисте:

enqueue(ListOfDicts, {Id, Key, Value}) ->
    Name = "dict_" ++ Id,
    case proplists:get_value(Name, ListOfDicts) of
      undefined -> % No such a dict yet
        [{Name, dict:new()}|ListOfDicts];
      D ->
        Update = fun (Old) -> Old ++ [Value] end,
        NewD = dict:update(Key, Update, [Value], D),
        lists:keyreplace(Name, 1, ListOfDicts, {Name, NewD})
    end.

Я не тестировал код, это простоне дать вам представление о том, что я предлагаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...