scala - 用 Scala 宏替换类实现

标签 scala macros

如果库不存在,我必须实现一个宏,它将一个类的实现替换为另一个实现的类。原因是用户可能不愿意安装复杂的库(比如名称是 complex.jar)。代码 非常重要编译 即使图书馆不存在。

实际例子:
想想例如一种计算复杂数学函数的工具。让我们假设我们现在想要添加绘制结果的功能。为此,我们使用 Matlab(我知道还有其他的,这只是一个示例)。让我们假设 Matlab 有一个 jar 文件。由于并非所有用户都安装了 Matlab,我希望我的代码也可以在没有这个 jar 的情况下编译,尽管它使用了这个 jar 中的方法。

例子:

@ReplaceMeIfLibDoesNotExist("complex","DefaultConnector.scala")
class ComplexConnector{
   import complex._;
   def connect(){
      complex = new ComplexLibrary(); // part of complex.jar
   }
}

class DefaultConnector{
   def connect(){
      println("Currently not supported. Install complex.jar")
   }
}

这样的东西会起作用吗?宏实现会是什么样子?还是有一些更优雅的方式来做这样的事情?有一个具体的代码示例会很好。

非常感谢您提前。

最佳答案

我认为宏不适合这种情况-宏在编译时起作用,而听起来您想根据运行时可用的库来更改功能。我会建议一些类似于 SLF4J 的静态绑定(bind)方法的方法 - 通过静态方法加载 ComplexLibrary,该方法在您的 connector-complex.jar 中与您的基本 jar 不同。

关于scala - 用 Scala 宏替换类实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22690947/

相关文章:

Scala Spark - 处理层次结构数据表

scala - Scala XML 属性的空检查

c++ - 宏 C/C++ 的奇怪行为

scala - 如何在Scala控制台中使用宏?

rust - 检查宏中定义的项目中的功能标志

scala - 循环遍历Scala中包中的每个类

scala - 为什么sparkcontext停止了?

Scala:在for循环中索​​引Seq而不是List

macros - 使用 `once-only`宏

macros - 为什么我们修改它时需要重新编译使用Common Lisp宏的定义?