在 Erlang 中使用完全限定的函数调用?

2024-04-11

我刚刚学习了如何在 Erlang 中升级模块,并且我知道只有使用完全限定名称的函数调用(例如module:function())“重新链接”到加载到 VM 中的当前版本,但未指定模块名称的函数调用不会“重新链接”到当前版本,而是继续使用旧版本。

关于何时使用完全限定的函数调用以及何时可以仅通过函数名称调用函数,是否有经验法则?使用全名调用所有函数是不是一个坏主意(例如module:function())?


Erlang 应用程序通常使用标准行为,例如gen_server http://www.erlang.org/doc/man/gen_server.html and gen_fsm http://www.erlang.org/doc/man/gen_fsm.html,它已经在其内部循环中包含完全限定的函数调用,因此可以解决这个问题。

但是,如果出于某种原因,您觉得必须使用自己的递归消息处理循环来编写自己的模块,并且希望该模块在运行时可升级,则该循环需要包含完全限定的递归调用,通常您会放置此在处理特定升级消息的代码段中,类似于code_change/3功能 http://www.erlang.org/doc/man/gen_server.html#Module:code_change-3预期在与标准行为一起使用的回调模块中。

例如,考虑下面的循环,它与标准行为的循环类似,但大大简化了:

loop(Callbacks, State) ->
    {{Next, NState},DoChange} =
        receive
            {code_change, ChangeData} ->
                {Callbacks:handle_code_change(ChangeData, State), true};
            {cast,Data} ->
                {Callbacks:handle_cast(Data,State), false};
            {call,From,Data} ->
                Result = Callbacks:handle_call(Data,State),
                case Result of
                    {reply, Reply} ->
                        From ! Reply;
                    _ ->
                        ok
                end,
                {Reply, false};
            Message ->
                {Callbacks:handle_info(Message,State), false}
        end,
    case Next of
        stop -> ok;
        _ ->
            case DoChange of
                true -> ?MODULE:loop(Callbacks, NState);
                false -> loop(Callbacks, NState)
            end
    end.

The loop/2函数有两个参数:Callbacks,预期导出为特定消息调用的特定函数的回调模块的名称,以及State,这对循环来说是不透明的,但可能对回调模块有意义。该循环是尾递归的,它通过调用特定的回调函数来处理几个特定的​​消息,然后通过调用来处理任何其他消息handle_info/2在回调模块中。 (如果您使用过标准行为,您会发现这种方法很熟悉。)回调函数返回一个Next值,以及要传递到下一个循环的新状态。如果Next is stop,我们退出循环,否则我们检查DoChange,设置为true仅适用于代码更改消息,如果为真,则循环使用完全限定的调用来调用自身,否则它仅使用常规调用。

