🥃
Elixirの関数ガード
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