Elixir 中等号的确切含义是什么?

2023-11-25

我不明白 Elixir 中的等号到底意味着什么。 不清楚的是它看起来像是赋值和模式匹配操作的混合。

iex(1)> x=4
4
iex(2)> y=5
5
iex(3)> 3=y
** (MatchError) no match of right hand side value: 5

iex(3)> y=3
3
iex(4)> y=x
4

据我了解,在 Elixir 中,等于运算符意味着将 = 符号的左侧与右侧匹配。前两行对我来说很有意义。 x 和 y 是未绑定变量,因此它们可以匹配任何内容。它们在匹配时就被绑定。因此,我理解了第三行。你无法将 3 与 5 匹配。

我开始失去理智的是为什么最后两行执行时没有给出相同的错误。看起来等号又回到了仅用作赋值运算符的状态。

我试图在没有完全理解的情况下接受这种行为作为事实,并试图进一步学习语言。但由于模式匹配是 Elixir 的核心机制之一,我不断地锁定并觉得我应该回到这个最初的问题。在我完全理解“=”符号到底发生了什么以及逻辑是什么之前,我不会再进一步​​。


等号的意思是:“尝试拟合表达式的值在右边shape在左边并相应地赋值”。所以左边和右边是不同的,你不能切换它们。在右边,所有变量都必须绑定,因为它是一个表达式。在左边,即使你使用的变量是已经绑定的它们将被重新分配。

首先,在右侧你可以有任何你想要的表达:

{:error, :enoent} = File.open("foo")

但左侧不能有表达式:

iex(1)> File.open("foo") = {:error, :enoent}
** (CompileError) iex:1: cannot invoke remote function File.open/1 inside match

的情况下

y=3
5=y # y gets evaluated to 3 and then you pattern match 3=5

它失败了。但你可以做

y=3
y=5 # y gets reassigned.

在左侧,您只能有“形状”,它可以是任意嵌套的数据结构:

