在elixir

时间:2017-06-28 11:47:21

标签: elixir

无论情况如何,是否可以对nilable字符串进行模式匹配?

我想要这样的事情:

def matcher(str) do
    case String.downcase(str) do
        "correct" -> true
        _ -> false
    end 
end 

预期结果:

matcher("") # false 
matcher("correct") # true 
matcher("CorrecT") # true 
matcher(nil) # false.

上述代码的问题是matcher(nil)导致FunctionClauseError。当然,我可以使用帮助方法来检查nil情况,但我想知道是否有更优雅的解决方案。

1 个答案:

答案 0 :(得分:5)

您需要的是仅在对参数执行String.downcase(str)之前将函数参数限制为二进制。其他所有内容都应与false明确匹配:

def matcher(str) when is_binary(str) do
  String.downcase(str) == "correct"
end 
def matcher(_), do: false

nil依次 an atom 将由第二个子句匹配并处理,返回false。请注意,此方法比is_nil(str)的显式检查更安全,因为它会为意外事件返回false