、List.pop_at/3
は再帰、:lists.reverse
、と頭のアクセスを使用して自分自身を実現しています。つまり、リストの最後の要素に直接アクセスする方法はありません。
リストでN
の要素、たとえば、より多くのあり得ないことを懸念、ある一方、直接パターンマッチがまだ達成可能である:
defmodule MatchInTheMiddle do
@n 10
Enum.each([email protected], fn i ->
@match_clause Enum.map(0..i, fn j -> {:"p#{j}", [], Elixir} end)
def match_middle(unquote(
[{:_head, [], Elixir}] ++ @match_clause ++ [{:_last, [], Elixir}])
), do: IO.inspect unquote(@match_clause)
end)
end
そして、はい、短いと長いリストのための優雅なフォールバック:
def match_middle([]), do: []
def match_middle([_]), do: []
def match_middle([_head | tail]) do
with [_tail | middle] <- :lists.reverse(tail), do: middle
end
MatchInTheMiddle.match_middle([1,2,3,4])
#⇒ [2,3]
これは、おそらくそれがあることが予想ほどエレガントではありませんが、これらの句は上のパターンマッチとにをコンパイルしているので、いくつかのケースでは、それは、役に立つかもしれません胡データの量がこれよりも効率的です。Enum
操作。
おそらくありません – JustMichael
最初と最後の要素を除いたリストを抽出するだけではなく、パターンマッチしてもよろしいですか? – GavinBrelstaff
@GavinBrelstaff私はパターンマッチングについて特に疑問を抱いていましたが、あなたがそれを行う簡潔な方法を持っているなら、私はそれを見たいと思います。私は現在、心に来た最初のものを使用しています。コメントの書式を設定する方法はありません....ここでは、セミコロンを使用して方法をガイドしています。 [_ |残り] =アイテム; [_last | rest_backwards] = Enum.reverse残り; middle = Enum.reverse(rest_backwards) – MaxStrange