【发布时间】:2018-01-05 17:07:28
【问题描述】:
我正在尝试在 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"]])
但是这段代码直接转到函数头 2。我哪里错了?
更新:查看文件的 git 历史记录显示,记录声明已被丢弃。修改代码为:
foo([#record{property_one = P1, property_two = P2}|_] = Rows)
修复所有问题
【问题讨论】:
-
foo函数是你写的吗?第一个子句只匹配以元组{property_one, property_two}开头的列表。这应该匹配它::module.foo([{:property_one, :property_two}])。P1将永远是:property_one和P2将永远是:property_two与当前的 Erlang 代码。 -
不,我没有编写 Erlang 代码,但我知道它包含具有这些属性的记录,并且它们不是列出的前两个。我正试图解开一些老鼠窝,但我对 Erlang 的兴趣并不大。
-
原码在模式中
{之前有记录名吗? Erlang 中的记录存储为没有属性键名的纯元组。要在 Elixir 中创建 Erlang 记录,您应该使用Record模块,如下所述:hexdocs.pm/elixir/Record.html。 -
它是从另一个确实有 is_record 保护的函数中调用的,但我不确定传递给这个函数的是一个记录,在它到达这个之前有一些列表理解一。我会尝试作为记录,谢谢。
标签: elixir