將Erlang(或Elixir)中的元組與記錄進行匹配的模式是不好的做法?與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
所以用「標籤」字段霸菱一個「家」的價值每記錄將第一條相匹配。當然,那裏會有一些表現處罰。
另外一個原因是,你可能要在這種情況下,直接以更改記錄定義(例如添加新字段)模式匹配將需要修改,而Parroty解決方案仍然很好。恕我直言,這是使用記錄而不是元組的原因,所以這就是爲什麼不使用與記錄直接模式匹配很重要的原因。 – Pascal
實際上它們過於謹慎了,記錄被**定義爲元組,其中第一個元素是記錄名,然後按照與記錄定義中相同的順序跟隨記錄字段。然而,混合記錄語法和元組語法被認爲是糟糕的風格,因爲它消除了使用記錄的一個主要優點。 – rvirding