Фильтрация таблиц без использования защитных предложений

В эликсире я хотел бы иметь возможность фильтровать таблицу 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

Другие вопросы по тегам