在 Erlang(或 Elixir)中将记录作为元组进行模式匹配是一种不好的做法吗?
示例代码:假设我们已经定义了这个模块:
defmodule Ween do
defrecord TimeSpot, at: nil, tag: nil
def proper?({ _, _, "home"} = v), do: { true, "succeeded with: #{inspect v}" }
def proper?(other), do: { false, "failed with: #{inspect other}" }
def sample, do: TimeSpot.new(tag: "home")
end
如果我们定义一个测试如下:
defmodule WeenTest do
use ExUnit.Case
require Ween
test "records are tuples" do
case Ween.proper?(Ween.sample) do
{ true, v } -> IO.puts v
assert(true)
{ false, v } -> IO.puts v
assert(false)
end
end
end
它会成功。
编辑1:@parroty 这里模式匹配测试元组的原因是模拟某种“某种”鸭子类型的记录;我希望的最终结果应该是这样的:
defmodule Ween do
defrecord TimeSpot, at: nil, tag: nil
def proper?([tag: "home"] = v), do: { true, "succeeded with: #{inspect v}" }
def proper?([tag: "1234"] = v), do: { true, "succeeded with: #{inspect v}" }
def proper?(other), do: { false, "failed with: #{inspect other}" }
def sample, do: TimeSpot.new(tag: "home")
end
因此,每条带有“标签”字段且带有“home”值的记录都将匹配第一个子句。当然,那里似乎会有一些性能损失。