У меня есть карта params
, и я хочу получить список значений, "тип" которых равен %Plug.Upload{}
. Как проверить тип в Эликсире?
Получить элементы из списка по их типу структуры в Эликсире
Ответы (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