Erlang и время выполнения записывают ограничения

Сначала требуется путь var path = require('path');

Во-вторых, если assets - это папка, в которую вы хотите отправить свое содержимое, и она также находится в файле app.js в той же папке, затем

[116 ] app.use(express.static(path.resolve(__dirname, 'assets')));

9
задан Roham Rafii 5 March 2018 в 22:36
поделиться

3 ответа

Я решаю эту проблему (в разработке) использованием, синтаксический анализ преобразовывает инструменты, чтобы считать .hrl файлы и генерировать функции помощника.

Я записал учебное руководство на нем в Выходе Прерывания.

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

Однако, после того как Вы находитесь в производственных вещах изменение! Если Ваша запись является основанием таблицы (в противоположность определению поля в таблице), затем изменение базовой записи является более трудным (мягко говоря!).

1
ответ дан 3 November 2019 в 07:14
поделиться

Я не уверен, что полностью понимаю Вашу проблему, но я переместился от записей до proplists в большинстве случаев. Они намного более гибки и намного медленнее. Используя (d) ets я обычно использую несколько рекордных полей для крупного выбора и затем проверяю proplists на остающихся записях для подробного выбора.

0
ответ дан 3 November 2019 в 07:14
поделиться

Это кажется, что Вы хотите смочь сделать что-то как get_record_field(Field, SomeRecord) где Field определяется во времени выполнения кодом пользовательского интерфейса, говорят.

Вы правы в этом, Вы не можете сделать этого в стандарте erlang как записи и record_info функция расширена и устранена во время компиляции.

Существует несколько решений, которые я использовал или посмотрел на. Мое решение следующие: (пример предоставляет доступ во время выполнения к #dns_rec и #dns_rr записи от inet_dns.hrl)

%% Retrieves the value stored in the record Rec in field Field.
info(Field, Rec) ->
    Fields = fields(Rec),
    info(Field, Fields, tl(tuple_to_list(Rec))).

info(_Field, _Fields, []) -> erlang:error(bad_record);
info(_Field, [], _Rec) -> erlang:error(bad_field);
info(Field, [Field | _], [Val | _]) -> Val;
info(Field, [_Other | Fields], [_Val | Values]) -> info(Field, Fields, Values).

%% The fields function provides the list of field positions
%% for all the kinds of record you want to be able to query
%% at runtime. You'll need to modify this to use your own records.
fields(#dns_rec{}) -> fields(dns_rec);
fields(dns_rec) -> record_info(fields, dns_rec);
fields(#dns_rr{}) -> fields(dns_rr);
fields(dns_rr) -> record_info(fields, dns_rr).

%% Turns a record into a proplist suitable for use with the proplists module.
to_proplist(R) ->
    Keys = fields(R),
    Values = tl(tuple_to_list(R)),
    lists:zip(Keys,Values).

Версия этого, которое компиляции доступны здесь: rec_test.erl


Можно также расширить этот динамический полевой поиск до динамического поколения matchspecs для использования с ets:select/2 или mnesia:select/2 как показано ниже:

%% Generates a matchspec that does something like this
%% QLC psuedocode: [ V || #RecordKind{MatchField=V} <- mnesia:table(RecordKind) ]
match(MatchField, RecordKind) ->
    MatchTuple = match_tuple(MatchField, RecordKind),
    {MatchTuple, [], ['$1']}.

%% Generates a matchspec that does something like this
%% QLC psuedocode: [ T || T <- mnesia:table(RecordKind),
%%                        T#RecordKind.Field =:= MatchValue]
match(MatchField, MatchValue, RecordKind) ->
    MatchTuple = match_tuple(MatchField, RecordKind),
    {MatchTuple, [{'=:=', '$1', MatchValue}], ['$$']}.

%% Generates a matchspec that does something like this
%% QLC psuedocode: [ T#RecordKind.ReturnField
%%                   || T <- mnesia:table(RecordKind),
%%                        T#RecordKind.MatchField =:= MatchValue]
match(MatchField, MatchValue, RecordKind, ReturnField) 
  when MatchField =/= ReturnField ->
    MatchTuple = list_to_tuple([RecordKind
           | [if F =:= MatchField -> '$1'; F =:= ReturnField -> '$2'; true -> '_' end
              || F <- fields(RecordKind)]]),
    {MatchTuple, [{'=:=', '$1', MatchValue}], ['$2']}.


match_tuple(MatchField, RecordKind) ->
    list_to_tuple([RecordKind
           | [if F =:= MatchField -> '$1'; true -> '_' end
              || F <- fields(RecordKind)]]).

Ulf Wiger также записал parse_transform, Exprecs, который более или менее делает это для Вас автоволшебно. Я никогда не пробовал его, но код Ulf обычно очень хорош.


4
ответ дан 3 November 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: