在 Elixir 中打开模块?

2023-12-26

Ruby 有开放类,非常方便(尽管受到一些人的谩骂),而 Elixir 大量借鉴了 Ruby,所以我希望 Elixir 允许我重新打开一个模块并在关闭它后向其中添加宏,但这在我尝试的方式。有什么方法可以做到这一点吗? Elixir 中是否提供此功能?

为了具体说明这一点,让我们以 Chris McCord 的元编程 Elixir 为例:

defmodule Math do
  defmacro say({:+, _, [lhs, rhs]}) do 
    quote do
      lhs = unquote(lhs)
      rhs = unquote(rhs)
      result = lhs + rhs
      IO.puts "#{lhs} plus #{rhs} is #{result}"
      result
    end
  end

  defmacro say({:*, _, [lhs, rhs]}) do 
    quote do
      lhs = unquote(lhs)
      rhs = unquote(rhs)
      result = lhs * rhs
      IO.puts "#{lhs} times #{rhs} is #{result}" 
      result
    end 
  end
end

如果我然后添加一个宏来进行减法

defmodule Math do
  defmacro say({:-, _, [lhs, rhs]}) do
    quote do
      lhs    = unquote(lhs)
      rhs    = unquote(rhs)
      result = lhs - rhs
      IO.puts "#{lhs} minus #{rhs} is #{result}"
      result
    end
  end
end

我收到一条警告,提示我正在重新定义数学模块,并且最初定义的宏失败。显然我的方法不是正确的,但是还有另一种方法可以实现相同的目标吗?


您无法重新打开模块。由于 Elixir 是一种编译语言,因此从源代码到可执行表示的方式是单向的。改变代码的机制(例如宏)在编译期间进行评估。然而,Elixir 允许您进行热代码交换,即。 e.您可以在运行时替换已编译的模块。

我认为这有一些有趣的含义。您能够在运行时更改程序 - 实际上,您可以控制源代码,因此您可以交换模块的各个部分而不更改其他部分。尽管如此,我还是喜欢将一切都集中在一个地方的想法。在 Elixir 中,当您查看模块时,您会确切地知道自己拥有什么*。

因此,如果这个问题只是关于方便的开发工作流程,那么您最接近 Ruby 向类添加方法的能力就是将模块保存在文件中,并在使用时从 iex 重新编译它。


* 严格来说,你可能not只需查看模块即可准确了解正在运行的代码。当您使用协议时,您还需要查看所有协议实现,这些实现可能分散在您的代码库中,或者更糟糕的是,它们可能分布在多个应用程序中。

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

