【发布时间】:2014-01-11 00:57:57
【问题描述】:
在 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”值的每条记录都将匹配第一个子句。当然,那里似乎会有一些性能损失。
【问题讨论】:
标签: erlang pattern-matching tuples record elixir