【问题标题】:Conditional compilation of code blocks in ScalaScala中代码块的条件编译
【发布时间】: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


【解决方案1】:

对于您的特定情况,您不需要特定的源代码来执行此操作:Scala.js 提供了scalajs-stubs 库。这是一个针对 JVM 的库,其中包含 Scala.js 注释的存根注释(@JSExport 等)。

您可以将它作为“提供”的依赖项添加到您的 JVM 项目中,因此在运行时不需要它:

libraryDependencies +=
  "org.scala-js" %% "scalajs-stubs" % scalaJSVersion % "provided"

请注意,注释不是静态的,即它们甚至不会出现在 .class 文件中。

有关scala-js.org(页面底部)的更多详细信息。

【讨论】:

  • 谢谢!这有助于了解,但与我的案例没有直接关系,因为我的项目不是双目标 ScalaJS/JVM;相反,它是 ScalaJS 的两个版本(一个用于导出以供原始 Javascript 使用,一个供其他 ScalaJS 代码使用)。
【解决方案2】:

在源代码中没有任何方法不是完整的破解方法。

实现双JVM/JS项目的标准方法是尽量减少出现差异的源文件数量,并为那些手工完成(几乎所有李浩毅的项目都是这样的--查看结构例如快速解析);或者拥有两个具有两个变体的 git 分支并将所有更改从一个合并到另一个。

【讨论】:

  • 这是我害怕听到的。我真的很惊讶没有人为 Scala 提供预处理器,特别是因为 Scala 为每个可以想象的用例提供了如此多的特性,但是一个非常基本的特性(并且适用于相当多的用例) ,尤其是桌面应用程序)丢失。除非是我错过了什么。然而,这样的事情至少可以作为 sbt 任务使用,这似乎很自然。
  • 最小化平台特定代码存在的位置/源文件的数量通常是一个好习惯,完全独立于 Scala.js =)
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
相关资源
最近更新 更多