gpt4 book ai didi

Scala.js 平台依赖方法实现(或依赖注入(inject))

转载 作者:行者123 更新时间:2023-12-02 00:48:55 24 4
gpt4 key购买 nike

tl;dr:像 scalajs-java-time 这样的库如何替换依赖项?

我用 Scala.js 遇到了这种依赖注入(inject):

在共享代码中:

object Example {
def method(...) = { ... dependsOnPlatform ... }
val dependsOnPlatform = ???
}

这样做的天真方法是:

val dependsOnPlatform = if(onJS) jsImplementation else jvmImplementaion

问题是人们常常无法为 JVM 编译 jsImplementation,因为它依赖于 Scala.js 类;如果使用反射或引用 Java 类,则可能无法完成 jvmImplementaionfastOptJS

鉴于 object Example 必须是静态的,因此不能使用构造函数注入(inject)。

用反射很容易解决问题,但在 Scala.js 中也是不允许的。
它可以通过副作用来解决,但由于对象是静态的,那将是脆弱的。
依赖项可以是 method 的隐式参数,但这需要额外的导入。
这不是宏可以在不复杂构建过程的情况下解决的问题。

最佳答案

推荐的解决方案是使用在 js/src/ 中与在 jvm/src/ 中实现不同的顶层对象,但暴露相同的接口(interface)给两个都。然后可以从 shared/src/ 代码中正常使用该对象的 API。此对象通常称为 Platform 并设为包私有(private)。

js/src/.../Platform.scala

package foo

private[foo] object Platform {
def dependsOnPlatform(...) = {
jsImplementation
}
}

jvm/src/.../Platform.scala

package foo

private[foo] object Platform {
def dependsOnPlatform(...) = {
jvmImplementation
}
}

shared/src/.../Platform.scala

package foo

object Example {
def method(...) = {
...
Platform.dependsOnPlatform(...)
...
}
}

如@acdenh 的回答所述,无需使用丑陋的“隐藏”hack 也无需编写 .java 源文件。

关于Scala.js 平台依赖方法实现(或依赖注入(inject)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41686876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com