使用 Scala 宏或反射实例化类

2024-05-22

在我的 scala 代码中,我希望能够实例化一个新类。例如,假设我有以下代码:

class Foo { def foo=10 }
trait Bar { val bar=20 }

理想情况下,我希望能够做类似的事情:

def newInstance[A <: Foo] = { new A with Bar }
newInstance[Foo]

但是,这当然行不通。我尝试使用反射来实例化一个类,但似乎我只能实例化一个新类(而不能与特征混合)。我认为使用宏可以完成这项工作,但我什至不知道从哪里开始。

我想做的就像下面的 Ruby 代码:

class SomeClass
  def create
    self.class.new
  end
end

class Other < SomeClass
end

Other.new.create # <- this returns a new Other instance

是否可以?


用宏:

import scala.language.experimental.macros
import scala.reflect.macros.Context

object MacroExample {
  def newInstance[A <: Foo]: A with Bar = macro newInstance_impl[A]

  def newInstance_impl[A <: Foo](c: Context)(implicit A: c.WeakTypeTag[A]) = {
    import c.universe._

    c.Expr[A with Bar](q"new $A with Bar")
  }
}

这将按预期工作,并且如果您尝试实例化没有无参数构造函数的类,则会在编译时失败。

我用过准引号 http://docs.scala-lang.org/overviews/macros/quasiquotes.html为了清楚起见,您可以在这里手动构建树,但需要做更多的工作。不过,现在 quasiquotes 可作为 Scala 2.10 的插件使用,但实际上并没有什么充分的理由。

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

使用 Scala 宏或反射实例化类 的相关文章

随机推荐

  • 如何防止TFS 2013锁定二进制文件?

    我们将 TFS 2013 与 Visual Studio 2013 结合使用 并使用门控签入 通过门控签入 不可能在本地保留待处理的更改 如果其中一个文件被锁定 http www neovolve com 2011 07 18 unable
  • 如何使用 Materialise 创建具有居中对齐链接的导航栏?

    我正在尝试使用 Materialise 构建一个顶部有导航栏的 1 页垂直滚动网站 现在 Materialize 仅具有用于向左或向右对齐链接的类 徽标可以居中对齐 但不能居中对齐链接本身 我一直在向 UL 和包装 div 添加中心对齐和中
  • 在 QComboBox 中显示项目,但不在其弹出列表中显示项目

    我有一些代码使用组合框来显示产品列表 我想在组合框中显示 选择产品 products Select product 223 51443 7335 但我不希望用户能够选择 选择产品 项 我只是想让用户知道这个组合框是用来选择产品的 我不想使用
  • Java 泛型与类和接口 - 一起

    我想要一个 Class 对象 但我想强制它代表的任何类扩展类 A 并实现接口 B 我可以 Class
  • Yii2:如何在CheckboxList中显示选中的值

    我想在 Yii 2 0 的复选框列表中显示选中的值 以下是我的代码 主阵
  • 如何在同一线程中创建JFrame以使其阻塞?

    出于调试目的 我需要在一个简单的窗口中在屏幕上绘制图像 Swing 在单独的消息循环线程中处理所有事件 这意味着如果我执行以下操作 while true Get screenshot BufferedImage screenshot MSW
  • 带有变量 bash 的降序循环

    cat fromhere sh bin bash FROMHERE 10 for i in seq FROMHERE 1 do echo i done sh fromhere sh 为什么不起作用 我找不到任何在谷歌中搜索降序循环的示例 甚
  • Rplotly:悬停时显示图像

    我正在尝试重现this https plotly r com interactives tooltip image html显示数据点悬停图像的简单绘图 代码可用here https plotly r com supplying custo
  • 使用谷歌分析处理带有哈希#的网址

    我正在使用 javascript 客户端 mvc 开发一个 js 单页 Web 应用程序 在本例中为 angular js 我在网站上添加了谷歌分析 但从目前我所看到的 至少是实时的 来看 谷歌没有考虑哈希后的 uri 部分 那就是我有一个
  • 无法找到请求目标的有效证书路径 - java

    我正在尝试使用连接到网站Http客户端 http hc apache org httpcomponents client 4 3 x httpclient apidocs org apache http impl client Defaul
  • Spring Cloud Feign 非阻塞 I/O 或异步调用

    我正在使用 Spring 云平台开发微服务 其中 service1 调用多个其他微服务 例如service2 service3 service 4 等 这些服务可以并行调用 service1 将聚合结果 我可以使用Spring cloud
  • 适用于 Windows 的 php-fpm?

    PHP FPM 的主页http php fpm org http php fpm org 声明它是 PHP 5 3 3 以来 PHP 的一部分 现在 我想知道 当我从 php net 下载最新的 PHP 二进制文件时 其中没有 php fp
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • 带种子的范围内的随机数

    我一直在努力解决这个问题 但似乎找不到简单的解决方案 我有一个动态网格布局 文章放置在网格上但具有不同的宽度和高度 这些不同文章的宽度和高度可以在访问网站时发生变化 但只有在添加新文章时才会发生变化 问题是我有使用的逻辑mt rand要生成
  • VB.NET 中的类型比较

    如何比较 VB NET 中的类型数据类型 我的代码 Private Function Equal ByVal parameter As String ByVal paramenterName As String ByVal dataType
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • ADO 实体框架创建不需要的实体键

    我需要使用无法更改的数据库中的表 使用链接服务器 因此 我的架构的一部分是这些表的视图 我无法在数据库中创建 FK 当我在 ADO NET 实体框架中创建关联时 我遇到了问题 因为外部数据库表上的第二列有一个索引 并且 EF 正在为其创建一
  • 如何使用 SwiftUI 创建自定义滑块?

    我可以使用 SwiftUI 创建滑块 但无法更改滑块的样式 如下图所示 问题 我无法在 SwiftUI 中找到任何选项来更改滑块样式 注意 我想仅使用 SwiftUI 创建它 我已经在 Swift 中使用 创建了这个滑块 https git
  • Chef 节点 - 检查菜谱是否会在其上运行,并查看内部角色

    我想知道特定的配方是否会在不同配方内部的节点上运行 我可以使用 node recipe recipe name 方法 但是我的一些食谱是由角色和食谱管理的 似乎没有查看角色运行列表 有没有一种简单的方法可以确定我的 recipie redi
  • 使用 Scala 宏或反射实例化类

    在我的 scala 代码中 我希望能够实例化一个新类 例如 假设我有以下代码 class Foo def foo 10 trait Bar val bar 20 理想情况下 我希望能够做类似的事情 def newInstance A lt