ETS テーブルの存在有無を調べる
Erlang の処理系である ERTS には手軽に利用可能なデータストアが複数用意されていて,ETS/DETS テーブルがその内の一つに当たるわけですが,プロセスとは異なり whereis/1 関数で存在の有無を確認することはできないわけです.というのは,例えば
-module(test). -export([test/0]). test() -> ets:new(test, [set, public, named_table]), ets:insert(test, {hoge, foo}), case get_test(test, hoge) of [{hoge, Value}] -> io:format("~p~n", [Value]); [] -> io:format("Pair Not Found~n"); {error, undefined} -> io:format("Table Not Found~n") end.
というようなコードがあったとして,
get_test(TableName, Key) -> case whereis(TableName) of undefined -> {error, undefined}; Tid -> ets:lookup(Tid, Key) end.
上記の関数で何とかしようとしても,whereis/1 関数は常に undefined を返してしまいます.ではどうすれば良いのかと言うと,以下の通り,
get_test(TableName, Key) -> case catch ets:lookup(TableName, Key) of {'EXIT', {badarg, _}} -> {error, undefined}; Any -> Any end.
直接エラーを catch して,badarg エラーの場合にテーブルが定義されていないと解釈すれば正常に動作させることができます.多少汚い感じもしますが ets:lookup/2 関数が badarg エラーを返すのはたぶんテーブルの未定義時のみだと思うので問題無いです.まあ気になって仕方がない方は,適当なガード文で引数の間違い等を弾けば良いのではないでしょうか.