🥃

Elixirの関数ガード

2022/09/08に公開

Elixir、そしてその他いろいろな言語において、リモート関数とは現在いるモジュールではないモジュールで定義された関数のことである。

Enum.member()

とか

String.length()

とかを自作のモジュール内で使用する際にはこれらをリモート関数と言う。逆に今いるモジュールで定義した関数はローカル関数となる。

そしてEnum.member()とかめっちゃ便利な関数を関数のガードとして使いたい!と思って使ってみると

cannot invoke remote function Enum.member?/2 inside guards

とエラーが出ます。そして自作でis_member/2とかのローカル関数を使おうとしても似たように

cannot find or invoke local is_member(roles, :admin) inside guards. 

Only macros can be invoked in a guards and they must be defined before their invocation. Called as: is_member(roles, :admin)

なのでパターンマッチングと標準ライブラリに搭載されたマクロ(is_list( ))とかを活用してガードできるだけ分岐を作り、残りは関数内で処理する必要がある。

Discussion