正如前面提到的,这一切都被大大简化了。您很少需要编写自己的循环,如果您这样做,还有其他重要的事情未在此处显示,例如系统消息 http://www.erlang.org/doc/design_principles/spec_proc.html你需要处理的。您最好使用标准行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Erlang 中使用完全限定的函数调用? 的相关文章

  • Erlang 中的大型可变字节数组

    当我在 Erlang 中编写一个简单的 Minecraft 服务器应用程序时 我现在关心的问题是如何有效地存储和修改块数据 对于那些不了解 Minecraft 内部结构的人 我需要在内存中存储大量高达 32kB 大小的二进制文件 100 1
  • 重新启动 erlang 进程并保留状态

    我有一个主管进程 它启动多个子进程 目前 当孩子死亡时 我会生成一个具有新 Pid 的新进程 这意味着我丢失了刚刚死亡的子进程的状态信息 我希望我的客户始终使用相同的标识符与子进程进行通信 尽管子进程可能会死亡并由主管重新启动 我正在考虑使
  • Erlang 中的 begin...end 有何用途?

    我刚刚踩了一个begin end在 Erlang 的文档中 here http www erlang org doc reference manual expressions html id79819 但它没有给出一些例子来说明它是如何有用
  • Erlang中socket的“packet”选项怎么能如此加速tcp传输呢?

    使用 packet 4 通过本地主机上的两个不同端口传输1G数据只需要8秒 而使用 packet raw 则无法在30秒内完成相同的任务 我知道如果使用后一种方法 数据将以数万个小块的形式到达 在archlinux上大小为1460字节 我已
  • Mnesia 返回 {aborted, no_transaction}

    我有一个名为 Mnesia 的表person 使用以下记录定义 record person id firstname lastname phone 该表包含以下值 12 alen dumas 97888888 13 franco mocci
  • Erlang编译器错误

    我有以下代码 loop Data gt receive Key Value gt Key Value Data Key gt member Key Data 14 loop Data stop gt io format server sto
  • 当在 erlang 模块上调用“new”时,它会做什么?

    我见过 Erlang 代码中使用了 module name new 但是 module name 模块中没有引用 new 函数 新 有什么作用 它用于 参数化模块 参见here http yarivsblog com articles 20
  • rabbitmq-erlang-client,使用 rebar 友好的 pkg,在开发环境上工作在 rebar 版本上失败

    我成功地将rabbitmq erlang client的rebar友好包用于一个简单的Hello World rebarized和OTP 兼容 应用程序 并且在开发环境中工作正常 我能够启动 erl 控制台并执行我的操作applicatio
  • erlang中如何将中缀转换为后缀?

    我刚刚遇到这个帖子 https stackoverflow com questions 4621151 the shortest way to convert infix expressions to postfix rpn in c 相当
  • 在 Windows 上编译 Erlang 代码

    我安装了 Erlang 13B 并尝试按照教程进行操作 每次我到达c tut 我得到一个错误而不是 ok tut 所以看起来没有安装任何模块 有人能指出我正确的方向吗 我尝试过 Emacs 但我真的不知道如何使用它 甚至还没有接近让 Erl
  • Erlang:NIF 和透析器警告

    在实施 NIF 时 Dialyzer 给了我 函数 crc16 1 没有本地返回 可能是因为我这样做exit在 erl 模块中 如官方文档推荐 module my nifs export crc16 1 on load init 0 ini
  • 构建 Erlang 服务器场(用于业余爱好项目)最便宜的方法是什么? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 假设我们有一个 本质上并行 的问题需要用 Erlang 软件来解决 我们有很多并行进程 每个进程都执行顺序代码 不是数字运算 并且我们向它们投入的 C
  • ejabberd如何编译新模块

    Here http www ejabberd im node 2872我找到了代码 erlc I ejabberd 2 1 13 lib ejabberd 2 1 13 include pa ejabberd 2 1 13 lib ejab
  • RabbitMQ 失败,错误:无法连接到节点rabbit@TPAJ05421843:nodedown

    在 Windows 7 Enterprise 计算机上 我全新安装了 Erlang 17 4 和 RabbitMQ 3 4 3 x64 安装成功且顺利 我还没有尝试创建我的第一个队列或交换器 但我已经看到了麻烦 这个问题类似于另一个SO帖子
  • Erlang - 导入 GPG 公钥

    我正在尝试在 Erlang 中做一些与公钥相关的事情 它们要求我跟踪公钥 根据这一页 http www erlang org doc apps public key using public key html id61611 我应该能够通过
  • 将 erlang shell 作为守护进程/服务运行

    显然 我有一个在 Erlang shell 中运行的 Erlang 程序 我想监视它 这就是我要的 当机器启动时 Erlang shell 应该随之启动 并且在 shell 中运行的程序也应该随之启动 如果 Erlang shell 由于某
  • 拦截登录/注销ejabberd

    我想知道用户何时在自定义模块中的 ejabberd 会话中登录和注销 而不更改 ejabberd 代码 我需要它 因为我必须在用户登录时执行一些操作 并清理用户注销时执行的操作 另外 在某些情况下我需要能够注销用户 那么 有没有办法扩展某些
  • 如何通过 SSL 从 Phoenix Web App 连接到 PostgreSQL?

    When trying to run Elixir Phoenix Web Application using PostgreSQL Database hosted 3rd party Database as a Service Azure
  • 设置 Emacs 进行 Erlang 编程

    Emacs 是 Erlang 编程的首选 IDE 有很多好的模式 distel erlware mode 默认的 erlang 模式 但是您对设置 Emacs 进行专业 Erlang 开发有何建议 按照中所述设置 erlang mode自述
  • 使用自定义 mysql 模式的模块扩展 ejabberd?

    代替ejabberd sql https github com processone ejabberd blob master sql mysql sql L95 我正在使用自定义 MySQL 架构 由于遗留原因 我将对某些活动执行一些数据

