'where' 式でパラメータが dict 型かどうかを確認したいのですが、erlang のリファレンス ブックで見つかりません。
init(Module_symbol_dict) where ???(Module_symbol_dict) ->
#state{module_symbol_dict=Module_symbol_dict}.
手動で書くと、where 式で使用できません。どうすればいいですか?
'where' 式でパラメータが dict 型かどうかを確認したいのですが、erlang のリファレンス ブックで見つかりません。
init(Module_symbol_dict) where ???(Module_symbol_dict) ->
#state{module_symbol_dict=Module_symbol_dict}.
手動で書くと、where 式で使用できません。どうすればいいですか?
変数の型がディクショナリであるか、別の非標準型であるかを確認する方法はありません。ただし、いくつかのトリックがあります。辞書が正確に何であるかを知ることができます。Erlang シェルを起動して、次のように入力します。
> dict:new().
{dict,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}
つまり、dict 自体は特定の構造を持つタプルであり、9 つの要素で構成され、その最初の要素はアトム 'dict' です。したがって、あなたの例では、変数が辞書かどうかを確認できます。
init({dict, _, _, _, _, _, _, _, _} = Module_symbol_dict) ->
#state{module_symbol_dict=Module_symbol_dict}.
dict タプルの他の要素のチェックを追加することで改善できます。
ただし、 dict は dict モジュールの内部タイプであり、プログラマはそれをブラックボックスとして使用する必要があるため、これはあまり良い方法ではないことに注意してください。将来の Erlang リリースでは、dict 構造の定義が変更される可能性があります。