5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Elixirで可変長なLISTの2番目の値を取得する方法

Last updated at Posted at 2020-07-28

Elixirにはパターンマッチがあるので要素数がわかっているLISTであれば以下のような感じでかけます。

pry(1)> [a,b,c] = [1,2,3]
[1, 2, 3]
pry(2)> IO.puts b
2
:ok

ところが要素数がわかっていないとエラーになってしまう。

pry(7)> [a, b] = [1,2,3,4,5]
** (MatchError) no match of right hand side value: [1, 2, 3, 4, 5]

パターンマッチなのでマッチできない要素があるとエラーになるのは当たり前ですね。

Elixirには cons演算子,または hd関数?があるので可変長LISTでも要素の先頭を取得するのは簡単です。

pry(14)> head = hd [1,2,3,4,5]
1

pry(15)> [head|_] = [1,2,3,4,5]
[1, 2, 3, 4, 5]
pry(16)> head
1

今回はこの2番目がほしい

hdtl関数を使ってLISPのように取得する方法

pry(17)> hd(tl([1,2,3,4,5]))
2

carcdrを駆使して要素にたどり着く感じ、好き!
でも今回は2番目なのでもうちょっと手を抜きたい。そこで以下のようにした

pry(18)> [a,b|c] = [1,2,3,4,5]
[1, 2, 3, 4, 5]
pry(19)> b
2

↑のやり方ならc以降は可変長に対応( tl相当)するうえに2番目の要素がなにかも見ればすぐにわかる!

コメントにて以下のやり方もできると教えていただいた :pray:
というかこれが他の言語で使うよくやるやり方のような気もするぞ :thinking:

second = [1,2,3,4,5] |> Enum.at(1)
5
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?