Вот пример кода с тестами, где у меня есть функция, которая проверяет, находится ли переданное значение в допустимом наборе значений, и если это не так, то возникает исключение, но если переданное значение равно 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?
, как я сделал в этом примере.Кажется, среди программистов Elixir есть чувство, что этот тип вспомогательного метода не нужен и может быть выполнен с помощью сопоставления с шаблоном .
Как вы можете реализовать подобную функцию с помощью простого сопоставления с шаблоном ине вспомогательная функция blank?
? 1010 *