【问题标题】:How to Create an Erlang property list from Elixir如何从 Elixir 创建 Erlang 属性列表
【发布时间】: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_oneP2 将永远是 :property_two 与当前的 Erlang 代码。
  • 不,我没有编写 Erlang 代码,但我知道它包含具有这些属性的记录,并且它们不是列出的前两个。我正试图解开一些老鼠窝,但我对 Erlang 的兴趣并不大。
  • 原码在模式中{之前有记录名吗? Erlang 中的记录存储为没有属性键名的纯元组。要在 Elixir 中创建 Erlang 记录,您应该使用 Record 模块,如下所述:hexdocs.pm/elixir/Record.html
  • 它是从另一个确实有 is_record 保护的函数中调用的,但我不确定传递给这个函数的是一个记录,在它到达这个之前有一些列表理解一。我会尝试作为记录,谢谢。

标签: elixir


【解决方案1】:

在我看来,您在调用 foo 时将参数包装在一个额外的列表中 - 该函数匹配一个 proplist,而不是一个 proplist 列表。

【讨论】:

    【解决方案2】:

    您的代码有两个问题。 bitwalker 提到的一个是在你的长生不老药代码中,你将你的 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 的 proplist,因为 erlang 中的键可以是任何类型,但在 elixir 中它们必须是原子。

    如果您必须有更通用的方法将 erlang proplists 从 elixir 传递到 erlang,那么没有什么能阻止您在 elixir 中手动构建它们。例如,这将起作用:

    [{property_one, "A"}, {"property_two", "B"}]
    

    虽然上面不是关键字列表,但它仍然是一个 erlang proplist。

    【讨论】:

    • 有道理,谢谢。 '=Rows' 让我觉得这是一个列表数组。我有一种感觉,我以某种方式误解了语法。
    • 另外,erlang 代码不是我的,我正在向一个没有测试的代码库添加测试以支持一些重构。
    猜你喜欢
    • 1970-01-01
    • 2012-03-18
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2013-05-27
    • 2017-08-07
    • 2013-09-27
    相关资源
    最近更新 更多