随机推荐

  • raw_input 应该只接受单个字符[重复]

    这个问题在这里已经有答案了 可能的重复 Python 从用户处读取单个字符 https stackoverflow com questions 510357 python read a single character from the u
  • Visual Studio Code 自定义语言 IntelliSense 和转到符号

    我正在为 Visual Studio Code 中的自定义语言编写扩展 语法检测通过 tmLanguage 文件运行良好 我试图弄清楚如何添加智能感知并转到符号支持 但我无法找到清晰的文档或参考文件来进行工作 当我打开一个文件并选择自定义语
  • Magento 一个订单可使用多个优惠券代码,无需延期

    我已经工作了 3 天 试图在一个订单中应用多个优惠券代码 我知道有可用的模块 但我不想投资购买模块 我想要一些自定义代码 以便我可以在单个订单中应用多个优惠券代码 要添加 2 个优惠券代码 我所做的是这样的 1 在 sales flat q
  • 如何让程序在ssh退出后继续运行? [复制]

    这个问题在这里已经有答案了 可能的重复 防止后台进程在关闭 SSH 客户端后停止 https stackoverflow com questions 285015 linux prevent a background process fro
  • 如何获取在 TreeView 控件中选择的所有父节点(直到根节点)?

    如果我有一个 TreeView myTreeview 如何获取所选节点的所有父节点 父节点 父节点的父节点等 的列表 我建议您创建一组自己的树助手 例如 下一个是针对您的问题的 public static class TreeHelpers
  • 在 Python 中标记一个保留分隔符的字符串

    有没有相当于str split在Python中也返回分隔符 在处理一些标记后 我需要保留输出的空白布局 Example gt gt gt s tthis is an example gt gt gt print s split this i
  • 使用 XML 命名空间前缀和指定 xmlns="blah" 作为属性之间的区别

    以下 xml 片段在命名空间方面有何区别 如果有 Form1
  • 如何在Python中使用保存模型进行预测

    我正在 python 中进行文本分类 我想在生产环境中使用它来对新文档进行预测 我正在使用 TfidfVectorizer 来构建 bagofWord 我在做 X train vectorizer fit transform clean d
  • 实体框架 4.1 设计器是否可以仅针对选定的实体“从数据库更新模型”?

    情况 有时 数据库模式并不是您所认为的系统信息的理想表示 并且您可能无法更改它 我们一直在使用实体框架创建一个更好的概念模型 以便在这种情况下进行编码 这意味着从数据库更新模型 然后通过设计器或直接使用文本编辑器直接通过 edmx 文件自行
  • Javascript 中的同步睡眠函数

    我想使用 JS JQuery 模拟进度条 这是我的 HTML 代码 p 0 p 我想从 0 到 100 并以慢动作看到 视觉上的进度 所以我真正需要的是一个 For 循环和一个暂停函数 但不幸的是没有类似睡眠的函数Javascript 第一
  • 将代码热交换到“mvnDebug tomcat:run”

    通常我使用启动tomcatmvnDebug tomcat run 代码更改后我需要使用mvn tomcat redeploy 这是次优的 因为我经常只更改现有方法体的内容 我可以将方法的主体热交换到运行时中 然后进行热重新部署作为后备吗 不
  • UITableView:我可以删除多行吗?

    我想根据用户的选择从表视图中删除多行 显然我不能使用didSelectRowAtIndexPath方法 因为它将为所选的每一行调用 我想让用户选择多行进行删除 然后一次性删除它们 是否可以 如果是 那么该怎么办呢 另外 我正在使用基于单视图
  • 如何配置 ASP.NET Core 1.0 以使用本地 IIS 而不是 IIS Express?

    我怎样才能设置一个 Net核心1 0项目使用本地IIS代替IIS 快递调试时 我尝试过修改启动设置 json以各种方式归档 例如 替换所有出现的IIS 快递 with 本地IIS并更新应用程序网址 and 启动网址使用我的自定义本地主机ht
  • 使用 DisplaCy 将 SpaCy 渲染文件保存为 SVG

    我有以下代码 import spacy from spacy import displacy from pathlib import Path nlp spacy load en core web sm parse True tag Tru
  • 为什么我们需要在重载 >> 和 << 运算符时返回对 istream/ostream 的引用?

    如果我不回来会怎样din or dout 实际上我正在读一本书 其中作者返回了返回流引用 istream operator gt gt istream din vector a for int i 0 i
  • 主题应用程序中的样式 SnackBar

    我需要帮助 如何更改样式应用程序中小吃栏中文本的设计 我对代码的更改不感兴趣 我找到了以下代码 但这对我不起作用 这是为什么 我的主题源自 style Theme AppCompat Light DarkActionBar 我将非常感谢您的
  • 如何监控 DOM 的变化?

    有没有一种方法 使用 jQuery 或其他方式 来监视 DOM 的插入 删除 样式更新等 请参阅此处的 MutationEvent 元素 https developer mozilla org en DOM DOM event refere
  • 插件和主题之间的依赖冲突

    我在我的网站上安装了自定义主题和 SMTP 插件 它们都包含用于不同目的的 Google API PHP 客户端 不幸的是 插件和主题使用的依赖是不同版本的 并且它们无法轻松升级或降级 这会导致冲突 插件从主题加载包而不是自己的包 并抛出错
  • Axis HTTP 与 Axis HTTPS 代理设置

    我部署在 Weblogic 集群上的 Java 应用程序调用两个 Web 服务 如下所示 它通过 HTTPS 将 SOAP 客户端请求发送到互联网上的外部应用程序 通过 Axis 1 4 创建的 Java 类 此后 它通过 HTTP 将 S
  • 在 Erlang 中使用完全限定的函数调用?

    我刚刚学习了如何在 Erlang 中升级模块 并且我知道只有使用完全限定名称的函数调用 例如module function 重新链接 到加载到 VM 中的当前版本 但未指定模块名称的函数调用不会 重新链接 到当前版本 而是继续使用旧版本 关