在 Elixir 中打开模块? 的相关文章

  • 函数 nil.id/0 未定义或私有 - Elixir

    我正在尝试使用监护人身份验证来测试用户 ID 是否等于资源 ID 如果没有当前令牌 并且我尝试访问正在检查令牌的网址 则会收到此错误function nil id 0 is undefined or private 我来自红宝石背景 我不知
  • 在 Elixir 中引用管道值

    我想计算字符串中单词出现的次数 实现是有问题的 但让我们用它来演示我的问题 def count sentence do words String split sentence occurrences Enum map words fn w
  • Phoenix 框架中的可选路由参数

    我已经开始自学凤凰框架 http www phoenixframework org 他们的文档非常好 然而 在指定可选路由参数时 我遇到了障碍 这Phoenix 框架路由文档 http www phoenixframework org do
  • 在 Elixir 中测试异步代码

    我想测试一个正在使用的函数Task async 为了让我的测试通过 我需要让它在断言之前休眠 100 毫秒 否则测试进程会在执行异步任务之前被终止 有没有更好的办法 编辑 添加代码示例 我想测试的代码 大致 def search param
  • Ecto 与某种情况的关联

    假设我有两个模型 Post and Comment评论模型可以是两种类型中的一种 normal and fancy由列定义type in the comments table 现在我想在我的上添加 2 个关联Post模型 其中一个指的是花哨
  • 具有默认参数的函数的 Elixir 类型规范

    如何为接受一个具有默认值的参数的函数编写类型规范 像下面这样 def foo bar 10 do bar end 会是这样吗 spec foo integer integer 或者会是什么 谢谢 Yes 我想补充一点 如果您的问题是具有默认
  • 当我尝试保留对象时,Phoenix 框架向我发送“名为“_toDoListMaster_key”的 cookie 超过 4096 字节的最大大小”

    一切都在标题中 当我在浏览器中查找 cookie 时 我得到 toDoListMaster key SFMyNTY g3QAAABbQAAAAtfY3NyZl90b2tlbmQAA25pbA ehmC7o9 KRHqClwacE38DX1J
  • 从列表中获取随机元素

    我基本上是在寻找 Ruby 的 Elixir 等价物Array sample http ruby doc org core 2 2 0 Array html sample method 可以让我这样做的东西 list 1 2 3 4 5 6
  • 有什么方法可以在 Phoenix 中定义自定义路线吗?

    假设我想创建一个resources通过添加一些自定义操作 rails 中的类似物是 resources tasks do member do get implement end end 这不仅会返回 7 条标准路线 还会返回 1 条新路线
  • 如何在 Phoenix 框架中有选择地禁用 CSRF 检查

    我正在尝试创建一个指向我的网站的 Facebook 页面选项卡 Facebook 向我网站的 url 发送 HTTP POST 请求 这里的问题是服务器有内置的 CSRF 检查 它返回以下错误 Plug CSRFProtection Inv
  • 基于结构类型更改的分块列表

    我有一个列表 我想根据从结构类型 B 到 A 的转换来分块 例如 我有以下内容 iex 1 gt defmodule A do defstruct module A iex 2 gt defmodule B do defstruct mod
  • 在 Elixir 中部署时更改后端/模块?

    如何实现一个可替换的后端 或基本上任何部分或模块 以便可以在 Elixir 中的配置 部署时进行替换 我的具体情况是一个简单的网络应用程序 在本例中使用 Phoenix 但我猜这个问题也适用于其他情况 我有一个非常简单的后端 使用Agent
  • 有没有一种简单的方法可以查看 Elixir 宏扩展为什么?

    在过去 18 个月左右的时间里 Elixir 一直是我的首选语言 但有时我发现 无魔法 口头禅 特别是在 Phoenix 与 Rails 中引用 和宏的使用之间存在紧张关系 虽然我现在在使用没有宏的语言时会怀念宏 但我仍然希望能更容易地看到
  • 如何使用 Ecto 的时间戳向现有表添加时间戳?

    Since inserted at and updated at不可能是null这是行不通的 def change do alter table channels do timestamps end end Postgrex Error E
  • 如何调试eex模板和@变量?

    我有这个模板 div class alert alert danger p Oops something went wrong Please check the errors below p div 如何在 IEx 控制台中显示 chang
  • 使 Elixir 应用程序在源代码更改时重新编译并重新加载

    如何在每次修改源代码时自动重新编译并重新加载我的 iex mix 应用程序 如果 iex mix 组合无法做到这一点 那么最简单的替代方案是什么 我已经检查了phoenix的重新加载方法 对于我的小型测试项目来说 它似乎并不容易实现 我也知
  • “!”、“?”、“_”和“.”是什么意思? Elixir 中的语法

    我需要帮助理解 Elixir 中的以下语法 and 这些语法在 Elixir 的功能中起什么作用 例如Repo get 我不确定它们是否只是函数名称 或者有一个角色 虽然我知道 用于调用匿名函数 和 对于任何或可变的 失败时引发异常的函数约
  • Phoenix:订购查询集

    我 一个菜鸟 为了好玩而玩弄 Phoenix 框架并构建一个小型 Twitter 克隆 我一切正常 但是 我想按updated at字段 升序 正如您从 tweet controller 中看到的 我尝试过使用 order by 子句 但这
  • 可以用宏获取评论吗?

    我试图解析一些代码并重新格式化它们 但似乎引用只会忽略注释 有什么办法可以实现这一点吗 我想我必须深入 erlang 方面 不 您无法在宏内获取代码注释 它们永远不会成为 AST 的一部分 并且仍然被丢弃在 Elixir 的标记器中
  • 分配 @changeset 在 eex 模板中不可用

    我正在尝试学习包含 Ecto Model 的 Phoenix 表单系统 但我遇到了一个无法通过的问题 我创建了一个表格 div class jumbotron div

