如果库不存在,我必须实现一个宏,它将一个类的实现替换为另一个实现的类。原因是用户可能不愿意安装复杂的库(比如名称是 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/