在为函数子句定义守卫时应该有多严格?

How strict should one be when defining guards for function clauses?

定义函数子句时应该有多严格?

Elixir 允许在 no guards over check types up to verify value within range 范围内写入函数头.

例如,我不知道在这样的函数中使用什么样式:

def measure(args = %{times: times, path: path}) do ...

def measure(args = %{times: times, path: path}) when is_integer(times) and is_binary(path) do ...

def measure(args = %{times: times, path: path}) when is_integer(times) and times > 0 and is_binary(path) ...

在检查许多条件时,这当然是一个问题:线路太长,并且为守卫增加一条线路对我来说似乎不是一个好主意。这使得区分实际代码和函数头变得更加困难...

对于我函数定义的严格性,您有什么建议?

使用守卫完全可以检查数据的内容原因。但是使用 Dialyzer (https://github.com/jeremyjh/dialyxir) 可能会更好地确保类型安全。

即使完全不使用守卫也会导致其他地方出现匹配错误。因此,如果您需要确保提供给您的数据对您的算法有效,请尽早保护它。