如何从Elixir

时间:2017-07-29 20:17:23

标签: elixir

我正在尝试在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)

解决了所有问题

2 个答案:

答案 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,而不是一个支持列表。