Извлечь второй элемент кортежа в конвейер - PullRequest
0 голосов
/ 23 мая 2018

Я хочу иметь возможность извлечь N-й элемент кортежа в конвейере, не используя with или иным образом не разбивая конвейер.Enum.at будет работать идеально, за исключением того факта, что кортеж не является перечислением.

Вот мотивирующий пример:

colors = %{red: 1, green: 2, blue: 3}
data = [:red, :red, :blue]
data 
|> Enum.map(&Map.fetch(colors, &1))
|> Enum.unzip

Это возвращает {[:ok, :ok, :ok], [1, 1, 3]} и, скажем, я просто хочуextract [1, 1, 3]

(Для этого конкретного случая я мог бы использовать fetch!, но для моего фактического кода, который не существует.)

Я мог бы добавить

|> Tuple.to_list
|> Enum.at(1)

Есть ли лучший способ сделать это, не требующий создания временного списка из каждого кортежа?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Pattern Match * может помочь

{ _status, required_value } = 
  data 
    |> Enum.map(&Map.fetch(colors, &1))
    |> Enum.unzip

Вы можете игнорировать _status.

0 голосов
/ 23 мая 2018

Использование Kernel.elem/2:

iex(1)> {[:ok, :ok, :ok], [1, 1, 3]} |> elem(1)
[1, 1, 3]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...