【问题标题】:Erlang erlang-rfc4627 strange errorErlang erlang-rfc4627 奇怪的错误
【发布时间】:2013-01-28 17:43:00
【问题描述】:

嗨,我一直在为 erlang 使用 rfc4627,现在我之前有这段代码可以工作,但现在在我对传递方式进行了更改之后,我在节点上遇到了一个错误 * @127.0.0.1' 退出值:{{badmatch,{obj,[{c,1}]}}

这里是代码

-define(TO_SELF, fun(S, M, T) -> Msg = {obj, M}, ?LOG("OUTGOING: ~p~n", [Msg]), ok end).

其中 M 是 Msg=[{c,1}],

有没有人知道是什么原因导致它我整天都在尝试但没有运气。 谢谢 戴夫

【问题讨论】:

  • 我刚刚尝试将 Msg={obj, [{c,1}]} 传递给从定义中删除 Msg var 的函数,它现在可以工作,但我不想通过函数的完整对象
  • 你能发布你的完整代码和完整的错误信息吗?看起来您正在重用导致不匹配的变量。
  • 我的完整代码目前是这样的
  • 定义在另一个文件中,不确定是否有影响

标签: json erlang


【解决方案1】:

可能是 Erlang 中 funs 的变量作用域规则导致了您的问题。在 fun 定义之前绑定的 fun 主体中的任何 free 变量都会将其值导入到 fun 中。 fun 是一个闭包,所以这对于大多数带有闭包的语言来说都很常见,它实际上是使 funs/closure 如此强大的原因之一。

所以如果Msg在你定义乐趣的时候已经绑定了,

Msg = foo,
F = ?TO_SELF,
...

然后导入它的值,Msg = {obj,M} 不绑定Msg,而是针对它的值进行测试,在示例中为foo

【讨论】:

  • 情况确实如此,因为您的回答比我的任何一个都更有意义;)
  • 所以说我在另一个文件中有一个名为 His 的 var 但在另一个文件中说一个 .hrl 我再次定义它会再次发生错误
  • var 的作用域仅限于定义它的函数,因此变量命名的风险很小。在您的示例中,您使用了一个 -define ,它的工作方式类似于字符串替换(我的意思是它不是在 hrl 文件中而是在它使用的函数中解析/分析),并且内部 Msg 变量已经绑定的有趣:所以你得到类似 Msg = {obj, Msg} 的东西不匹配。在我看来,危险来自使用带有隐藏变量的宏(更糟糕的是,具有非常常见的名称)。
  • 是的,当我昨晚上床睡觉时,它点击了,我基本上意识到你在说什么,如果我使用不同的 var 名称,它会很好地工作,你在上面说过这个(但在函数中它使用了)所以我的大脑说停止尝试覆盖 vars :)
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 2014-06-06
  • 2020-05-17
  • 2011-06-14
  • 2020-06-23
  • 2012-06-13
  • 2012-10-17
  • 2023-03-31
相关资源
最近更新 更多