【发布时间】:2019-02-28 04:06:55
【问题描述】:
这是一个带有测试的代码示例,其中我有一个函数检查传入的值是否在允许的值集中,如果不是,它会引发异常,但如果传入的值是 nil 或一个空白字符串,它只返回false。这里的想法是任何类型的空白值都意味着没有价值。如果存在与有效值之一不匹配的非空白值,那么我们确实希望引发异常,因为该值无效。还想象这个值来自命令行参数或 Phoenix 请求参数,我们无法控制输入值只是 nil,我们必须检查空值、nil、空字符串或仅包含的字符串的所有排列空格。
ExUnit.start()
defmodule ValidColor do
@valid_colors MapSet.new(~w[red green blue])
def valid?(color) do
cond do
blank?(color) -> false
MapSet.member?(@valid_colors, color) -> true
true -> raise "invalid color"
end
end
defp blank?(value) do
case value do
nil -> true
v when is_binary(v) -> v =~ ~r/\A\s*\z/
_ -> false
end
end
end
defmodule ValidColorTest do
use ExUnit.Case, async: true
test "nil" do
refute ValidColor.valid?(nil)
end
test "empty string" do
refute ValidColor.valid?("")
end
test "string with only blank characters" do
refute ValidColor.valid?(" ")
end
test "invalid color" do
assert_raise RuntimeError, "invalid color", fn ->
ValidColor.valid?("yellow")
end
end
test "valid color" do
assert ValidColor.valid?("red")
end
end
这似乎是 blank? 辅助函数有用的情况,就像我在这个例子中所做的那样。好像有a sentiment among Elixir programmers that this type of helper method is unnecessary and can be done with pattern matching。
如何仅使用模式匹配而不使用 blank? 辅助函数来实现这样的函数?
【问题讨论】:
标签: elixir