在为函数子句定义守卫时应该有多严格?
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) 可能会更好地确保类型安全。
即使完全不使用守卫也会导致其他地方出现匹配错误。因此,如果您需要确保提供给您的数据对您的算法有效,请尽早保护它。
定义函数子句时应该有多严格?
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) 可能会更好地确保类型安全。
即使完全不使用守卫也会导致其他地方出现匹配错误。因此,如果您需要确保提供给您的数据对您的算法有效,请尽早保护它。