我正在尝试在Elixir中编写测试,调用与此类似的Erlang代码:
foo([{property_one = P1, property_two = P2}|_] = Rows) when P1 =/= P2 ->
erlang:display("function head one"),
foo(Rows) ->
erlang:display("function head two"),
Rows.
我认为Elixir关键字列表是传递给此函数的正确数据类型,但我似乎无法正确构造它。这是我试图用它来代码的代码:
:module.foo([[property_one: "A", property_two: "B"]])
但是这段代码直接指向功能主管二。我哪里错了?
更新:转到该文件的git历史记录显示记录声明已在某处丢弃。将代码修改为:
foo([#record{property_one = P1, property_two = P2}|_] = Rows)
解决了所有问题
答案 0 :(得分:2)
您的代码存在两个问题。一个作为bitwalker提到的是你的elixir代码,你将你的proplist包装成一个列表。你的erlang代码中的另一个:
[property_one: "A", property_two: "B"]
转换为erlang中的以下proplist:
[{property_one, <<"A">>}, {property_two, <<"B">>}]
在你的erlang代码中你可能想要匹配的是这个(尽管你很难猜到你想要的是什么):
foo([{property_one, P1}, {property_two, P2}|_] = Rows) when P1 =/= P2
一般来说,elixir中的关键字无法转换为erlang'支持者,因为erlang中的键可以是任何类型,但在elixir中它们必须是原子。
如果你必须有更通用的方法将erlang proplists从elixir传递到erlang,那么没有什么能阻止你在elixir中手动构建它们。这将起作用,例如:
[{property_one, "A"}, {"property_two", "B"}]
虽然上面不是关键字列表,但它仍然是一个erlang proplist。
答案 1 :(得分:1)
在我看来,你在调用foo
时将参数包装在一个额外的列表中 - 函数匹配一个proplist,而不是一个支持列表。