Elixir:修改模块属性值

2024-02-21

是否有可能实现以下行为,其中尝试更改模块属性的值以改变模块方法的行为?

defmodule Adder do
  @num_to_add 10
  def addTo(input), do: input + @num_to_add
end

IO.inspect Adder.addTo(5)  # Prints 15

Adder.num_to_add = 20

IO.inspect Adder.addTo(5)  # Expect it to print 25

它抛出以下错误

** (CompileError) hello.exs:8: cannot invoke remote function Adder.num_to_add/0 inside match
    (elixir) src/elixir_clauses.erl:26: :elixir_clauses.match/3

如果这是不可能的(因为 Elixir 中的所有内容都应该是不可变的),是否有任何 Elixir 方法可以实现类似的行为。


这是不可能的,因为属性仅存在于该特定模块的编译之前。编译模块时,所有属性都会被内联并被遗忘,因此当您能够从该模块调用函数时,就不再可能修改属性。

这段代码应该更清楚地显示这一点:

defmodule Test do
  @attr 1
  @attr 2

  def attr do
    @attr
  end
end

IO.inspect Test.attr # => 2
Module.put_attribute(Test, :attr, 3)
IO.inspect Test.attr # => ** (ArgumentError) could not call put_attribute on module Test because it was already compiled

请注意,您可以在模块尚未编译时(例如在模块主体中)更改属性的值,只需再次设置它,就像我在设置时所做的那样@attr to 2.

顺便说一句,您似乎想要实现的目标可以通过Agent:

defmodule Storage do
  def start_link do
    Agent.start_link(fn -> 10 end, name: __MODULE__)
  end

  def add_to(input) do
    Agent.get_and_update(__MODULE__, fn (x) -> {x + input, x + input} end)
  end
end

Storage.start_link
IO.inspect Storage.add_to(5) # => 15
IO.inspect Storage.add_to(5) # => 20

Elixir 中的一个好的经验法则是,每当您需要跟踪某些可变状态时,您都需要有一个进程来包装该状态。

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

