В Scala.JS есть вызов, чтобы получить платформу, на которой я работаю?

У меня есть некоторый код Scala для библиотеки, который я компилирую для JVM и ScalaJS.

Прямо сейчас у меня есть "чистый" проект без специального кода в проектах js и jvm, и я бы хотел сохранить его таким образом из-за интеграции intellij и некоторых других факторов.

Тем не менее, у меня есть небольшой кусочек кода (1-2 строки), который нужно изменить в зависимости от того, нахожусь ли я в JVM или JS. Я бы хотел простой способ сделать это, не требуя изменения всей структуры моего проекта.

По сути, я хотел бы вызвать isJS, который возвращает true, если я использую JavaScript, и false в противном случае.

2 ответа

Решение

Нет ничего стандартного, так как для этого потребуется расширить API, доступный в JVM, чего не может сделать Scala.js.

Вы можете создать его самостоятельно с помощью крошечного object Platform с двумя различными реализациями в js/ а также jvm/ подпроекты. Например, для JS это будет:

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

Конечно, это должно быть не чисто. Вы также можете абстрагировать это в крошечной библиотеке, предлагающей только эту функцию. Это то, что platform проект катализаторов делает, например.

Если вы хотите сохранить чистоту и отсутствие зависимости, вы должны прибегнуть к хаку:

val isJS = 1.0.toString == "1"

Это работает, потому что на JVM 1.0.toString возвращается "1.0", но на JS возвращается "1",

Ты можешь сделать:

val isJS = System.getProperty("java.vm.name") == "Scala.js"
Другие вопросы по тегам