首页 > 解决方案 > Scala vs Java toUpperCase/toLowerCase

问题描述

Scala 借用了 Java String方法,例如toUpperCase / toLowerCase

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

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

我可以想到几种方法,所有方法都很丑:

方法一:我自己的实现

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

方法 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

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

不过,这看起来像是一个巨大的矫枉过正,因为我实际上只需要不区分区域设置的大小写转换,而不是所有可能的区域设置的全部内容。

有更好的想法吗?

标签: javascalalocalecase-sensitivescala.js

解决方案


标准方法接近您的方法 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中对类似案例的描述。

这是有效的,因为共享代码不需要自己编译,只需要与特定于平台的代码一起编译。


推荐阅读