随机推荐

  • Linq动态在哪里算?

    是否可以在 where 中使用列表 我想要这样的东西 public class Customer string FirtsName string LastName int Number 我想使用复选框来过滤客户 如果我选择名字和号码 那么将
  • (heroku) 错误 R10(启动超时)-> Web 进程未能在启动后 60 秒内绑定到 $PORT

    我是一名初级 Discord 机器人开发人员 希望在 Heroku 上 24 7 托管他的 heroku 机器人 大约之后 部署 1 分钟后 出现错误 2020 12 28T11 40 54 000493 00 00 heroku web
  • Flutter Firebase 存储无法工作:没有默认存储桶

    我正在尝试上传一个pdf file to Firebase Storage使用此功能 static Future
  • Django ModelForms:将ManyToMany字段显示为单选

    在 Django 应用程序中 我有一个模型 Bet 其中包含与 Django 用户模型的 ManyToMany 关系 class Bet models Model participants models ManyToManyField Us
  • 触发AWS代码构建时指定文件路径

    我已经创建了 AWS codebuild 管道 每当我推送到主分支时它就会自动触发 现在 我只想在 Dockerfile 中发生更改时触发它 以下是我的项目结构 casestudy gt Docker gt Dockerfile gt In
  • “图标路径无效” - Apple App Store 团队返回错误

    这是我第一次向 App Store 提交内容 遇到了很多问题 首先 我要说的是 该应用程序是用PhoneGap 使用科尔多瓦1 9 0框架 它的 Web 应用程序端很好 验证了 W3 并且在浏览器中完美运行 在无法手动修复问题后 我从头开始
  • 如何在 PlayFramework 中的 Json Reads 中添加自定义 ValidationError

    我正在使用 play Reads 验证助手 我想在 json 异常的情况下显示一些自定义消息 例如 长度是最小值然后指定或给定的电子邮件无效 我知道 play 显示这样的错误消息error minLength但我想显示一条合理的消息 例如请
  • 在 Mayavi 中锁定相机

    我正在尝试使用 mayavi 中的一系列数据文件制作动画 不幸的是 我注意到相机没有锁定 它正在变焦和缩小 我认为发生这种情况是因为我的网格的 Z 分量正在变化 并且 Mayavi 正在尝试重新计算比例 How can I fix it i
  • 使用每个用户数据的单独密钥加密 SQL Server Azure 数据库中的数据

    我正在尝试创建基于 Azure SQL 数据库后端的服务 该服务将是多租户的 并将包含来自多个 客户端 可能有数十万 的高度敏感信息 这些信息必须彼此严格隔离并严格防止数据泄漏 按设计 使用如此多的单独数据库是不可行的 因为会有很多客户 但
  • 将背景颜色的下边缘设为另一种颜色

    我想要我的底部background color成为另一种颜色 我确信这涉及到linear gradient 但不确定如何实施 示例代码 background height 100px width 200px background color
  • 在python多处理中修改对象

    我有大量自定义对象 需要对其执行独立 可并行 任务 包括修改对象参数 我尝试过使用 Manager dict 和 sharedmem ory 但两者都不起作用 例如 import numpy as np import multiproces
  • 用 Celery 组合链、组和块

    我想使用 Celery 作为 URL 抓取器 我有一个 Url 列表 我必须对每个 URL 执行 HTTP 请求并将结果写入文件中 整个列表使用同一文件 我的第一个想法是让 Celery 调用的任务中的这段代码击败所有n分钟 app tas
  • AzureADB2C.UI - 登录后将用户重定向到页面

    我在 NET Core Web 应用程序上使用 AzureADB2C UI 但我不确定如何将用户重定向到自定义页面 ej Customers Index他登录后 这基本上就是我以前使用时的情况SessionController但由于我使用的
  • 如何强制用户在 GIT 中使用小写电子邮件地址

    我正在寻找确认提交者的电子邮件地址是否为小写的可能性 以避免出现以下问题this https serverfault com questions 12373 how do i edit gits history to correct an
  • 使用新的 TextInputLayout 进行 EditText 的渲染问题

    我正在尝试设置新的 support desing 库 为旧的 Android 版本提供一些棒棒糖视觉效果 在本例中 我尝试为 edittext 添加浮动标签 这是通过 widget TextInputLayout 完成的 为此 我遵循了谷歌
  • AS3中void的意义是什么

    这里有一个简单的问题 当 void 跟随 AS3 中的函数时 它在做什么 public function sayGoodbye void trace Goodbye from MySubClass voidtype 向编译器指示您编写的函数
  • 发出 HTTP 请求时出现 Access-Control-Allow-Origin 错误

    您好 我正在通过 OAuth 2 0 对用户进行身份验证 并且收到 Access Control Allow Origin 错误 XMLHttpRequest cannot load https www box com api oauth2
  • java中可以进行“原子”中断检查吗?

    例如 如果在 Java 中使用以下带有中断的 习语 从这个答案 https stackoverflow com questions 14145787 how to safely interrupt a thread with critial
  • 从 Telegram 的机器人 API 获取投票结果和用户选择

    我想知道是否有办法使用机器人 API 查找用户对非匿名投票的回复 我可以获得投票数 但我想知道特定用户的实际选择 是的 对于非匿名民意调查 当用户投票时您会收到更新 这些是更新update poll answer see https cor
  • 在 Elixir 中打开模块?

    Ruby 有开放类 非常方便 尽管受到一些人的谩骂 而 Elixir 大量借鉴了 Ruby 所以我希望 Elixir 允许我重新打开一个模块并在关闭它后向其中添加宏 但这在我尝试的方式 有什么方法可以做到这一点吗 Elixir 中是否提供此