Получить элементы из списка по их типу структуры в Эликсире

У меня есть карта params, и я хочу получить список значений, "тип" которых равен %Plug.Upload{}. Как проверить тип в Эликсире?


person Cristian Garcia    schedule 16.09.2015    source источник


Ответы (3)


Вы можете сопоставлять шаблоны в структурах так же, как и на картах, поэтому вы можете использовать Enum.filter и Kernel.match?:

params
|> Enum.filter(&match?(%Plug.Upload{}, &1))
person Paweł Obrok    schedule 16.09.2015

params — это карта, поэтому Enum.filter получает пары ключ/значение, а значение — это то, что будет Plug.Upload, поэтому:

params |> Enum.filter(fn({k, v}) -> match?(%Plug.Upload{}, v) end)
person user2793784    schedule 30.03.2016

Вы можете использовать шаблон %Plug.Upload{} с for, так как for пропускает все элементы, которые не соответствуют переданному шаблону.

Это вернет список всех файлов, присутствующих в значениях карты params:

for {_, %Plug.Upload{} = file} <- params, do: file

Если вы просто хотите что-то сделать с файлом, вы можете передать блок do:

for {_, %Plug.Upload{} = file} <- params do
  IO.inspect file
end

Измените _ на имя переменной, если вы также хотите получить доступ к имени файла, присутствующему в отправленной форме.

person Dogbert    schedule 28.07.2016