有没有办法对默认记录值进行查找?

2024-04-17

给定一个记录

-record(something, {id                :: integer(),
                    name              :: string(),
                    email = undefined :: string() | undefined}).

有没有办法获取字段的默认值,在本例中得到的事实是#something.email默认为未定义?


记录是 Erlang 中的语法糖,由编译器扩展。 @Dmitry 建议的以下解决方案是有效的,但编译器不会优化它,除非您传递 +inline,因为这里的技巧是真正创建一条记录:

g() -> (#something{})#something.email.

这样的记录语法糖将扩展为:(使用erlc -E)

g() ->
    case {something,undefined,undefined,undefined} of
        {something,_,_,rec0} ->
            rec0;
        _ ->
            error({badrecord,something})
    end.

这最终将变成:(使用erlc -S)

{function, g, 0, 4}.
  {label,3}.
    {line,[{location,"test.erl",10}]}.
    {func_info,{atom,test},{atom,g},0}.
  {label,4}.
    {move,{literal,{something,undefined,undefined,undefined}},{x,0}}.
    {test,is_tuple,{f,5},[{x,0}]}.
    {test,test_arity,{f,5},[{x,0},4]}.
    {get_tuple_element,{x,0},0,{x,1}}.
    {get_tuple_element,{x,0},3,{x,2}}.
    {test,is_eq_exact,{f,5},[{x,1},{atom,something}]}.
    {move,{x,2},{x,0}}.
    return.
  {label,5}.
    if_end.

The #something.email表达式的一部分不仅意味着获取创建的记录的电子邮件字段,还意味着检查传递的记录是否格式良好。该测试目前默认未优化。幸运的是,您可以使用以下方法对其进行优化-compile([inline]).在你的模块中或+inline在命令行上。

对于编译器来说,以下解决方案更简单:

f() -> element(#something.email, #something{}).

记录语法糖(这里#something.email是email字段的索引)将扩展为:

f() ->
    element(4, {something,undefined,undefined,undefined}).

在这种情况下,我们不会告诉 Erlang 测试任何关于#something{}是一个适当的#something 记录。编译器总是优化调用element/2内置功能。所以这最终会变成:

{function, f, 0, 2}.
  {label,1}.
    {line,[{location,"test.erl",7}]}.
    {func_info,{atom,test},{atom,f},0}.
  {label,2}.
    {move,{atom,undefined},{x,0}}.
    return.

请注意,任何字段的默认值is undefined除非明确规定。结果,你的代码:

-record(something, {id                :: integer(),
                    name              :: string(),
                    email = undefined :: string() | undefined}).

相当于:

-record(something, {id    = undefined :: integer() | undefined,
                    name  = undefined :: string()  | undefined,
                    email = undefined :: string()  | undefined}).

然而,你的代码似乎意味着 id 始终是integer()永不undefined,同样这个名字总是string()。这是不真实的。如果这就是您的意思,您应该提供一个不同于undefined:

-record(something, {id    = 0   :: integer(),
                    name  = ""  :: string(),
                    email       :: string()}).

仅提供默认值即可说明dialyzer http://www.erlang.org/doc/man/dialyzer.htmlid 和 name 永远不可能undefined.

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

有没有办法对默认记录值进行查找? 的相关文章

  • 选择用于实现分布式消息传递算法的编程语言

    基本上 我想实现以下算法并分析使用这些算法构建的系统在不同条件下的行为 八卦协议 多个paxos 一致的散列 我的兴趣在于这些算法 我基本上是在寻找一种编程语言 可以让我快速编写这些算法并深入理解这些算法 我应该选择哪种语言 Java Sc
  • 在 Erlang 中确定传入 TCP/IP 连接的 IP 地址和端口

    我想获取传入 TCP IP 连接的 IP 地址和端口号 很遗憾gen tcp s accept and recv函数只返回一个套接字 而gen udp s recv函数还返回地址信息 有没有一种简单的方法来收集属于 Erlang 中套接字的
  • 如何使用 Erlang 发送推送通知?

    我正在尝试使用 Erlang 向 APNs 发送推送通知 这是我到目前为止想出的代码 module apnstest2 export connect 0 connect gt application start ssl ssl seed s
  • Erlang 中的 Apple 推送通知(或 Ruby 中的改进?)

    目前 我的服务器上有一个使用 Ruby 运行的 Apple 推送通知 我想在 Erlang 中使用一个 因为我想使用一个主管来监视它 有人有任何代码可以帮助我吗 这是我的 Ruby 代码 我不喜欢当前实现的一件事是它似乎无法保持连接 它每天
  • 使用 OTP 原理的非阻塞 TCP 服务器

    我开始学习 Erlang 所以我尝试写 hello world 并发编程 IRC 机器人 我已经使用 Erlang 编写了一个 没有任何 OTP 细节 管理程序 应用程序等行为 我希望使用 OTP 原则重写它 但不幸的是我无法找出使用 OT
  • `ejabberdctl start` 导致“内核 pid 终止”错误 - 我该怎么办?

    我用谷歌搜索了三个小时但没有结果 我有一个 ejabberd 安装 但不是使用 apt 安装的 它是从源代码安装的 其中没有名为 ejabberd 的程序 启动和停止 一切都是通过 ejabberdctl 进行的 它完美地运行了一个月 突然
  • Erlang 代码的持续集成服务器

    您使用什么类型的敏捷工具进行 Erlang 开发 什么持续集成 http en wikipedia org wiki Continuous integration您使用 CI 服务器来构建 Erlang 代码吗 我得到的唯一参考来自 Quo
  • Erlang:如何从体内引用匿名函数?

    In Erlang http en wikipedia org wiki Erlang programming language 有没有办法引用当前正在执行的函数 这对于产生无限循环很有用 spawn fun gt do something
  • 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 进程和消息传递架构

    我手头的任务是读取大文件的行 处理它们 并返回有序结果 我的算法是 从评估工作负载的主进程开始 写在文件的第一行 生成工作进程 每个工作进程将使用 pread 3 读取文件的一部分 处理这部分 并将结果发送给 master master接收
  • Elixir / Erlang Dialyzer:为什么行为回调的参数类型应该是子类型而不是超类型?

    我有一个行为 X 和一个参数类型的回调函数 a any 模块 Y 实现行为 X 实现模块 Y 中的回调函数具有参数类型 a any b any Dialyzer 不喜欢这样并抱怨 a b gt is not a supertype of a
  • 如何在Delphi中一次正确地释放包含各种类型的记录?

    type TSomeRecord Record field1 integer field2 string field3 boolean End var SomeRecord TSomeRecord SomeRecAr array of TS
  • 在 Erlang 中使用完全限定的函数调用?

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

    我有一个 Erlang 符号列表 104 105 106 107 如何从此列表中获取字符串 hijk Erlang 中不存在字符串这种数据类型 Stings 只是字符列表 104 105 106 107 and hijk 是完全等价的 事实
  • Erlang 如何并发处理访问邮箱

    关于如何使用erlang邮箱的信息有很多 但很少找到一篇论文或文档描述erlang如何在VM内部同时实际访问邮箱 据我了解 Erlang VM 必须执行锁定或 CAS 操作以确保消息完整性 erlang幕后有没有什么精巧的方法 我假设您所说
  • 在 Erlang 中展平嵌套列表的列表

    我正在做练习Erlang编程 问题是 编写一个函数 给定一个嵌套列表的列表 该函数将返回一个平面列表 例子 flatten 1 2 3 4 5 6 1 2 3 4 5 6 提示 使用concatenate解决flatten 这是我的conc
  • 如何使用 ibrowse 将附件上传到 CouchDB 中的文档?

    我已经使用curl上传图像文件Penguins jpg 例如 C curl gt curl vX PUT H Content Type image jpeg http localhost 5984 DBNAME DOCID Penguins
  • 停止 Erlang 守护进程

    除了跑步 killall 9 beam smp 当我知道 Erlang 节点的情况时 如何以编程方式杀死它 sname 如果我不希望心跳监视器重新启动该进程 如何确保上述问题的任何答案也会终止心跳 有没有一个不错的指南来将 Erlang 部
  • 设置 Emacs 进行 Erlang 编程

    Emacs 是 Erlang 编程的首选 IDE 有很多好的模式 distel erlware mode 默认的 erlang 模式 但是您对设置 Emacs 进行专业 Erlang 开发有何建议 按照中所述设置 erlang mode自述

随机推荐

  • 如何判断一个对象是否是 Mockito 模拟对象?

    是否可以在代码中判断给定对象是否是 Mockito 模拟对象 我想这样做的原因是在使用模拟时返回不同的错误消息 这将用于向其他开发人员建议他们应该使用预先准备的模拟 该模拟已经设置为以有用的方式应答呼叫 而不是自己创建模拟 目前我拥有的最好
  • 《How To Make a Tile-Based Game with Cocos2D 2.X》用cocos2d V3制作本教程

    我有一个小问题 在本教程中如何使用 Cocos2D 2 X 制作基于图块的游戏 http www raywenderlich com 29458 how to make a tile based game with cocos2d 2 x使
  • 当活动处于后台或不在后台时,Firebase 通知不起作用

    我的编码与 firebase 示例代码提供的相同 当 Activity 处于前台状态或打开时 它可以正常工作 但是 当活动关闭或处于后台状态时 它就无法正常工作 问题是这样的 不显示应用程序的应用程序图标 默认情况下以应用程序名称作为通知标
  • 为什么基元的包装类没有 setter?

    包装类 如 Integer Double 等 没有为其内部原始值设置 setter 的原因是什么 我问这个问题是因为这种功能可以简化微积分 并使 Java 语言更加灵活 让我举一些例子 1 我们看下面的例子 Integer x new In
  • 通过adb获取sdcard目录

    我正在制作一个应用程序 它通过 adb 从设备 SD 卡中提取文件 由 Android 应用程序保存 问题是不同的设备 有不同的SD卡目录 i e sdcard SD卡 external sd 首先我发明了以下解决方案 运行 adb she
  • 如何解决“安装包:当前环境没有打开的解决方案。”

    我有一个包含 1 个项目的解决方案 打开包管理器控制台 运行 Install Package MSBuildTasks 但它给了我一个错误 Install Package The current environment doesn t ha
  • 使用 getActivity() 进行强制转换安全吗?

    我正在编写一个有父级的应用程序Activity和几个孩子Fragments 我正在尝试让片段与父活动进行通信 我知道有几种方法可以做到这一点 包括创建一个接口并在父活动中实现它 不过 我对这个方法很感兴趣 ParentActivity ac
  • 禁用 sympy 中的自动简化

    我想禁用 sympy 中的自动简化 例如求解方程x y x我想要得到x x代替1 import sympy from sympy abc import x y z expr x y x sympy solve expr y gt 1 i w
  • 为什么 `head` 需要 `()` 而 `shape` 不需要?

    在下面的代码中 我将 csv 文件导入到 Python 的 pandas 库中并显示前 5 行 并查询 pandas 数据框的 形状 import pandas as pd data pd read csv my file csv data
  • 链接对象文件时出现“未定义的引用”错误[重复]

    这个问题在这里已经有答案了 我意识到这个问题已经通过多种方式提出 包括这个非常全面的答案 https stackoverflow com questions 12573816 what is an undefined reference u
  • DropBox Mac 客户端如何工作?

    我一直在看DropBox http www getdropbox com install os macMac 客户端和我目前正在研究为不同的服务实现类似的界面 他们究竟是如何与这样的取景器交互的 我非常怀疑文件夹中表示的这些对象是每次加载时
  • 颤振卡顶部半径被图像覆盖

    当我向卡片添加图像时 卡片顶部的半径被覆盖 我该如何解决 当我向卡片添加图像时 卡片顶部的半径被覆盖 我该如何解决 class App extends StatelessWidget override Widget build BuildC
  • Razor 语法和 JavaScript

    作为测试 我将我们编写的概念验证应用程序从 Web 表单转换为 Razor 以便我们可以对其进行评估 到目前为止 我遇到了一个让我头疼的问题 生成客户端 Javascript 网络表格
  • PHP oci8 无法通过 pecl 安装:“致命错误:oci8_dtrace_gen.h”

    我正在尝试将我的 fedora 25 网络服务器 php 连接到 Oracle 数据库 为此 我需要 pecl 安装 oci8 但是我收到这个错误 bin sh var tmp pear build roottqYEC6 oci8 2 1
  • Erlang - 导入 GPG 公钥

    我正在尝试在 Erlang 中做一些与公钥相关的事情 它们要求我跟踪公钥 根据这一页 http www erlang org doc apps public key using public key html id61611 我应该能够通过
  • 通过 Spring 集成从分页 REST 服务读取和下载

    目前我正在开发一个 Spring Integration 应用程序 该应用程序具有以下场景 An int http outbound gateway从 REST Services 读取分页元素列表 about in 每个页面内容被分割并存储
  • 导航组件中操作和目的地之间的差异

    我想问一下Android导航系统中Action和Destination有什么区别 https developer android com guide navigation navigation getting started https d
  • Android 布局 - 下面的列表视图和编辑文本

    我试图模仿 HTC SMS 应用程序 传统视图 的行为 其中显示所有消息 并在下面显示 EditText 正如您在屏幕截图中看到的 向上滚动时 EditText 从底部滚动 即使阅读了多篇文章 例如带有 ListView 和按钮的 Andr
  • Jackson OffsetDateTime 序列化 Z 而不是 +00:00 时区?

    我将 Spring Boot 与以下 ObjectMapper 一起使用 Bean public ObjectMapper objectMapper final ObjectMapper mapper new ObjectMapper ma
  • 有没有办法对默认记录值进行查找?

    给定一个记录 record something id integer name string email undefined string undefined 有没有办法获取字段的默认值 在本例中得到的事实是 something email