[a, b, %{"a" => {1, c}}] = [1, 2, %{"a" => {1, 2}]
# c is now assigned value of 2

因此,模式匹配用于解构数据或断言某些条件,例如

case File.open("foo") do
  {:ok, contents} -> enjoy_the_file(contents)
  {:error, reason} -> print_error(reason)
end

或者,如果您想断言数据库中只有一个实体,而不是首先断言它存在,然后只有一个可以进行模式匹配:

[entity] = Repo.all(query)

如果要断言列表中的第一个值是 1,可以进行模式匹配:

[1 | rest] = [1, 2, 3]

模式匹配时存在一些问题。例如这个:

%{} = %{a: "a"}

会匹配,因为左侧的形状是地图,您不需要任何其他内容,因此任何地图都会匹配。但是这不会匹配:

%{a: "a"} = %{}

因为左边的形状说“给我一张带有原子键的地图:a.

如果你想匹配一个变量,你可以这样写:

a = 1
{a, b} = {2, 3}

但这将分配a值 2。相反,您需要使用 pin 运算符:

a = 1
{^a, b} = {2, 3} #match fails

我在这个答案中写了更多关于 pin 运算符的内容:“pin”运算符的用途是什么?Elixir 变量是否可变?

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

Elixir 中等号的确切含义是什么? 的相关文章

  • Scala - 以函数方式修改字符串

    我刚刚开始使用 Scala 因此开始以更实用的方式做事 只是想知道是否有一种更实用的方法来实现如下所示的功能 def expand exp String String var result exp for k v lt libMap res
  • 函数数组的替代方案?

    我正在编写一个应用程序 php 它需要一个很长的列表相似但不同的功能 由一组按键调用 functions do this gt function does this do that gt function does that etc 我选择
  • 计算函数合理性的算法/蒙特卡罗方法

    我正在编写一个程序 尝试复制本文开头讨论的算法 http www stat stanford edu cgates PERSI papers MCMCRev pdf http www stat stanford edu cgates PER
  • Ecto 和 Elixir 的默认日期时间

    我今天刚刚开始使用 Elixir 和 Phoenix 我正在尝试添加 Ecto 作为映射器 但我在使用时间时遇到了一些问题 这是我的模型 schema users do field name string field email strin
  • 哪种函数式编程语言在 Eclipse 中提供最好的支持?

    作为一项练习 我的团队正在考虑学习函数式编程 选择一种语言的因素之一是它在 Eclipse 中的支持 任何带有 Eclipse 插件的语言都可以 但是哪种语言提供最好的免费插件呢 额外问题 该语言的最佳在线 书籍教程 我不知道它是否是最好的
  • Dialyzer 无法识别使用多态类型的函数中的错误

    背景 我正在尝试使用透析器进行多态打字 作为一个例子 我正在使用著名的Option类型 又名 Maybe Monad 现在在许多其他语言中都很流行 defmodule Test do type option t some t nothing
  • 如何在函数式编程中为AST节点生成稳定的id?

    我想将一个特定的 AST 节点替换为另一个节点 并且这个替换的节点是由交互式用户输入指定的 在非函数式编程中 可以使用可变数据结构 并且每个AST节点都有一个对象引用 因此当我需要引用特定节点时 我可以使用这个引用 但在函数式编程中 使用I
  • 未确定的泛型类型在 ghci 的运行时中如何表示

    我很清楚通用函数和通用数据类型 在泛型类型中 data SB forall x show x gt SB x instance Show SB where show SB x show x 所以对于任何给定类型x 如果它有一个签名Show
  • 如何实现 hamcrest 匹配器

    我想运行这行代码 assertThat contextPin get equalTo pinPage getPinObjFromUi 但我想打印到日志中以提供信息 这意味着我可以知道哪些字段不相等 所以我想到了实现一个匹配器 我用谷歌搜索过
  • D 中的特征可以用于类型类吗?

    我是 D 新手 我正在寻找一种使用类似 Haskell 的类型类进行编程的好方法 例如D 中的函子 幺半群等 Tango 或 Phobos 中是否实现了类似的功能 我听说过可以对某些属性进行编译时类型检查的特征 它们可以用于类型类吗 我尝试
  • 为什么 x = x +1 在 Elixir 中有效?

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老
  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 什么是(函数式)反应式编程?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 我读过维基百科的文章反应式编程 http en wikipedia org wiki Reac
  • 如何在 Elixir 中将字符串转换为 Ecto.DateTime?

    我需要将包含有效 UTC 时间的字符串转换为Ecto DateTime一个 稍后我会将其以正确的格式插入到我的数据库中 我尝试过使用Ecto DateTime cast date 方法但似乎不起作用 该字符串是Sat Aug 04 11 4
  • 如何在 Perl 中以函数式风格进行编码?

    你如何 have a sub返回一个sub or 将文本作为代码执行 in Perl 另外 如何拥有匿名函数存储状态 子返回子作为coderef example 1 return a sub that is defined inline s
  • OCaml 作为 C 库,hello world 示例

    我希望通过 C 调用 OCaml 代码 方法是将 OCaml 编译为包含 C 接口的静态或共享库 这一页 https caml inria fr pub docs manual ocaml intfc html似乎解释了如何为 OCaml
  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数
  • 减少/折叠幺半群列表,但减少器返回任一

    我发现自己遇到过几次这样的情况 我有一个减速器 组合 fn 如下所示 def combiner a String b String Either String String a b asRight String 它是一个虚拟实现 但 fn
  • Phoenix 中的 web/static 和 priv/static 有什么区别?

    我对长生不老药和凤凰是新手 现在我在凤凰城的静态资产方面遇到了麻烦 我想在我的页面中添加一个js文件 我在我的模板中添加以下代码 js test js gt gt 然后创建一个js文件web static js test js 但是 我收到
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为

随机推荐

  • 如何在 iOS 中更改 cordova-camera-plugin 语言?

    我想改变cordova camera plugin语言 显然 它取决于多种因素 我的开发环境是 Visual Studio 2015 中的 Tools for Cordova 这不太重要 但我在我的应用程序中使用 Ionic 框架 我们在运
  • 粗体标题边框

    我尝试做 UIManager getDefaults put TitledBorder font Font BOLD contentPanel setBorder new TitledBorder Client Downloader 但这并
  • 在另一个 div 上使用滚轮时滚动一个 div [重复]

    这个问题在这里已经有答案了 假设我有 2 个并排的 div 两者都是 400px x 400px 并且溢出设置为自动 里面的内容高度超过400px所以有垂直滚动条 当鼠标悬停在左侧的 div 上并且用户使用鼠标滚轮滚动时 我希望另一个 di
  • 如何在shell中获取SVN头版本号?

    我在命令行中使用 svn 如何在命令行中获取头版本号 我需要这个号码 不仅仅是为了查看信息 我想用这个数字来自动构建我的项目 正如下面的评论提到的 这可以通过在较新的 SVN 客户端中使用以下命令来实现 svn info rHEAD sho
  • UIButton 在 iOS7 中点击时不显示突出显示

    我看过大量有关类似事物的帖子 但没有一个完全匹配或解决这个问题 从 iOS 7 开始 每当我添加UIButton to a UITableViewCell或者甚至对于页脚视图来说 它工作得 很好 这意味着它接收到目标操作 但它不会显示当您点
  • 如何在 Perl 中对 HTTP GET 查询字符串进行编码?

    这个问题有点相关在 Perl 中发出 HTTP GET 请求的最简单方法是什么 在通过以下方式提出请求之前LWP Simple我有一个需要序列化 转义的查询字符串组件的哈希值 对查询字符串进行编码的最佳方法是什么 它应该考虑空格以及有效 U
  • 在 GCC 中指定代码的节名称

    我知道 GCC 让你使用 attribute section mysection 函数定义指定将代码放入哪个部分 我有一堆代码需要放入特定部分 并且必须用它来装饰每个函数是相当乏味的 有没有办法在命令行上全局指定代码放置在哪个部分的同时编译
  • 如何指定AddIn进程名称?

    我正在使用 Microsoft AddIn Framework 加载 AddIn 程序集 我在自己的进程中运行它们 以便将它们与服务分开 我不喜欢每个 AddIn 进程在任务管理器中显示为 AddInProcess32 exe 使用进程隔离
  • git - 如何从我当前的提交中删除太大的文件[重复]

    这个问题在这里已经有答案了 当我执行以下操作时 git add git commit m msg git push origin develop 我收到以下错误 Counting objects 25 done Delta compress
  • 在node/express + ejs中将对象传递给客户端?

    我有一个相当大的对象 需要将其传递给客户端脚本中的函数 我尝试过使用 JSON stringify 但这种方法遇到了一些问题 主要与性能相关 在ejs中可以做这样的事情吗 app get load function req res var
  • C++挂钩到不同的应用程序,如何从进程ID中查找线程ID?

    我想向应用程序添加一个钩子 我在用SetWindowsHookEx我可以创建一个系统范围的挂钩 但我想为特定应用程序创建一个挂钩 我需要目标应用程序的线程 ID 才能挂钩它 我知道窗口的标题 我知道 exe 名称 从这些我可以获取窗口句柄和
  • 如何在Python中使用不带0x的hex()?

    The hex python中的函数 放置前导字符0x在号码前面 有没有办法告诉它不要放它们 所以0xfa230将fa230 代码是 import fileinput f open hexa w for line in fileinput
  • SQLite 长到宽格式?

    我想知道是否有一种规范的方法可以在 SQLite 中将数据从长格式转换为宽格式 该操作通常在关系数据库领域吗 我试着跟随这个例子对于 MySQL 但我猜 SQLite 没有相同的 IF 结构 谢谢 IF是一个非标准的 MySQL 扩展 最好
  • 带和不带箭头的 UML 聚合

    我一直认为 UML 聚合被定义为路径开头的黑色 实心 菱形 结尾处没有箭头 MyA lt gt MyB 今天我遇到了这样的符号 lt gt gt 右端有一个明确的箭头 所以我在 UML 2 4 规范中查找 实际上找到了两个版本的参考资料 我
  • 更改 R Shiny 中 selectInput 的背景颜色

    我的示例代码 library shiny server lt function input output ui lt fluidPage br selectInput select1 Choose c Alt1 1 Alt1 2 selec
  • 同步对易失性字段的写访问(廉价读写块)

    假设我有以下课程将被大量阅读 但只是偶尔写入 它将在多线程 Web 应用程序中使用 因此它需要是线程安全的 public class Foo private volatile String foo public String getFoo
  • 在Java中,如何同时遍历两个列表?

    E g for String str list1 for String str list2 假设我们确信list1 size equals list2 size 如何一次性遍历这两个列表for陈述 也许像for String str1 li
  • 类型错误:无法读取未定义的属性“push”,JavaScript

    我正在这个 Angular 项目中工作 用户提交评论表单 新评论将添加到已发布的评论中 这是我的代码 controller productCtrl function scope http routeParams Page scope pro
  • 是否可以在 Android 中将 Firebase Messaging 与 Google Analytics 结合使用?

    我开始在 Android 应用程序中使用 Firebase Cloud Messaging 现在我尝试将 Google Analytics 不是 Firebase 分析 添加到同一应用程序中 问题是 在为 Analytics 创建 goog
  • Elixir 中等号的确切含义是什么?

    我不明白 Elixir 中的等号到底意味着什么 不清楚的是它看起来像是赋值和模式匹配操作的混合 iex 1 gt x 4 4 iex 2 gt y 5 5 iex 3 gt 3 y MatchError no match of right