Фильтрация таблиц без использования защитных предложений
В эликсире я хотел бы иметь возможность фильтровать таблицу ets с помощью функции.
В настоящее время у меня есть простой пример таблицы ets в оболочке iex...
iex> :ets.new(:nums, [:named_table])
:nums
iex> :ets.insert :nums, [{1}, {2}, {3}, {4}, {5}]
true
fun = :ets.fun2ms(fn {n} when n < 4 -> n end)
[{{:"$1"}, [{:<, :"$1", 4}], [:"$1"]}]
:ets.select(:nums, fun)
[1, 3, 2]
Это все работает, как и следовало ожидать. Мой вопрос касается функции, используемой для запроса таблицы ETS. В настоящее время он использует защитное предложение для фильтрации результатов менее 4.
Я хотел бы знать, есть ли способ поместить синтаксис предложения guard в тело функции. Например...
iex> fun2 = :ets.fun2ms(fn {n} -> if n < 4, do: n end)
но если я делаю это, то я получаю следующую ошибку...
Error: the language element case (in body) cannot be translated into match_spec
{:error, :transform_error}
Возможно ли что-то подобное?
1 ответ
Оказывается, это единственный путь
От erlang
документация
Веселье очень ограничено, оно может принимать только один параметр (объект для сопоставления): единственная переменная или кортеж. Он должен использовать тесты is_ guard. Языковые конструкции, которые не представлены в спецификации соответствия (if, case, receive и т. Д.), Не допускаются.
Подробнее о технических характеристиках в Erlang