Elixir:修改模块属性值 的相关文章

  • Elixir 向所有订阅者直播

    我正在尝试在 Elixir 中实现一个无线电服务器 一个进程始终在工作并读取文件 mp3 并发布到主题 radio 当前用于测试目的 当它完成时会重新开始 每个连接订阅主题 radio 我不明白如何将块发送到所有订阅的连接 连接在 2 或
  • Elixir Phoenix 内联 CSS 用于发送电子邮件

    我正在使用凤凰城的 mailgun 库发送电子邮件 事实证明 当我查看 Gmail 帐户中的电子邮件时 它已被删除所有 css 类和外部 css 文件的链接 Mailgun 建议使用 css 内联库http blog mailgun com
  • elixir 中嵌套列表和结构的 get_in

    我有一个结构 s a Bla b c 我要拿c从中获得价值 我正在尝试做 get in s a b 但它并不是为了从结构中获取价值而设计的 有没有类似的东西可以让我获取c从带有嵌套结构的列表中 As 有记录的 https hexdocs p
  • Elixir 变量真的是不可变的吗?

    在 Dave Thomas 的 Programming Elixir 一书中 他指出 Elixir 强制执行不可变数据 并接着说道 在 Elixir 中 一旦变量引用了诸如 1 2 3 之类的列表 您就知道它将始终引用相同的值 直到您重新绑
  • 修复协议 Ecto.Queryable 未实现错误

    我刚开始使用 Ecto 和 Elixir 并且遇到了一个无法解释的错误 我的代码看起来就像 Ecto 自述文件中的示例 这是我的 Ecto 模型和查询模块 defmodule Registration do use Ecto Model s
  • 从列表中获取随机元素

    我基本上是在寻找 Ruby 的 Elixir 等价物Array sample http ruby doc org core 2 2 0 Array html sample method 可以让我这样做的东西 list 1 2 3 4 5 6
  • Elixir/erlang 在哪里适合微服务方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近 我一直在使用 docker compose 进行一些实验 以便部署多个协作微服务 我可以看到微服务提供的许多好处 而且现在有一个
  • UndefinedFunctionError phoenix Elixir 新项目

    全新安装 Phoenix 后 我尝试触发一个新项目 当我尝试运行服务器时 我遇到了 Unchecked dependencies for environment dev gettext Hex package the dependency
  • 无法从 powershell 运行 Elixir 应用程序

    当我打字时iex S mix在 PowerShell 中我收到此错误 Invoke Expression A positional parameter cannot be found that accepts argument mix At
  • 为什么我收到#Ecto.Association.NotLoaded?

    我有团队 每个团队都有用户 因此有一个连接表将用户链接到团队 因为它是多对多关系 这是我的模型 defmodule App Team do use App Web model schema teams do field owner id i
  • 基于结构类型更改的分块列表

    我有一个列表 我想根据从结构类型 B 到 A 的转换来分块 例如 我有以下内容 iex 1 gt defmodule A do defstruct module A iex 2 gt defmodule B do defstruct mod
  • 为什么 Supervisor.start_child 不起作用

    我是 Elixir 的初学者 我有一个应用程序在 application ex 中启动一个自定义主管 代码 defmodule MyApp do use Application def start type args do import S
  • 如何将 Elixir 库加载到 iex 中而不将其添加到项目的 mix.exs deps 中?

    我想尝试 Poison json 模块而不创建混合项目 如何安装它并通过导入使其在 iex 中可用 我已经能够将它添加到项目中 然后在进入项目目录并使用 iex S mix 后使用它 tbrowne LILJEN code elixirTr
  • 使 Elixir 应用程序在源代码更改时重新编译并重新加载

    如何在每次修改源代码时自动重新编译并重新加载我的 iex mix 应用程序 如果 iex mix 组合无法做到这一点 那么最简单的替代方案是什么 我已经检查了phoenix的重新加载方法 对于我的小型测试项目来说 它似乎并不容易实现 我也知
  • 当作为函数参数传递时,elixir 是否会生成映射的副本?

    换句话说 我想知道在 Elixir 中 映射是通过值还是通过引用传递给函数 鉴于 Elixir 的无副作用原则 我怀疑这是有价值的 但是大地图不会造成巨大的重复效率低下吗 在此先感谢您的帮助 由于 Elixir 中的所有术语都是不可变的 因
  • “!”、“?”、“_”和“.”是什么意思? Elixir 中的语法

    我需要帮助理解 Elixir 中的以下语法 and 这些语法在 Elixir 的功能中起什么作用 例如Repo get 我不确定它们是否只是函数名称 或者有一个角色 虽然我知道 用于调用匿名函数 和 对于任何或可变的 失败时引发异常的函数约
  • 当您在地图上进行操作时,Elixir 中是否会保留键和值的顺序?

    假设我在 Elixir 中有一张地图 m a gt 1 b gt 2 c gt 3 如果我打电话Map values m 我能保证返回值永远是 1 2 3 按这个顺序而不是说 3 1 2 这是我从文档中不清楚的一件事 经过一些初步测试 我认
  • Elixir 中的递归和匿名函数

    我正在尝试定义一个匿名函数来执行点积 我可以将其编码为私有函数 没有任何问题 但我正在努力解决匿名函数语法 我知道我可以以不同的方式实现这一点 但我试图了解如何使用模式匹配和递归来定义匿名函数 这是我当前的实现 dot fn i input
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 创建新的保护子句

    在 Elixir 中 我将如何为函数创建新的保护子句 显然 我已经看到你不能只调用 a 中的任何函数when声明 但如果能够做这样的事情那就太好了 defmodule Player do def play card player do de

