【发布时间】:2016-03-10 20:10:06
【问题描述】:
我想知道是否有一种方法可以使用编译时标志(即 C 系列的 #define 的一些粗略等价物)有条件地排除在 Scala 中编译的代码块。我知道没有直接对应物,而且我不认为 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
)
...
我很清楚没有预处理器,以上内容仅用作伪代码。我只是想知道是否有一种方法可以完成类似的事情,而无需使用反射等不必要的开销(因为我确信这会比默认导出提供更大的性能影响)。
另外,我找到了这个问题:Conditional compilation in Scala。但这不是我需要的。
【问题讨论】:
-
您可以构建自己的简单预处理器作为 sbt
sourceGenerator。 -
@sjrd 这将是一个有趣的项目,作为我深入了解 Scala 的一种方式。然而,这个问题也是为了衡量对这样的事情的普遍看法,并确保在想要这样一个功能时我自己的想法没有问题(即也许我误解了一些东西),因为对我来说这是一个不费吹灰之力的事情.你认为这样的事情会有兴趣吗?
-
也许你尝试使用elidable,虽然有一些不同
#default:stackoverflow.com/questions/8388952/…
标签: scala compilation conditional-compilation scala-macros scala.js