【问题标题】:In Scala.JS is there a call to get the platform I'm running on?在 Scala.JS 中是否有调用来获取我正在运行的平台?
【发布时间】:2017-12-15 04:19:04
【问题描述】:

我有一些 Scala 代码用于我为 JVM 和 ScalaJS 编译的库。

现在我有一个“纯”项目,在 js 和 jvm 项目中没有特殊代码,由于 intellij 集成和其他一些因素,我想保持这种方式。

但是,我确实有一小段代码(1-2 行)需要根据我是在 JVM 还是 JS 中进行更改。我想要一种不需要更改整个项目结构的简单方法。

基本上我想要一个调用“isJS”,如果我在 JavaScript 上返回 true,否则返回 false。

【问题讨论】:

    标签: scala.js


    【解决方案1】:

    没有任何标准,因为它需要扩展 JVM 上可用的 API,而 Scala.js 无法做到。

    您可以在js/jvm/ 子项目中使用两个不同实现的小型object Platform 轻松地自己构建它。例如对于 JS,它将是:

    object Platform {
      final val isJS = true
      final val isJVM = false
    }
    

    当然,这要求是非纯的。您也可以在仅提供该功能的小型库中将其抽象化。例如,catalystsplatform 项目就是这样做的。

    如果你想保持完全纯净并且没有依赖,你必须求助于黑客:

    val isJS = 1.0.toString == "1"
    

    这是有效的,因为在 JVM 上,1.0.toString 返回 "1.0",但在 JS 上返回 "1"

    【讨论】:

    • 谢谢,toString hack 正是我想要的。如果我最终需要更多,我会去改变我的项目结构,但这对于我现在需要的小东西来说是完美的。
    【解决方案2】:

    你可以这样做:

    val isJS = System.getProperty("java.vm.name") == "Scala.js"
    

    【讨论】:

    • 虽然这是一种简单可靠的方法,但请记住,它会在代码大小上花费很多,因为它会将 java.util 包的重要部分带入您的 . .js 文件。 (如果你已经在其他地方使用了java.util.Maps,这没什么大不了的,否则它会产生很大的不同)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多