为什么禁止在警卫内部使用远程功能

jim*_*ock 14 elixir

为什么我不能使用String或其他模块保护?

码:

def foo(s1, s2) when String.length(s1) == String.length(s2) do 
   # something
end
Run Code Online (Sandbox Code Playgroud)

当我希望使用模块功能时,如何优雅地重新格式化这种情况?

Gaz*_*ler 24

来自erlang文档:

有效保护表达式(有时称为保护测试)的集合是有效Erlang表达式集的子集.限制有效表达式集的原因是必须保证对保护表达式的评估没有副作用.

Elixir也是如此.

好消息是,对于您的特定用例,有一个可以工作的警卫:

def foo(s1, s2) when byte_size(s1) == byte_size(s2) do 
Run Code Online (Sandbox Code Playgroud)

通常,当您想要做的事情不能用于警卫时,您需要检查函数内部,例如:

def foo(s1, s2) do 
  cond do 
    String.length(s1) == String.length(s2) -> # Do something
    true                                   -> # Do something else
  end
end
Run Code Online (Sandbox Code Playgroud)

以下答案解释了使用宏定义自己的防护创建新的防护子句(防护必须使用http://elixir-lang.org/getting-started/case-cond-and-if.html#expressions中记录的有效防护功能-in-guard-clauses)