我想知道在Scala中是否有一种条件性地排除代码块不被编译的方式,使用编译时标志(即C家族的#define的某种粗略等价物)。我知道没有直接的对应物,并且我认为Scala的宏也不是我需要的,所以我想知道是否有另一种方法来实现这一点。
具体来说,在我的当前情况下(我提供这个只是作为一个例子,因为我过去也遇到了类似的问题),我正在构建一个ScalaJS库。该库是一个前端组件,主要将被我的应用程序使用——该应用程序也使用ScalaJS。但是,我希望允许该组件在其他未使用ScalaJS的项目中由本机JavaScript调用。因此,我希望有一个用户可配置的标志,可以根据请求切换将符号导出到本机JavaScript。
在我的应用程序中,默认情况下不导出这些标志是没有意义的,因为唯一调用它的其他代码将是其他ScalaJS代码,因此导出符号的开销是毫无意义的。为如此微不足道的事情维护两个单独的代码分支也似乎是徒劳的。
这基本上是我所想的(当然是伪代码):
我很清楚地知道这里没有预处理程序,上面的代码只是伪代码。我只是想知道是否有一种类似的实现方式,而不需要像使用反射那样产生不必要的开销(因为我确定这会比默认导出提供更大的性能损失)。
此外,我找到了这个问题:Scala中的条件编译。但那不是我需要的。
具体来说,在我的当前情况下(我提供这个只是作为一个例子,因为我过去也遇到了类似的问题),我正在构建一个ScalaJS库。该库是一个前端组件,主要将被我的应用程序使用——该应用程序也使用ScalaJS。但是,我希望允许该组件在其他未使用ScalaJS的项目中由本机JavaScript调用。因此,我希望有一个用户可配置的标志,可以根据请求切换将符号导出到本机JavaScript。
在我的应用程序中,默认情况下不导出这些标志是没有意义的,因为唯一调用它的其他代码将是其他ScalaJS代码,因此导出符号的开销是毫无意义的。为如此微不足道的事情维护两个单独的代码分支也似乎是徒劳的。
这基本上是我所想的(当然是伪代码):
...
#if JS_EXPORT
@JSExport
#endif
case class componentProps(
#if JS_EXPORT
@(JSExport @field)
#endif
val propertyOne: Int
#if JS_EXPORT
@(JSExport @field)
#endif
val propertyTwo: String
)
...
我很清楚地知道这里没有预处理程序,上面的代码只是伪代码。我只是想知道是否有一种类似的实现方式,而不需要像使用反射那样产生不必要的开销(因为我确定这会比默认导出提供更大的性能损失)。
此外,我找到了这个问题:Scala中的条件编译。但那不是我需要的。
sourceGenerator
来构建自己的简单预处理器。 - sjrd#default
有所不同:https://dev59.com/rWoy5IYBdhLWcg3wsP_Q - 余杰水