随机推荐

  • 选定的文本背景颜色

    当我使用任何网站时 我看到选定的文本背景颜色显示蓝色或根据我们的操作系统主题 我可以更改此选定的文本背景颜色吗 您可以使用这种风格 这适用于除 IE 之外的所有主要浏览器
  • Python 3.3 无法导入 Crypt

    当我在命令行中输入 import Crypt 时 它会显示 gt gt gt import crypt Traceback most recent call last File
  • 如何编写正则表达式“行”包含字符串[重复]

    这个问题在这里已经有答案了 我有字符串 one line second line magic line foo third line 如何仅使用关键字将整行与 foo 匹配foo 所以 我可以匹配foo using foo g 但我不知道如
  • 如何在运行时获取测试环境

    我想检查代码是否正在运行go test 这样我就可以进行一些配置 有什么功能可以做到这一点吗 喜欢 运行时 IsBeingTested 只需指定您在 test 中运行测试init 例如 在 pkg go 中 package pkg var
  • 从 Chrome 94+ 与不支持 HTTPS 的 LAN 设备通过网络应用程序进行通信

    我们开发了一个 Web 应用程序 通过发送 POST 请求与连接到同一 LAN 的打印机进行通信 此类打印机有一个在端口 80 上打开的服务器 该服务器接受包含命令的 XML 无法从通过 HTTPS 加载的页面与网络设备进行通信 因此 我们
  • 调用 SaveChanges() 时排除更新属性

    似乎有两种方法可以使用 附加 方法来更新断开连接的实体框架实体 方法一是简单地将断开连接的实体的状态设置为已修改 myDbContext Dogs Attach dog myDbContext Entry dog State EntityS
  • 如何在C#中枚举音频输出设备

    我想知道如何获取计算机上已安装的音频输出设备 waveOut 的列表 操作系统 Windows XP Vista 7 框架 Net 3 5 语言 c 迭代此列表时 我想获取每个设备的标识符 制造商等信息 有什么提示吗 下面是使用 WMI 参
  • JSP 组件创建

    创建 JSP 页面时 我经常喜欢的一件事是能够执行以下操作
  • Gulp 伊斯坦布尔完整覆盖报告

    我正在使用 gulp istanbul 通过 Gulp 生成 JavaScript 单元测试覆盖率报告 有没有办法配置 Istanbul 以生成我的 gulp 流中所有 JS 文件的完整覆盖率报告 而不仅仅是测试用例涉及的文件 我正在开发一
  • main 函数不返回任何内容。为什么? [复制]

    这个问题在这里已经有答案了 对于 C C main 必须始终返回一个整数 零表示成功 非零表示失败 我可以理解这一点 因为程序运行时它成为一个进程 每个进程都应该有一个退出状态 我们通过执行 echo 获得退出状态 进程结束后从 shell
  • 如何在 git 中找到 origin/master 的位置,以及如何更改它?

    我是 Git 新手 我最近将一个 Rails 项目从 Subversion 迁移到了 Git 我按照这里的教程进行操作 http www simplisticcomplexity com 2008 03 05 cleanly migrate
  • 如何创建像所附照片一样的用户界面

    谁能告诉我这个照片效果叫什么 我想知道如何为这个附加的图像效果创建一个适配器 编辑 这是Android市场的示例照片 我想创建一个这样的布局 我想这应该覆盖 GridView 适配器 肖像截图 风景截图 另一张截图 我非常抱歉我的问题对你们
  • 如何使用 Google Colab 安装 vizdoom?

    我正在关注本教程 https github com simoninithomas Deep reinforcement learning Course blob master Policy 20Gradients Doom Doom 20R
  • Matlab 箱线图属性

    I m trying to plot this box plot like this 我尝试了这段代码 boxplot randn 10 98 notch on set 0 DefaultAxesFontName Cambria Math
  • Heroku Rails Net::HTTP: OpenSSL::SSL::SSLError: SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B: 证书验证失败

    我有一个在 Heroku 服务器上运行的 Rails 应用程序 但我在使用 Net HTTP over HTTPS 与外部服务器通信时遇到问题 每当我尝试时收到的错误POST通过 HTTPS 到外部专有 API 的方法是 OpenSSL S
  • 为什么我的小型大写字体变体 CSS 类被忽略?

    我添加了这个 CSS 类 beanies font variant small caps 我从几个地方调用它 再加上另一个类 以这种方式尝试 p class coolPools beanies LICENSE 764014 p 和这个 h3
  • 列数会影响MYSQL的速度吗?

    我有一张桌子 我只需要运行一种类型的查询 在第 1 列中查找给定的唯一值 然后获取前 3 列 现在 如果我在表中添加额外的几列以进行基本的 数据存储 会对速度产生多大影响 我知道我应该使用一个单独的表 但假设我仅限于只有 1 个表 所以唯一
  • 将 MapReduce 作业的输出记录到文本文件

    我一直在使用这个 jobclient monitorandprintjob 方法将映射缩减作业的输出打印到控制台 我的用法是这样的 job client monitorAndPrintJob job conf job client getJ
  • python 通过通配符复制文件

    我正在学习 python python 3 我可以将 1 个文件复制到新目录 通过做这个 import shutil shutil copyfile C test test txt C lol test txt 我现在想做的是将所有 txt
  • Elixir:修改模块属性值

    是否有可能实现以下行为 其中尝试更改模块属性的值以改变模块方法的行为 defmodule Adder do num to add 10 def addTo input do input num to add end IO inspect A