Scala 与 Java toUpperCase/toLowerCase

Scala vs Java toUpperCase/toLowerCase

Scala 借用 Java String methods like toUpperCase/toLowerCase.

但是,这样做的方式不是很一致:

如何在 Scala 中实现不区分大小写的转换 JVM/JS?

我想了几个办法,都一样丑:

方法一:我自己实现

为英文字母的 26 个 ASCII 字符实现我自己的 toUpperCase

方法 1.1:我自己使用 Scala 字符实现

基本相同,但至少重用 Scala toUpper 来转换单个字符。

方法二:接口

实现类似

trait CaseChangeOps {
  def toUpperCase(s: String): String
}

object Main {
  var caseChanger: CaseChanger
}

// whenever I want to use it, do it like that:
Main.caseChanger.toUpperCase("like this") // => "LIKE THIS"

在共享代码中,然后在JS中有:

object CaseChangerJs {
  def toUpperCase(s: String): String = s.toUpperCase
}

object MainJs {
  Main.caseChanger = CaseChangerJs
}

... 在 JVM 中:

object CaseChangerJvm {
  def toUpperCase(s: String): String = s.toUpperCase(Locale.ROOT)
}

object MainJvm {
  Main.caseChanger = CaseChangerJvm
}

方法三:自带scala-java-locales

有一个独特的第 3 方库 scala-java-locales,它被列为与 ScalaJS 兼容,可用于增强 ScalaJS。

不过看起来有点矫枉过正,因为我实际上只需要 locale-insensitive 大小写转换,而不是所有可能的语言环境的全部内容。

有更好的主意吗?

标准方法与您的方法 2 很接近,但要简单得多。在共享代码中,您只需调用

Platform.toUpperLocaleInsensitive(string)

在 JVM 和 JS 上有不同的实现:

// JVM
object Platform {
  def toUpperLocaleInsensitive(s: String) = s.toUpperCase(Locale.ROOT)

  // other methods with different implementations
}

// JS
object Platform {
  def toUpperLocaleInsensitive(s: String) = s.toUpperCase()

  // other methods with different implementations
}

参见Hands-on Scala.js中对类似案例的描述。

之所以可行,是因为共享代码不需要自行编译,只需与特定于平台的代码一起编译即可。